添加约束或以其他方式阻止删除SQL DB表中的记录

时间:2010-12-15 22:42:17

标签: sql sql-server tsql

我在SQL Server数据库中有一个表,其中包含一个我永远不想删除的行。这是应用程序按设计工作所需的行。

有没有办法向该行添加约束以防止被删除?或者另一种处理这种情况的方法?

3 个答案:

答案 0 :(得分:3)

如果你想阻止意外删除,那么你可以有一个虚拟表,用ON DELETE NO ACTION向你的表中声明一个外键,并在其中添加一行与外键匹配你的'宝贵'行主键。这样,如果删除“父”行,引擎将拒绝并引发错误。

如果要防止故意删除,则应依赖安全性(拒绝表中的DELETE权限)。当然,拥有所需权限的特权用户可以删除该行,无法可以阻止该行,也不应该尝试。由于SQL Server不支持行级安全性,如果您只需要拒绝某些行,那么您必须返回到绘图范围并更改表格布局,以便所有必须拒绝的行都是存储在一个表中,允许删除的行存储在不同的表中。

其他解决方案(如触发器)最终将成为这些主题的变体,您真正必须解决的问题是您是想要防止意外删除(可解决)还是故意删除(无法解决,他们的数据库,不是你的。)

答案 1 :(得分:3)

这是一个使用FOR DELETE触发器来阻止在满足某个条件时删除行的示例:

CREATE TRIGGER KeepImportantRow ON MyTable
  FOR DELETE
AS BEGIN
    -- This next line assumes that your important table has a
    -- column called id, and your important row has an id of 0.
    -- Adjust accordingly for your situation.
    IF DELETED.id = 0 BEGIN
        RAISERROR('Cannot delete important row!', 16, 1)
        ROLLBACK TRAN
    END
END

答案 2 :(得分:1)

你可以通过多种方式实现,但这取决于具体情况。

如果表只包含该行,请不要授予删除/截断权限。

如果表中还包含其他行,则可以使用删除前触发器。

您将遇到的一个问题是,拥有DBA / SA访问数据库的人可以随心所欲地处理您放入的任何内容,如果他们愿意,那么您正在尝试防范,临时用户或任何人。