2014-10-30 111 views
-1

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

但是,我怎样才能防止从表中手动删除子记录。目前,我可以手动删除子页记录,并在页面加载时删除子记录,页面加载失败。

回答

1

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

如果你担心一些随机的DBA会在你的数据库和写作:

delete from childTable where parentId = 5 -- or whatever 

那么我认为你有更多的事情需要担心......比如为什么人们生产数据库的写访问甚至考虑在您的prod数据库上手动编写和执行诸如此类的语句。

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

如果您提供更多关于儿童记录为什么“手动”被删除的特定情况的信息,可能会提供更多信息。

+0

我想你误解了这个问题。 OP希望只允许通过CASCADE删除删除子记录,并防止单独删除子记录。 – 2014-10-30 13:22:35

+0

管理员可以通过管理工作室意外删除子记录。如果我们禁用触发器,其他同时工作的用户将无法使用触发器。 – user1921730 2014-10-30 16:15:07

+0

管理员也可能通过管理工作室意外删除数据库中的所有表。这是对生产数据库中的任何人员授予dbo权限的风险。我不太确定你希望在不限制用户访问数据库的情况下实现的目标。 – Kritner 2014-10-30 16:31:08

1

我不知道谁或什么会手动从该表中删除记录,但我会向精益使用DENY权限这一要求,并确保数据库上的所有角色都在该表中没有delete权限。

示例脚本:

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

更换[dbo]相关架构名称,并与相关用户更换[DOMAIN\user]

+0

谢谢Tanner。但是当删除主表中相应的记录时,我需要删除子表中的记录。即,当删除主表中的记录时,级联删除触发器将被触发以从子表中删除记录。在这种情况下,如果我们应用拒绝删除级联删除将失败或不。 – user1921730 2014-10-30 14:27:06

+1

究竟是谁在担心“手动”删除记录?你的应用程序或域用户? – Kritner 2014-10-30 14:37:11

+1

@ user1921730,以便应用程序或您的系统管理员用户有权根据需要删除记录,但任何其他用户都具有此DENY权限。因此,您担心的任何随机用户都无法从子表中删除记录。如果这个问题还有更多的问题,请更新您的问题与场景和更多细节来澄清事情。 – Tanner 2014-10-30 14:44:28