是否可以在SQL Server 2008 R2中强制执行只读字段?

时间:2010-12-21 18:16:08

标签: sql sql-server database persistence readonly

我想阻止在我的数据库中写入ceartain字段的UPDATE查询。我还想在某些表上防止任何类型的UPDATE或DELETE查询,因为这些表包含需要无限期持久化的永久信息。

这些配置可以在SQL Server Management Studio中实现吗?

3 个答案:

答案 0 :(得分:8)

为了防止某些字段的更新,您可能必须在该表上有一个AFTER UPDATE触发器,用于检查是否有任何“只读”字段即将更新;如果是,则中止交易。

CREATE TRIGGER triggerName
ON dbo.YourTable AFTER UPDATE
AS
   IF UPDATE(somefield)
      ROLLBACK TRANSACTION

要防止某些用户访问某些表,只是不要授予这些用户(或他们所属的数据库角色)对这些表的UPDATE和/或DELETE权限。

答案 1 :(得分:4)

  1. 删除只读表的所有权限。没有人可以做出改变

  2. 考虑存储过程或视图来控制写入,再次删除直接权限

  3. 请参阅marc_s answer

  4. 如果您的用户以dbo或sa连接,那么您无法做任何有效的事情。用户可以禁用trigegrs或删除它们。无论如何都不会检查sa权限。

答案 2 :(得分:1)

@marc_s是正确的,如果你想阻止某些字段的更改,你应该使用触发器或限制用户的权限,如果你是dba。在任何情况下,我都会使用INSTEAD OF触发器而不是AFTER触发器,因此没有必要回滚事务。

CREATE TRIGGER triggerName 
ON dbo.YourTable INSTEAD OF UPDATE, INSERT 
AS    
IF UPDATE(somefield)       
    -- do nothing or whatever

在任何情况下,如果你发现这个答案是正确的,请接受@marc_s提供的答案,这只是答案的一部分