【问题标题】:Create trigger which would not allow to delete values in specific column?创建不允许删除特定列中的值的触发器?
【发布时间】:2019-05-03 22:47:27
【问题描述】:

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

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

【问题讨论】:

  • 似乎您可以考虑设置用户权限
  • 我认为不必像你提议的那样去做。我相信这个练习非常简单,我引用了“创建不允许删除标记的触发器”:)。
  • 只需将定义更改为FOR DELETE 并始终引发错误。 (投掷是更好的选择)。
  • @DaleBurrell 更改了它,但我仍然可以删除 MARK 表中的行...哦 nvm 忘了删除 IF 部分:)
  • @DaleBurrell 是的,谢谢 :)

标签: sql-server triggers sql-delete


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    相关资源
    最近更新 更多