SQL
1ALTER TRIGGER [dbo].[trTest] ON [dbo].[table_1] 2AFTER INSERT, UPDATE 3 4AS 5BEGIN 6 7--パラメータを指定 table_1 8DECLARE @VarA varchar(50) 9DECLARE @IntB int 10 11--トリガ内で処理された行数を示すメッセージが結果セットの一部として返されないようにします。 12SET NOCOUNT ON; 13 14SELECT 15@VarA = A 16, @IntB = B 17FROM inserted 18 19PRINT @VarA --OK 20 21--存在している場合 22If Exists 23 (SELECT * FROM dbo.table_2 WHERE A = @VarA) 24 If Exists 25 (SELECT * FROM dbo.table_2 WHERE A = @VarA) 26 AND 27 (@IntB = 1 OR 28 @IntB = 2) 29 BEGIN 30 UPDATE dbo.table_2 31 SET B = @IntB 32 WHERE (A = @VarA) 33 END 34--存在していない場合 35ELSE 36 BEGIN 37 --table_2へインサート 38 INSERT INTO 39 dbo.table_2 (A, B) 40 SELECT A,B 41 FROM dbo.table_1 42 WHERE (A = @VarA) 43 END 44END
上記のような処理があります。
概要
table_1とtable_2の同期処理(table_1にトリガ-)
処理①
table_1.Aとtable_2.Aが同じレコードがあれば、
table_1.Bの値が1か2の時、table_2.B = table_1.Bとする
処理②
table_1.Aとtable_2.Aが同じレコードがなければ、
table_1のレコードをtable_2のインサートする
現在以の問題があります。
★問題1★
トリガーが仕込んである、table_1に一気に2件レコードを追加しても1回しかトリガーが実行されていない
(PRINTが1回しかコンソールに表示されませんでした。。。。)
どうかご教授のほどよろしくお願いします。
SQL
1--回答を参考にソースを修正 2CREATE TRIGGER trTest ON table_1 3AFTER INSERT, UPDATE 4 5AS 6BEGIN 7 8--トリガ内で処理された行数を示すメッセージが結果セットの一部として返されないようにします。 9SET NOCOUNT ON; 10 11UPDATE table_2 12SET B = (SELECT B 13 FROM inserted 14 WHERE table_2.A 15 = inserted.A) 16WHERE table_2.A IN 17 (SELECT A FROM inserted); 18 19END 20 21 22delete from [dbo].[table_1]; --全削除 23 24insert into [dbo].[table_1] 25select * from [dbo].[wk_table_1]; --トリガー発火のためレコードを挿入
--テーブル定義(table_1、tqble_2、wk_table_1) USE [XXXXXX] GO /****** Object: Table [dbo].[table_1] Script Date: 2021/10/19 16:12:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[table_1]( [A] [varchar](50) NOT NULL, [B] [int] NULL, CONSTRAINT [PK_table_1] PRIMARY KEY CLUSTERED ( [A] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO ALTER TABLE [dbo].[table_1] ADD CONSTRAINT [DF_table_1_B] DEFAULT (0) FOR [B] GO --テストデータ insert into dbo.wk_table_1 values ('00001', 1); --A(主キー), B values ('00002', 2); --A(主キー), B