私は現在、SQL Serverトリガーの作成に取り組んでいます。これは、更新後に、変更ログに給与の変更と、どのユーザーが作成したかを入力する必要があります。
更新を受信する必要がある、私が作成した変更ログ テーブルは、次の場所で確認できます。
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
2 つの select ステートメントの payrate 部分は、その上の 2 行で問題なく PayRate を呼び出しているにもかかわらず、無効な列であるというエラーを返します。次に、Insert Into ステートメントの値の部分については、テーブルの作成時にまったく同じ方法で使用したにもかかわらず、ID は間違った構文を持っていると主張しています。
このトリガーの問題の可能性について何か考えがある人はいますか? 任意の入力をいただければ幸いです。
編集:
以下の提案された変更の後、トリガーに 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