Как проверить все годы в базе данных - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть этот триггер:

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 голосов
/ 25 ноября 2018
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 дней), дажеодин и тот же сотрудник обновляет строки для нескольких лет, где один год остается действительным, а другой - нет.И это нигде не регистрируется, поэтому нет способа восстановить действительные данные, отвергая неверные данные (если только вы не принудите принудительно вставлять / обновлять только одну комбинацию employeeid + year одновременно).Кроме того, это не проверяет наличие перекрывающихся диапазонов, введенных по ошибке (например, кто-то снимает с 1-го по 10-е, а затем с 7-го по 13-е), а также не учитывает какую-либо из этих учетных записей на выходные или праздничные дни.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...