После вставки триггер не работает при использовании Inserted - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь написать триггер на моей таблице Employees, который не должен позволять вставлять нового сотрудника, у которого дата найма старше даты найма его босса

CREATE TABLE [dbo].[Employees]
(
    [EID] [int] IDENTITY(1,1) NOT NULL,
    [Ename] [nvarchar](20) NOT NULL,
    [Gender] [nvarchar](1) NOT NULL,
    [IsMarried] [nvarchar](1) NOT NULL,
    [Birthdate] [date] NOT NULL,
    [HireDate] [date] NOT NULL,
    [Salary] [float] NOT NULL,
    [Notes] [nvarchar](200) NULL,
    [NationalityID] [int] NULL,
    [BossID] [int] NULL,

    CONSTRAINT [PK_Employees] 
        PRIMARY KEY CLUSTERED ()
)

И вот код триггера:

CREATE TRIGGER [dbo].[Trig_04]
ON [dbo].[Employees]
AFTER INSERT
AS 
BEGIN
    IF ((SELECT INSERTED.HireDate FROM INSERTED WHERE BossID <> EID) < 
        (SELECT Employees.HireDate FROM Employees 
         WHERE EID IN (SELECT Employees.BossID FROM Employees WHERE BossID <> EID)))
        ROLLBACK
END

Он выполняется нормально (без ошибок), но просто не работает, но когда я использовал таблицу сотрудников в подзапросе вместо вставленной таблицы, это было работает нормально. У кого-нибудь есть ответ на этот вопрос?

1 Ответ

2 голосов
/ 24 марта 2020

Вы должны написать триггеры на сервере SQL, чтобы учесть тот факт, что INSERTED может содержать несколько записей. Вы не можете предполагать, что это будет только одна запись. Я думаю, что вы ищете следующее:

if exists (
  select 1
  from Inserted I
  where I.BossID <> I.EID
  and I.HireDate < (select E.HireDate from Employees E where E.EID = I.BossID)
) begin
    ROLLBACK;
end
...