不可变的SQL列

Ben*_*her 9 sql sql-server ddl sql-server-2008

是否可以immutable在MSSQL中标记列?

似乎它将是一个有用的DDL功能; 一旦在一行中设置了一个值('row'被定义为主键的特定值关系),如果没有删除该行,则无法更改它.

显然(像大多数事情一样)这在应用程序层中是可行的,但SQL DDL的一半乐趣是错误检查应用程序代码.

a_h*_*ame 12

如果执行DML的用户不是对象的所有者而不是数据库本身中的"db_owner",则只能授予"insert"权限,但不能为该表授予更新权限:

假设有一张桌子 id, col1, col2

grant insert, select, delete on the_table to the_user;
grant update (id, col2) on the_table to the_user;
Run Code Online (Sandbox Code Playgroud)

通过这些授权,the_user可以为所有三列插入行和供应值.他也可以更新idcol2列,但不能更新col1列.

db_owner(可能还有表的创建者/所有者)总是可以更新所有列.我不知道是否有办法从这些rolws中撤销该特权.


Ode*_*ded 6

不,SQL Server中没有这样的功能.

我能想到的最接近的是表上的更新触发器,它检查特定列中的值是否INSERTEDDELETED逻辑表相同,并拒绝更改的行的更新.


jar*_*ics 5

使用这样的UPDATE TRIGGER是可能的:

CREATE TRIGGER trgAfterUpdateAsset ON dbo.Asset
FOR UPDATE AS
IF UPDATE(AssetTypeID) AND EXISTS (SELECT * FROM inserted i JOIN deleted d ON i.ID = d.ID WHERE i.AssetTypeID <> d.AssetTypeID)
BEGIN 
    RAISERROR ('AssetTypeID cannot change.', 16, 1);
    ROLLBACK TRAN
END     
Run Code Online (Sandbox Code Playgroud)

(注意:该表有一个主键列,称为ID)。

如果AssetTypeID的值更改,我只会拒绝更新。因此,该列可能存在于更新中,并且如果指定了旧值,则该列将通过。(我需要这样)