Sql server 有没有办法只存储一次字段值?

Sql server 有没有办法只存储一次字段值?,sql-server,Sql Server,有没有办法在列上存储(插入时)一个永远不能更改的值 例如: 在DB行中插入“a、b、c、x、s,x”-并且x*将无法*更改。 (但是,如果删除了整行,则很好”您可以在更新行之前或更新行之后()编写一个触发器,以检查它是否要更改。下面是一个更新后的触发器示例,如果列被修改,它将回滚事务 CREATE TRIGGER tr_update on YourTable AFTER UPDATE AS IF UPDATE(YourColumn) BEGIN RAISERROR

有没有办法在列上存储(插入时)一个永远不能更改的值

例如:

在DB行中插入“a、b、c、x、s,x”-并且x*将无法*更改。
(但是,如果删除了整行,则很好”

您可以在更新行之前或更新行之后()编写一个触发器,以检查它是否要更改。下面是一个更新后的触发器示例,如果列被修改,它将回滚事务

CREATE TRIGGER tr_update on YourTable AFTER UPDATE AS
    IF UPDATE(YourColumn)
    BEGIN
        RAISERROR ('cannot change yourColumn', 16, 1)
        ROLLBACK TRAN
        RETURN
    END
GO

您可以从不希望更改该值的用户中删除该列的更新权限。或者,使用更新触发器阻止更新


如果要禁止任何用户的更新,则更新触发器更简单。

添加更新触发器,在其中检查更改:

CREATE TRIGGER YourTrigger On YourTable FOR UPDATE
AS

IF EXISTS (SELECT 1
               FROM INSERTED           i
                   INNER JOIN DELETED  d ON i.PK=d.PK
               WHERE i.columnX!=d.columnX 
                   OR (i.columnX IS NULL and d.columnx IS NOT NULL)
                   OR (d.columnX IS NULL and i.columnx IS NOT NULL) 
          )
BEGIN
    ROLLBACK
    RAISERROR('Error, can''t change columnX',16,1)
    RETURN
END

GO

这两个选项都可以使用,但触发器的性能和复杂性代价更高,因此删除该列的更新是更好的选项。此处列出了一些不错的选项,但请记住,具有SA级别访问权限的人可以删除任何阻止更改的尝试,如果他们选择这样做的话。对于具有SA级别访问权限的人任何试图使专栏不可更改的尝试都只是一个建议。