我在SQL Server数据库中有一个表,其中包含一个我永远不想删除的行。这是应用程序按设计工作所需的行。
有没有办法向该行添加约束以防止被删除?或者另一种处理这种情况的方法?
答案 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访问数据库的人可以随心所欲地处理您放入的任何内容,如果他们愿意,那么您正在尝试防范,临时用户或任何人。