【问题标题】:Is it Possible to Enforce Read-Only Fields in SQL Server 2008 R2?是否可以在 SQL Server 2008 R2 中强制执行只读字段?
【发布时间】:2010-12-21 18:16:08
【问题描述】:

我想防止 UPDATE 查询覆盖我数据库中的某些字段。我还想防止对某些表进行任何类型的 UPDATE 或 DELETE 查询,因为这些表包含需要无限期保留的永久信息。

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

【问题讨论】:

    标签: sql sql-server database persistence readonly


    【解决方案1】:

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

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

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

    【讨论】:

    • 对于整个表有一个更有效的方法:将所有 R/O 文件移动到一个单独的文件组中,然后将文件组标记为只读:ALTER DATABASE ... MODIFY FILEGROUP ... READ_ONLY
    • @Stephanie Page:是的,当然 - ALTER DATABASE ... MODIFY FILEGROUP ... READWRITE
    • 只是想澄清一下,因为他需要的是大多数情况下是只读的......但偶尔,我确信管理员需要添加值。即使是美国各州的表格也可能有一天需要添加第 51 个。
    【解决方案2】:
    1. 删除只读表的所有权限。那时没有人可以进行更改

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

    3. 查看 marc_s 的回答

    如果您的用户以 dbo 或 sa 身份连接,那么您无能为力。用户可以禁用 trigegr 或删除它们。无论如何都不会检查 sa 权限。

    【讨论】:

      【解决方案3】:

      @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 提供的答案,这只是该答案的额外内容

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多