-4

Products と Products_audit という 2 つのテーブルがあり、Products_audit を監査テーブルのように使用したいので、更新後にトリガーを使用したいと考えています。トリガーを書きましたが、「挿入済み」と「削除済み」の 2 つのテーブルを結合する方法がわかりません

CREATE TRIGGER Super2
ON Products
AFTER Update
AS
BEGIN

INSERT INTO Products_audit

      (ProductID,
       ProductName,
       SupplierID,
       CategoryID,
       QuantityPerUnit,
       UnitPrice,
       UnitsInStock,
       UnitsOnOrder,
       ReorderLevel,
       Discontinued,
       Date,
       [User])

SELECT 

       ProductID,
       ProductName,
       SupplierID,
       CategoryID,
       QuantityPerUnit,
       UnitPrice,
       UnitsInStock,
       UnitsOnOrder,
       ReorderLevel,
       Discontinued,
       getdate(),
       suser_sname()

       FROM deleted

inserted 
    inner join deleted d on i.id = d.id

      END 

最後の文字列を書くのを手伝ってください

FROM deleted
inserted 
    inner join deleted d on i.id = d.id

      END

正しい書き方が分からなかったからです。

4

1 に答える 1

4

では、行の古いバージョンと新しいバージョンの両方を監査テーブルに配置するだけであれば、 は必要ありませJOINUNION ALL

(上記のコメントで述べたように、私はこのロジックをまったく理解していません。後でそれがどれほど間違っているかを理解したときに、これを変更することを保証します。)

CREATE TRIGGER dbo.Super2
ON dbo.Products FOR UPDATE
AS
BEGIN

  SET NOCOUNT ON;

  INSERT dbo.Products_audit
  (
       ProductID,
       ...other columns...,
       Date,
       [User]
  )
  SELECT 
       ProductID,
       ...other columns...,
       getdate(),
       suser_sname()
    FROM deleted -- <--- ****** deleted ******
  UNION ALL
  SELECT 
       ProductID,
       ...other columns...,
       getdate(),
       suser_sname()
    FROM inserted;
END
GO

少なくとも、監査テーブルに「更新前」と「更新後」を示す列を追加する必要があると思います。それを呼び出しましょうChangeStatus(挿入操作と削除操作にも再利用できます)。

CREATE TRIGGER dbo.Super2
ON dbo.Products FOR UPDATE
AS
BEGIN

  SET NOCOUNT ON;

  DECLARE @d DATETIME = GETDATE(), @u SYSNAME = SUSER_SNAME();

  INSERT dbo.Products_audit
  (
       ProductID,
       ...other columns...,
       ChangeStatus,
       Date,
       [User]
  )
  SELECT 
       ProductID,
       ...other columns...,
       'before update',
       @d,
       @u
    FROM deleted -- <--- ****** deleted ******
  UNION ALL
  SELECT 
       ProductID,
       ...other columns...,
       'after update',
       @d,
       @u
    FROM inserted;
END
GO
于 2013-03-28T13:27:09.927 に答える