【发布时间】:2014-09-23 14:39:38
【问题描述】:
当一个项目应该从数据库中删除时,我正在执行逻辑删除。
我在每个需要执行逻辑删除的表中添加了一个额外的DateTime 列。因此,在删除时,您只需更新字段,例如...
UPDATE Client
SET deleted = GETDATE()
WHERE Client.CID = @cid
以后如果应该恢复的话……
UPDATE Client
SET deleted = NULL
WHERE Client.CID = @cid
所以典型的选择语句看起来像......
SELECT *
FROM client
WHERE CID = @cid AND deleted IS NULL
但问题是如何处理依赖关系以在这种方法中保持数据库的一致性。例如。在删除(实际更新)员工之前,我必须做几项检查,例如查看与被删除员工有关的相关表格中是否有任何相关的出勤/银行账户/工资数据/历史等。
那么做这些事情的正常做法是什么?我需要检查所有的东西吗
IF EXISTS (SELECT...)
声明?
编辑:
如果我想在有相关记录时阻止更新,我可以使用 UNION 执行类似的操作...
IF NOT EXISTS (SELECT emp_id FROM BankAccount WHERE emp_id = '100' UNION SELECT EID FROM Attendance WHERE EID = '100' UNION SELECT employee_id FROM SalaryTrans WHERE employee_id = '100')
UPDATE Employee SET Employee.deleted = GETDATE() WHERE emp_id = '100'
这是一个可以接受的解决方案吗?
【问题讨论】:
-
如果其他表中有相关记录,是否要防止删除?还是要级联删除?
-
@Aheho,我只想在大多数情况下防止删除。例如。谈到员工和薪水。
标签: sql sql-server database relationship