如果列具有允许值之一,是否可以限制用户进一步更新列

Is there a way to restrict user to update column further if it has one of the allowable value

我正在寻找一种方法来限制用户在 SQL 服务器 table.

中已经具有特定值(来自允许值)的列时进行更新

假设第 1 列有限制,只允许 'Y' 和 'N' 之一 例如([列 1]='N' 或 [列 1]='Y')

如果值为'N',可以更改为'Y'或'N' 如果该值已经是 'Y',则用户无法将列更新为 'N'

可以应用什么约束来模拟此行为? 有没有办法为此使用检查约束或更新触发器是唯一的方法(我正在探索但不确定是否是实现此目的的正确方法)。

你无法用 CONSTRAINT 做到这一点,不。 CONSTRAINT "cares" 关于列被设置的值,而不是它原来的值。 INSTEAD OF 触发器在这里似乎是更好的选择。

这过于简化了,但您可以这样做:

CREATE TRIGGER trg_NoYToN ON dbo.YourTable
INSTEAD OF UPDATE
AS

    UPDATE YT
    SET SomeColumn = i.SomeColumn,
        AnotherColumn = i.AnotherColumn,
        YourYNColumn = CASE WHEN YT.YourYNColumn = 'Y' THEN 'Y' ELSE i.YourYNColumn END
        ...
    FROM dbo.YourTable YT
         JOIN dbo.inserted i ON YT.YourIDColumn = i.YourIDColumn;
GO

我想,您也可以使用 AFTER UPDATE 触发器来 "undo" 更改,这样更容易编写,但需要在 table 上写入 2 次才能生效行数:

CREATE TRIGGER trg_StopYtoN ON dbo.YourTable
AFTER UPDATE
AS

    UPDATE YT
    SET YourYNColumn = 'Y'
    FROM dbo.YourTable YT
         JOIN deleted d ON YT.YourIDColumn = d.YourIDColumn
    WHERE d.YourYNColumn = 'Y'
      AND YT.YourYNColumn = 'N';
GO