用于删除的MSsql触发器

用于删除的MSsql触发器,sql,sql-server,Sql,Sql Server,如果某个员工已经在处理某项任务,我希望触发器能够防止从角色表中删除该员工。如果任务尚未启动,则应能够从角色表中删除该员工 触发: CREATE TRIGGER trg_role_del ON Role FOR DELETE AS IF EXISTS (SELECT Task.StartTask, Role.EmployeeId, FROM Task, Role, deleted WHERE Role.EmployeeId = deleted.EmployeeId AND Role.Employ

如果某个员工已经在处理某项任务,我希望触发器能够防止从角色表中删除该员工。如果任务尚未启动,则应能够从角色表中删除该员工

触发:

CREATE TRIGGER trg_role_del
ON Role
FOR DELETE AS

IF EXISTS (SELECT Task.StartTask, Role.EmployeeId,
FROM Task, Role, deleted
WHERE Role.EmployeeId = deleted.EmployeeId
AND Role.EmployeeId = Task.EmployeeId
AND GETDATE() > Task.StartTask)
BEGIN
    RAISERROR ('This role is working on a task, cannot be removed', 16, 1)
ROLLBACK TRANSACTION
END;
删除语句:

DELETE FROM Role
WHERE EmplyeeId = '003'

但是,上面的触发器不起作用。所有的删除都会通过,触发器不会停止任何操作。如果SELECT语句是单独运行的,那么它确实从表中选择了正确的值,所以SELECT看起来很好。我似乎无法使代码正常工作。非常感谢您的帮助

您创建了一个“删除后”触发器,而您应该创建一个“替代”触发器。

我将使用替代删除触发器:

CREATE TRIGGER trg_role_del
ON Role
INSTEAD OF DELETE AS

DELETE r
FROM Role r
INNER JOIN deleted ON r.EmployeeId = deleted.EmployeeId
LEFT JOIN Task ON r.EmployeeId = Task.EmployeeId
               AND GETDATE() > Task.StartTask
WHERE Task.Id IS NULL -- Any non-nullable column on the task table is good here

这是一个很好的评论,但回答很差。谢谢!这真的很有帮助,解决了问题!