我有一个像这样的简单表:
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
尝试以下操作:
您只需要检查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