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-е), а также не учитывает какую-либо из этих учетных записей на выходные или праздничные дни.