В настоящее время я работаю над созданием триггера SQL Server, который после обновления должен заполнить журнал изменений с внесенными изменениями зарплаты и с каким пользователем.Создание журнала изменений SQL Server, синтаксис идентификаторов и недопустимые COlumns
В таблице изменений, которые я сделал, который должен получать обновления можно увидеть здесь:
CREATE TABLE ChangeLog
(
ChangeID int identity(1,1) primary key,
EmpID int,
[User] nvarchar(30),
[Date] smalldatetime,
OldRate money,
NewRate money
)
Все хорошо с таблицей, насколько я могу сказать, однако, когда я иду, чтобы создать триггер, я начиная получать несколько ошибок (и ловушку путаницы). Я попытался изучить несколько методов запуска триггера, который обновляет другую таблицу с новой строкой, и, насколько я могу судить, структура ее правильная, однако я не уверен, как я испортил содержимое.
CREATE TRIGGER payrate_change ON Employees FOR UPDATE
As
DECLARE @originalPay VARCHAR(100)
DECLARE @newPay VARCHAR(100)
If UPDATE (PayRate)
BEGIN
SELECT @originalPay = (SELECT PayRate FROM deleted)
SELECT @newPay = (SELECT PayRate FROM inserted)
INSERT INTO [dbo].[ChangeLog]
(ChangeID, EmpID, [User], [Date], OldRate, NewRate)
VALUES
identity(1,1),
Employees.EmployeeID,
SUSER_SNAME(),
SYSDATETIME(),
@originalPay,
@newPay
FROM inserted
END
payrate часть два отдельных заявлений дает ошибку о том, что они являются недействительными столбцами, даже если две строк выше он называет PayRate просто отлично. Затем для части значений инструкции Insert Into идентификация утверждает, что имеет неправильный синтаксис, несмотря на то, что я использую его точно так же при создании таблицы.
Есть ли у кого-нибудь идеи о том, что может быть проблемой с этим триггером? Любой вход был бы весьма признателен.
EDIT:
После предложенных изменений ниже, я вновь добавил ChangeID (первичный ключ) для триггера, однако теперь IDENTITY дает мне неправильную синтаксическую ошибку:
CREATE TRIGGER payrate_change ON Employees FOR UPDATE
As
If UPDATE (PayRate)
BEGIN
INSERT INTO [dbo].[ChangeLog]
(ChangeID, EmpID, [User], [Date], OldRate, NewRate)
select
IDENTITY(1,1),
i.EmployeeID,
SUSER_SNAME(),
SYSDATETIME(),
d.PayRate,
i.PayRate
FROM inserted i
JOIN deleted d on i.EmployeeID = d.deleted
END
edit2: Добавление окончательный результат для тех, кто заинтересован:
CREATE TRIGGER payrate_change2 ON Employees FOR UPDATE
AS
If UPDATE (Pay)
BEGIN
INSERT INTO [dbo].[ChangeLog]
(EmpID, [User], [Date], OldRate, NewRate)
select
i.EmployeeID,
SUSER_SNAME(),
SYSDATETIME(),
d.Pay,
i.Pay
FROM inserted i
JOIN deleted d on i.EmployeeID = d.EmployeeID
END
Фактически ChangeID был тем, что я имел в виду как первичный ключ, так как это будет обновлять журнал изменений, где может быть несколько одинаковых идентификаторов сотрудников. Я попробовал добавить ChangeID после этого, так как PayRate все еще вызывал ошибку «недопустимый столбец», и я придумал, что я добавил в исходное сообщение. Я как-то неправильно делаю заявление о идентичности? Я думал, что это был способ сделать это правильно, но, похоже, все же выдает ошибку, говоря неправильный синтаксис. –
ChangeID будет автоматически сгенерирован, так как это столбец идентификатора..имя его – SQLMenace
Хорошо спасибо за быстрый ответ. У вас есть идеи, почему PayRate и удаленные все еще отображаются как недопустимое имя столбца? Отображаемая ошибка: «Msg 207, уровень 16, состояние 1, процедура payrate_change, строка 4 Недопустимое имя столбца« PayRate ». Msg 207, уровень 16, состояние 1, процедура payrate_change, строка 16 Недопустимое имя столбца «удалено». Msg 207, уровень 16, состояние 1, процедура payrate_change, строка 13 Недопустимое имя столбца 'PayRate'. Msg 207, уровень 16, состояние 1, процедура payrate_change, строка 14 Недопустимое имя столбца 'PayRate'. " –