ページの先頭行へ戻る
Linkexpress Transactional Replication option V5.0L60 説明書
FUJITSU Software

A.3.4 SQL Serverデータベースの場合

SQL Serverデータベースにおける、トリガの利用方法および定義例を説明します。

A.3.4.1 利用方法

SQL Serverデータベースにおけるトリガの利用方法を説明します。

格納データの加工(種別:AFTER)

論理表insertedからキーおよび加工対象の列を取得するSELECT文を発行し、加工対象の変数の値を加工します。その後、加工結果を反映したSQL文を発行します。ただし、トリガ内で発行するSQL文から再びトリガが実行され、加工済みの値がさらに加工されるのを防ぐため、判定用の列が必要です。たとえば、次のように行います。EXTRACT定義文のSELECTオペランドに、初期値として0の項目を追加します。また、OUTTABLE定義文のITEMオペランドに判定用の列を指定します。INSERT文に対するトリガでは、加工のためのUPDATE文を発行するときに、判定用の列の値として1を指定します。UPDATE文に対するトリガでは、判定用の列を判定し、0以外ならばトリガから発行したUPDATE文なので、加工対象外として扱います。

格納処理の迂回(種別:AFTER)

論理表insertedからすべての列を取得するSELECT文を発行します。迂回条件を満たす場合、エラー番号60999/重大度レベル16を返し、トリガの対象となるSQL文の処理を元に戻すためのSQL文を発行します。

A.3.4.2 定義例

SQL Serverデータベースにおける、INSERT文に対するトリガの定義例を説明します。

格納データの加工(種別:AFTER)

EXTRACT定義文のSELECTオペランドの定義例

SELECT =(( @TRHEADER ),
( @DBOP ),
( ITEM01 ),
( ITEM02 ),
( @CONST(0,sint) )
)

判定用の列として項目追加”@CONST(0,sint)”を指定します。この項目追加に対応する、格納側の表における列の属性はsintです。

OUTTABLE定義文のITEMオペランドの定義例

ITEM =( @TRHEADER,
@DBOP,
ITEM01,
ITEM02,
CHK
)

EXTRACT定義文のSELECTオペランドで指定した項目追加に対応する、判定用の列CHKを指定します。

INSERT文に対するトリガの定義例

CREATE TRIGGER [TRIG1] ON [link].[CADMY01]
AFTER INSERT
AS
BEGIN
DECLARE @NewItem1 int, @NewItem2 int
SELECT @NewItem1= ITEM01, @NewItem2=ITEM02 from inserted

SET @NewItem2 = @NewItem2 + 3 -- 加工
-- 加工のためのUPDATE文を発行
-- CHKは判定用の列。INSERT文に対するトリガから発行したことを示す値を指定
UPDATE CADMY01 SET ITEM02=@NewItem2, CHK1=1 WHERE ITEM01=@NewItem1
END

論理表insertedからキーおよび加工対象の列を取得するSELECT文を発行し、それぞれの列の値を変数に代入します。加工後、表TBL1に対して加工済の値および判定用の列を更新対象として指定したUPDATE文を発行します。

UPDATE文に対するトリガの定義例

CREATE TRIGGER [TRIG2] ON [link].[CADMY01]
AFTER UPDATE
AS
BEGIN
DECLARE @NewItem1 int, @NewItem2 int, @Chk int
SELECT @NewItem1= ITEM01, @NewItem2=ITEM02, @Chk=CHK from inserted
IF(@Chk < 1) -- 判定用の列を判定
BEGIN
SET @NewItem2 = @NewItem2 + 3 -- 加工
-- 加工のためのUPDATE文を発行
-- CHKは判別用の列。UPDATE文に対するトリガから発行したことを示す値を指定
UPDATE CADMY01 SET ITEM02=@NewItem2, Chk=2 WHERE ITEM01=@NewItem1
END
END

論理表insertedからキー、加工対象の列および判定用の列を取得するSELECT文を発行し、それぞれの列の値を変数に代入します。判定用の列を判定し、トリガから発行されていなければ加工対象として扱います。この例では、判定用の列の値が1以上の場合、トリガから発行されていると判定します。加工対象の場合は加工後、表TBL1に対して加工済の値および判定用の列を指定したUPDATE文を発行します。

格納処理の迂回(種別:AFTER)

トリガの定義例

CREATE TRIGGER [TRIG1] ON [link].[CADMY01]
AFTER INSERT
AS
BEGIN
DECLARE @NewItem1 int, @NewItem2 int
SELECT @NewItem1= ITEM01, @NewItem2=ITEM02 from inserted
IF(@NewItem2 < 0) -- 迂回判定
BEGIN
RAISERROR(60999, 16, 1) -- エラー番号を返す
-- INSERT文によって挿入した行を元に戻すDELETE文を発行
DELETE CADMY01 WHERE ITEM01=@NewItem1
END
END

論理表insertedからキーおよび迂回判定に使う列を取得するSELECT文を発行し、それぞれの列の値を変数に代入します。迂回条件を満たす場合、エラー番号60999を返したあと、INSERT文によって挿入した行を元に戻すDELETE文を発行して終了します。