2017-03-27 113 views
1

我想让触发器阻止员工从角色表中删除,如果该员工已经在处理任务。如果任务尚未开始,则应该可以从角色表中删除员工。DELETE的MSsql触发器

触发:

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语句:

DELETE FROM Role 
WHERE EmplyeeId = '003' 

然而触发以上不起作用。所有删除都会经过,触发器不会停止任何操作。如果SELECT语句单独运行,它会从表中选择正确的值,所以SELECT看起来很好。我似乎无法让代码正常工作。帮助将不胜感激!

+0

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to -kick-using-old-style-joins.aspx –

回答

2

我会去的,而不是删除触发器:

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 

See a live demo on rextester

+0

为何这个答案被降低了的任何理由? –

+0

谢谢!这真的很有帮助,它解决了问题! – froYo

0

您创建了“AFTER DELETE”触发器,而您应创建“INSTEAD OF”触发器。

+1

这是一个很棒的评论,但是回答非常糟糕。 –