对 SQL Server 中的表禁用 DELETE

use*_*342 5 sql sql-server

我目前正在为大学课程的订单管理系统中的客户创建表格。该系统依赖于能够为客户检索订单历史。由于我们选择不将它们存储在单独的表中,因此删除从客户表中删除行的选项至关重要。

我如何以及在哪里在CREATE声明中设置它?我怀疑我必须创建一个关于应该发生什么的规则,但我不完全确定具体细节。

Dan*_*Dan 6

在 SQL Server 上,您有以下选项:

  • 拒绝对象权限。例如:DENY DELETE ON OBJECT::dbo.Customer TO db_datawriter;
  • 在触发器中引发错误:CREATE TRIGGER nodelete1 ON dbo.Customer INSTEAD OF DELETE AS RAISERROR('You can''t delete from this table', 16, 10)
  • 依赖引用完整性,无需级联更新/删除。请注意,只有当客户至少有 1 个订单时,这才会阻止删除该客户。

然而,以我诚实的观点,我认为这应该在应用程序级别而不是数据库级别解决。即使使用上述技术,什么会阻止某人在删除记录之前简单地删除触发器或授予必要的权限?或者干脆删除整个表?

如果您不希望用户从表中删除记录,只需确保您的应用程序不允许他们这样做。任何直接使用数据库的人都应该知道发出 DELETE 语句可能很危险 - 特别是如果您没有备份。

  • 存在约束是一个共同特征。在大多数现代数据库中,插入、更新和删除都受到限制。类似于唯一列约束。原因:您可能不拥有破坏性的应用程序。 (4认同)

Ser*_*ton 1

如果仅通过应用程序访问表,则可以使用软删除,例如向表中添加一列,IsDeleted然后在软件中检查该行以查看该行是活动的还是已删除。

如果最终用户可以访问数据库,您可以更改他/她的登录名或组权限以删除对该表的删除授权。