创建触发器,不允许删除特定列中的值?

问题描述 投票:0回答:1

我有一个像这样的简单表:

MARK {IdMark Int, IdStudent Int, Value Int, Subject Varchar(10)}

并且我想创建触发器,该触发器不允许删除该表中的行,但是除非它为NULL,否则应该可以更改“值”列中的值。

下面的代码根本无法正常工作:

CREATE TRIGGER delValue
ON mark
FOR INSERT, UPDATE, DELETE
AS
IF EXISTS(SELECT 1 FROM inserted i JOIN deleted d ON i.IdMark = d.IdMark WHERE i.IdMark IS NULL)
    BEGIN
        RAISERROR('You can't delete marks!', 16, 1)
        ROLLBACK
    END
sql-server triggers sql-delete
1个回答
1
投票

尝试以下操作:

您只需要检查inserted是否为空值。如果inserted中什么都没有,但deleted中什么都没有,则将其删除。

此外,请注意在消息中使用单引号时,您需要对它们进行转义(通过重复它们)。

CREATE TRIGGER delValue
ON mark
FOR INSERT, UPDATE, DELETE
AS
begin
  -- If attempting to set to null, rollback
  IF EXISTS (SELECT 1 FROM inserted WHERE IdMark IS NULL) BEGIN
    RAISERROR('You can''t set marks to null!', 16, 1);
    ROLLBACK;
  END
  -- If attempting to set to delete, rollback
  -- There will never be anything in inserted for a delete
  IF NOT EXISTS (SELECT 1 FROM inserted) and EXISTS (SELECT 1 FROM Deleted) BEGIN
    RAISERROR('You can''t delete marks!', 16, 1);
    ROLLBACK;
  END
end
© www.soinside.com 2019 - 2024. All rights reserved.