1

私は現在、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
4

1 に答える 1

0

ID 列を省略すると、独自に入力されます

トリガーは複数行の更新を処理しません。ベスト プラクティスをご覧ください: 複数行操作のための SQL Server トリガーのコーディング

削除および挿入された疑似テーブルを結合できます。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 と deleted の間の JOIN にそれを追加し、NULLS を確認することもできます。

于 2013-02-19T00:12:34.117 に答える