用于删除的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
这是一个很好的评论,但回答很差。谢谢!这真的很有帮助,解决了问题!