我有这个触发器:
alter trigger max_14_holidays
on contentment
after update,insert
as
if exists(select employeeid
from contentment
where year (DateEnd) = 2018
and absenteecat = 'holiday'
group by employeeid
having sum(datediff(day, DateStart, DateEnd) + 1) > 14)
begin
raiserror ('Already more than 14 days', 16,1)
rollback transaction
end
但是此触发器仅适用于2018年,我想检查数据库(DateEnd
)中每一年的触发器。我怎样才能做到这一点?我使用SQL Server。
答案 0 :(得分:1)
ALTER TRIGGER dbo.max_14_holidays -- always use schema prefix
ON dbo.contentment
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS
(
SELECT 1 FROM dbo.contentment AS c
WHERE EXISTS
(
SELECT 1 FROM inserted AS i
WHERE i.employeeid = c.employeeid
AND DATEPART(YEAR, i.DateEnd) = DATEPART(YEAR, c.DateEnd)
)
GROUP BY employeeid, DATEPART(YEAR, DateEnd)
HAVING SUM(DATEDIFF(DAY, DateStart, DateEnd)+1) > 14
)
BEGIN
RAISERROR('Already more than 14 days', 16, 1);
ROLLBACK TRANSACTION;
END
END
请注意,即使您在同一条语句中插入/更新两名员工,并且其中一位保持有效(<= 14天),而其中一位保持无效(> 14天),即使是同一员工ID,也将回退整个交易更新多年的行,其中一年保持有效,而另一年则无效。而且它不会在任何地方记录日志,因此无法在拒绝无效数据的同时恢复有效数据(除非您简单地强制您一次只能插入/更新一个单一的employeeid + year组合)。此外,这不会检查是否误输入了重叠范围(例如,某人从1号到10号然后从7号到13号起飞),也不会在周末或节假日中使用此帐户。