5

テーブルに新しく挿入された行の同じテーブルの別の列の値と同じ列に値を挿入するトリガーを作成する方法。

以下のようなテーブルがあるとします

ColumnA | ColumnB

行がテーブルに挿入されるか、列Bの値が更新されるとすぐに、列Bの値が列Aに挿入されるようにします。ただし、その逆はいけません。つまり、columnA の値を columnB に挿入します。

以下のコードは INSERT のみを処理します。テーブルの挿入と更新の両方を処理する方法、つまり columnB の値が挿入または更新されたときの処理方法を教えてください。

CREATE TRIGGER inserupdate
   ON  triggertestTable
   AFTER INSERT,UPDATE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for trigger here
    declare @value int

    select @value=columnB from inserted

    update triggertestTable
    set columnA=@value

END
GO

以下のように値が挿入されている場合、これは正常に機能します

insert into triggertestTable(columnB) values('xyz')

ColumnB の値が columnA に挿入されます

ColumnA | ColumnB
  xyz   |  xyz 

ただし、他のアプリケーションが columnA に値を挿入すると、両方で null 値が更新されます

 insert into triggertestTable(columnA) values('pqr')

現在、記録は

ColumnA | ColumnB
  xyz   |  xyz 
  NULL  |  NULL

正しいレコードセットは次のようになります

  ColumnA   | ColumnB
      xyz   |  xyz 
      pqr   |  NULL

この問題を解決する方法。

4

4 に答える 4

11

このトリガーを試してください (ColumbB に値が挿入されるか、ColumbB の値が更新されると、ColumnB から ColumnA に値がコピーされます)。

CREATE TRIGGER trgIU_triggertestTable_UpdateColumnAWhenColumnB
   ON  dbo.triggertestTable
   AFTER INSERT,UPDATE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    IF UPDATE(ColumnB)
    BEGIN
        UPDATE  dbo.triggertestTable
        SET     ColumnA=i.ColumnB
        FROM    inserted i
        INNER JOIN dbo.triggertestTable t ON i.MyID=t.MyID
        LEFT JOIN deleted d ON i.MyID=d.MyID
        WHERE   d.MyID IS NULL AND i.ColumnB IS NOT NULL -- Row was inserted
        OR      d.MyID IS NOT NULL -- Row was updated
    END
END
GO

私はこのテーブルを使用しました:

CREATE TABLE dbo.triggertestTable(
    MyID INT IDENTITY(1,1) PRIMARY KEY, -- MyID should be a PRIMARY KEY or a mandatory(NOT NULL) UNIQUE constraint
    ColumnA VARCHAR(100),
    ColumnB VARCHAR(100)
);
GO
于 2013-07-25T15:12:25.663 に答える
2

inserted疑似テーブルであり、複数の行が含まれる場合があります。セットベースの何かを書くべきです。何かのようなもの:

 update triggertestTable
    set columnA=COALESCE(columnA,columnB)
where id in (select id from inserted)

(triggertestTableという主キー列がある場合id)

上記は、まだ値を持っていない場合、 の値に設定columnAします。これは、あなたが探しているものかもしれません。columnBcolumnA

于 2013-07-25T14:41:40.543 に答える
0

次のことを試しましたか。

    update triggertestTable
    set columnA=@value
    where columnB is not NULL
于 2013-07-25T14:28:30.247 に答える