2013-02-19 3 views
1

В настоящее время я работаю над созданием триггера 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 

ответ

0

Ommit столбец идентификаторов и будет заполняться по своей

Вашего триггер не обрабатывает многорядное обновление, посмотри на Best Practice: Coding SQL Server triggers for multi-row operations

Вы можете РЕГИСТРИРУЙТЕСЬ удалены и вставлены таблицы псевды, я предполагаю, что EmployeeID является ключом?

Попробуйте

CREATE TRIGGER payrate_change ON Employees FOR UPDATE 
As 

If UPDATE (PayRate) 
BEGIN 

INSERT INTO [dbo].[ChangeLog] 
     (EmpID, [User], [Date], OldRate, NewRate) 
    select 
     i.EmployeeID, 
     SUSER_SNAME(), 
     SYSDATETIME(), 
     d.PayRate, 
     i.PayRate 
    FROM inserted i 
    JOIN deleted d on i.EmployeeID = d.deleted 
END 

быть также известно, что If UPDATE (PayRate) будет срабатывать, даже если вы делаете что-то вроде SET PayRate = PayRate Таким образом, вы, вероятно, хотите, чтобы проверить, если значение на самом деле изменилось, вы можете добавить, что в соединении между insertyed и удалены, а также обязательно проверьте наличие NULLS

+0

Фактически ChangeID был тем, что я имел в виду как первичный ключ, так как это будет обновлять журнал изменений, где может быть несколько одинаковых идентификаторов сотрудников. Я попробовал добавить ChangeID после этого, так как PayRate все еще вызывал ошибку «недопустимый столбец», и я придумал, что я добавил в исходное сообщение. Я как-то неправильно делаю заявление о идентичности? Я думал, что это был способ сделать это правильно, но, похоже, все же выдает ошибку, говоря неправильный синтаксис. –

+0

ChangeID будет автоматически сгенерирован, так как это столбец идентификатора..имя его – SQLMenace

+0

Хорошо спасибо за быстрый ответ. У вас есть идеи, почему 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'. " –

Смежные вопросы