如何防止删除子记录

时间:2014-10-30 13:10:59

标签: sql-server

删除主记录时,将触发级联触发器并删除子表中的记录。 而且我无法从表中手动删除记录,因为它与子表有外键关系。

但是如何防止从表中手动删除子记录。目前,我可以手动删除子记录和页面加载,因为子记录丢失且页面加载失败。

2 个答案:

答案 0 :(得分:1)

我有点不清楚你为什么要做这样的事情。除了级联删除之外,您根本不允许删除UI上的子记录 - 只是不要给用户选项。

如果你担心一些随机的DBA进入你的数据库并写下:

delete from childTable where parentId = 5 -- or whatever

然后我认为您还有更多需要担心的事情......例如,为什么拥有生产数据库写访问权限的人甚至考虑在您的prod数据库上手动编写和执行此类语句。

如果你仍然真的需要做这样的事情。您可以在所有子表上编写一个删除前触发器,以确保在删除之前父表中不存在parentId。这将可能导致您的级联删除失败(我猜),因此您需要更新级联删除功能以在删除之前禁用触发器,之后重新启用触发器。但这不会阻止你的“随机dba”通过禁用触发器,删除记录和重新启用来做类似的事情。

如果您提供有关“手动”删除子记录的具体方案的更多信息,可能会提供更多信息。

答案 1 :(得分:1)

我不确定从这个表中手动删除记录的人或者是什么,但我倾向于使用 DENY 权限来满足此要求,并确保其中的所有角色数据库对该表没有delete权限。

示例脚本:

USE [YOUR_DB]
GO
DENY DELETE ON [dbo].[YOUR_TABLE] TO [DOMAIN\user]
GO

[dbo]替换为相关架构名称,并将[DOMAIN\user]替换为相关用户。