禁用SQL Server中的表的DELETE

时间:2014-05-19 10:02:45

标签: sql sql-server

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

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

3 个答案:

答案 0 :(得分:1)

如果只通过应用程序访问该表,则可以使用软删除,为表单添加一列,例如IsDeleted,并在软件中检查该行是否为生活或删除。

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

答案 1 :(得分:1)

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

  • Deny object permissions。例如:DENY DELETE ON OBJECT::dbo.Customer TO db_datawriter;
  • triggerCREATE TRIGGER nodelete1 ON dbo.Customer INSTEAD OF DELETE AS RAISERROR('You can't delete from this table', 16, 10)
  • 中引发错误
  • 依靠referential integrity没有级联更新/删除。请注意,如果客户至少有一个订单,这只会阻止客户被删除。

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

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

答案 2 :(得分:0)

我可以在要禁用删除的每个表上使用简单的触发器来完成

Create Trigger [dbo].[RollBackDelete]
     ON [dbo].[Your Table Name]
INSTEAD OF DELETE 
AS
BEGIN
ROLLBACK;
END

当然,如果您有任何键在删除或更新时具有级联操作,则无法使用,应将其设置为“无操作”

我希望这会有用