Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是否创建不允许删除特定列中的值的触发器?_Sql Server_Triggers_Sql Delete - Fatal编程技术网

Sql server 是否创建不允许删除特定列中的值的触发器?

Sql server 是否创建不允许删除特定列中的值的触发器?,sql-server,triggers,sql-delete,Sql Server,Triggers,Sql Delete,我有一张这样的简单表格: MARK {IdMark Int, IdStudent Int, Value Int, Subject Varchar(10)} 我想创建一个触发器,它不允许删除该表中的行,但应该可以更改列“Value”中的值,除非它为NULL 下面的代码根本不像我希望的那样工作: CREATE TRIGGER delValue ON mark FOR INSERT, UPDATE, DELETE AS IF EXISTS(SELECT 1 FROM inserted i JOIN

我有一张这样的简单表格:

MARK {IdMark Int, IdStudent Int, Value Int, Subject Varchar(10)}
我想创建一个触发器,它不允许删除该表中的行,但应该可以更改列“Value”中的值,除非它为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
请尝试以下操作:

您只需检查插入的
中是否有空值。如果插入的
中没有任何内容,但是删除了
中的某些内容,那么这就是删除

另外,在消息中使用单引号时要小心,您需要转义它们(通过重复它们)


似乎你可以考虑设置用户权限,因为我不认为它必须像你提出的那样去做。我相信这个练习非常简单,我引用了“创建不允许删除标记的触发器”:。只需将delete的定义更改为
,并始终引发错误。(抛出是更好的选择)。@DaleBurrell更改了它,但我仍然可以删除标记表中的行…哦,nvm忘记了删除IF部分:)@DaleBurrell是的,谢谢:)
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