【发布时间】:2010-12-21 18:16:08
【问题描述】:
我想防止 UPDATE 查询覆盖我数据库中的某些字段。我还想防止对某些表进行任何类型的 UPDATE 或 DELETE 查询,因为这些表包含需要无限期保留的永久信息。
这些配置可以在 SQL Server Management Studio 中实现吗?
【问题讨论】:
标签: sql sql-server database persistence readonly
我想防止 UPDATE 查询覆盖我数据库中的某些字段。我还想防止对某些表进行任何类型的 UPDATE 或 DELETE 查询,因为这些表包含需要无限期保留的永久信息。
这些配置可以在 SQL Server Management Studio 中实现吗?
【问题讨论】:
标签: sql sql-server database persistence readonly
为了防止某些字段的更新,您可能必须在该表上设置一个 AFTER UPDATE 触发器,以检查是否有任何“只读”字段即将更新;如果是,则中止交易。
CREATE TRIGGER triggerName
ON dbo.YourTable AFTER UPDATE
AS
IF UPDATE(somefield)
ROLLBACK TRANSACTION
要防止某些用户访问某些表,请不要授予这些用户(或他们所属的数据库角色)对这些表的 UPDATE 和/或 DELETE 权限。
【讨论】:
ALTER DATABASE ... MODIFY FILEGROUP ... READ_ONLY。
ALTER DATABASE ... MODIFY FILEGROUP ... READWRITE
删除只读表的所有权限。那时没有人可以进行更改
考虑存储过程或视图来控制写入,再次删除直接权限
查看 marc_s 的回答
如果您的用户以 dbo 或 sa 身份连接,那么您无能为力。用户可以禁用 trigegr 或删除它们。无论如何都不会检查 sa 权限。
【讨论】:
@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 提供的答案,这只是该答案的额外内容
【讨论】: