2016-12-14 14 views
0

にO.F.、更新トリガーアペンドデータ二回コラム

は、だから私は、行が別のテーブルに更新されたときに基づいてテーブルを更新するトリガーを構築しようとしてきました。今のところトリガーはこのように見えます。

ALTER TRIGGER [dbo].[tst_update_USCATVLS_6] 
    ON [dbo].[IV00101] 
    AFTER UPDATE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    DECLARE @ITEMNUMBER VARCHAR(75) 

    SET @ITEMNUMBER = (SELECT ITEMNMBR FROM dbo.IV00101 WHERE DEX_ROW_TS = (SELECT MAX(DEX_ROW_TS) FROM dbo.IV00101)) 

    UPDATE dbo.EXT00101 SET STRGA255 = (RTRIM(LTRIM(STRGA255))) + '_0' WHERE PT_UD_KEY = @ITEMNUMBER AND PT_UD_Number = 2 

以下のようなテストアップデートを実行するとどうなるでしょうか。

UPDATE PDM.TEST.dbo.IV00101 
     SET USCATVLS_6 = 'OBSOLETE' 
WHERE ITEMNMBR = 'HMLGDN-7563252-4' 

トリガーは起動しますが、目的の列を2回更新しますか?最終結果はこの20025947756319_0の代わりに20025947756319_0_0になります。

トリガーをドロップして同じテストアップデートを実行した後、トリガーされたすべてのステートメントで実行された更新ステートメントを実行すると、データが必要に応じて更新されます。だから、コードの1つのブロックとして、これを実行している

は動作します:

UPDATE PDM.TEST.dbo.IV00101 
     SET USCATVLS_6 = 'OBSOLETE' 
WHERE ITEMNMBR = 'HMLGDN-7563252-4' 

DECLARE @ITEMNUMBER VARCHAR(75) 

SET @ITEMNUMBER = (SELECT ITEMNMBR FROM PDM.TEST.dbo.IV00101 WHERE DEX_ROW_TS = (SELECT MAX(DEX_ROW_TS) FROM PDM.TEST.dbo.IV00101)) 

UPDATE PDM.TEST.dbo.EXT00101 SET STRGA255 = (RTRIM(LTRIM(STRGA255))) + '_0' WHERE PT_UD_KEY = @ITEMNUMBER AND PT_UD_Number = 2 

いずれかが、これは私はそれを大幅に感謝起こっている理由を私は把握することができます。

親切よろしく、 Z.

+1

あなたのトリガーは二つの主要な欠陥があります。まず、1行しか更新されないと仮定しています。これは、SQL Serverでトリガーが動作する方法ではありません。 1回の操作ではなく、1回の操作で1回発射されます。 2番目の欠点は、挿入または削除された仮想テーブルを参照していないことです。つまり、テーブルの行を更新するたびに、テーブルのすべての行が更新されます。 –

+0

@Sean Lange、挿入されたテーブルと削除されたテーブルの参照についてのアドバイスの後、別のトリガーを作成して2つの一時テーブルのデータを見ることができました。私が更新ステートメントを実行すると、挿入と削除テーブルに2回書いているようですが、私は4つの別々のデータセットを各テーブルに2つ戻します。それはユニークなアイテムの通常の出力ですか? – Zajac

答えて

0

は私が挿入見上げるとテーブルを削除したショーン・ランゲさんのコメントを読みました。私は前にこれらのテーブルへの参照を見ましたが、それらが一時的なテーブルであることを認識せず、それらが私が見た例/答えのデータベースの物理的テーブルだと思いました。とにかく私はトリガを作成して、それぞれのデータを表示し、トリガの更新ステートメントにそれらをどのように結合するのかを知るのを助けました。すべてのコードは以下の通りです。

トリガー挿入され、削除されていたかを見るだけでなく、挿入されたテーブルを参照して参加する:

ALTER TRIGGER [dbo].[inserted_deleted_Table] 
    ON [dbo].[IV00101] 
    AFTER UPDATE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

select 'NEW DATA', * from inserted --new data 

select 'OLD Data', * from deleted --old data 

select 'iv00101', * From iv00101 as i JOIN inserted as u on i.itemNmbr = u.itemNmbr and i.DEX_ROW_TS = u.DEX_ROW_TS 
    -- Insert statements for trigger here 

END 

エンドソリューションは、このコードのpeiceを削除することでした:

SET @ITEMNUMBER = (SELECT ITEMNMBR FROM INV00101 WHERE DEX_ROW_TS = (SELECT MAX(DEX_ROW_TS) FROM INV00101) AND USCATVLS_6 ='OBSOLETE') 

そして、 UPDATEステートメントにFROM句を追加してください。

UPDATE PDM.TEST.dbo.EXT00101 SET STRGA255 = (RTRIM(LTRIM(STRGA255))) + '_0' 
    FROM (
      SELECT u.ITEMNMBR , 
        u.DEX_ROW_TS 
      From iv00101 as i JOIN inserted as u on i.itemNmbr = u.itemNmbr and i.DEX_ROW_TS = u.DEX_ROW_TS) as p 
    WHERE PT_UD_KEY = p.ITEMNMBR AND PT_UD_Number = 2 

と削除されたテーブルは、DB内の実際のテーブルではない一時テーブルでしたすべての部分はsortaは場所に落ちた。 @Sean Langeに行く必要のある方向に私を指摘してくれてありがとう。

よろしく、 Z.

+0

あなたのために働いている喜び。トリガー内にスカラー変数があるときは、巨大な赤旗が必要なので、複数の行を許可していることを確認してください。あなたの新しいバージョンはそれが起こっているように見えます。よくやって、いくつかのアドバイスを受けて、解決策を見つけるために掘り起こしてください! –