如何检查数据库中的所有年份

时间:2018-11-24 19:03:50

标签: sql sql-server triggers

我有这个触发器:

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。

1 个答案:

答案 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号起飞),也不会在周末或节假日中使用此帐户。