データベーススペースの作成が終了したら、論理構造の定義を行います。論理構造の定義を行うと、その情報がRDBディクショナリに格納されます。
論理構造の定義には、スキーマ定義、順序定義、表定義、ビュー定義、トリガ定義、およびプロシジャルーチン定義があります。
以下に論理構造の定義の流れを示します。
図3.15 論理構造の定義の流れ
スキーマはスキーマ名により管理され、1つのデータベースに対して複数個作成することができます。
スキーマ定義は、CREATE SCHEMA文で行います。スキーマ定義では、スキーマを構成する要素として実表およびビュー表の定義を含めて記述します。
順序を定義することにより、順序で一意な値を自動的に生成することができます。主キー値の作成に利用できます。
順序定義は、CREATE SEQUENCE文で行います。すでに定義済のスキーマに対して順序定義を追加する場合も、同文で行います。
表定義では、実表名および実表を構成する列を定義します。1つのスキーマに対して複数個の実表を作成することができます。
すでに定義済のスキーマに対して表定義を追加する場合も、同文で行います。
ビュー定義では、ビュー表名およびビュー表を構成する列を定義します。1つのスキーマに対して複数個のビュー表を作成することができます。ビュー定義はCREATE VIEW文で行います。
すでに定義済のスキーマに対してビュー定義を追加する場合も、同文で行います。
スキーマ定義では、スキーマ名の定義、スキーマの注釈定義およびスキーマを構成する以下の要素の定義を行います。
順序
実表
ビュー表
トリガ
プロシジャルーチン
スキーマ名の定義は、CREATE SCHEMA文を使用して行います。
在庫管理データベースのスキーマ定義の例を以下に示します。在庫管理DBに対して、スキーマのSTOCKSとそれに属する在庫表などを定義するものとします。
在庫管理DBのスキーマを定義
CREATE SCHEMA STOCKS COMMENT '在庫管理業務用' ↑ ↑ スキーマ名 注釈定義 CREATE SEQUENCE 順序1 … (1) CREATE TABLE 在庫表 (製品番号…, … PRIMARY KEY(製品番号)) (2) CREATE TABLE … : CREATE VIEW 大量在庫表(品番,数量) AS SELECT … (3) CREATE VIEW … : CREATE TRIGGER 在庫表トリガ … (4) : CREATE PROCEDURE PROC001 … (5) BEGIN : END
(1) 順序定義
(2) 表定義
(3) ビュー定義
(4) トリガ定義
(5) プロシジャルーチン定義
プロシジャルーチン定義は同一の定義ファイルに記述することができません。
プロシジャルーチン定義は別の定義ファイルに記述し、rdbddlexコマンドにxオプションを指定して定義します。
スキーマ名には、36文字以内の先頭が英字で始まる英数字、または18文字以内の日本語文字列を指定します。
スキーマ名は、データベース内で一意です。
スキーマ名は、SQL文において順序、実表およびビュー表を指定する場合に、順序および表名を修飾する名前として使用します。また、インデックス定義においてインデックスを指定する場合にも、表名を修飾する名前として使用します。
スキーマに対して、文字列または各国語文字列で注釈を指定することができます。最大256バイトの文字列を指定することができます。文字列と各国語文字列の両方を注釈として指定することもできます。注釈が不要な場合は、指定を省略します。以下に例を示します。
スキーマ“STOCKS”に注釈を指定
CREATE SCHEMA STOCKS COMMENT '在庫管理業務用'
↑
注釈定義
順序の定義は、CREATE SEQUENCE文を使用して行います。
順序を定義することにより、順序で一意な値を自動的に生成します。順序は、主キー値の作成に利用できます。
在庫管理データベースに順序を定義する例を以下に示します。スキーマSTOCKSに属する順序1を定義するものとします。
順序を定義する例
CREATE SEQUENCE STOCKS.順序1 ↑ 順序名 INCREMENT BY 1 START WITH 1 ↑ ↑ 増分値 初期値
順序につける名前を指定します。順序名には、36文字以内の先頭が英字で始まる英数字、または18文字以内の日本語文字列を指定します。順序名は、スキーマ内で一意です。ほかのスキーマに同じ順序名の順序が定義されていてもかまいません。
実表の定義は、CREATE TABLE文を使用して行います。
表定義で定義する事項を以下に示します。
在庫管理データベースの実表の定義の例を以下に示します。スキーマSTOCKSに属する在庫表を定義するものとします。
在庫表を定義するCREATE TABLE文
CREATE TABLE STOCKS.在庫表 ( 製品番号 SMALLINT NOT NULL, ↑ ↑ ↑ ↑ 表名 列名 データ型 列の制約 ↑ 表要素 製品名 NATIONAL CHARACTER(10) NOT NULL, ↑ ↑ ↑ 列名 データ型 列の制約 ↑ 表要素 在庫数量 INTEGER, ↑ ↑ 列名 データ型 ↑ 表要素 倉庫番号 SMALLINT, ↑ ↑ 列名 データ型 ↑ 表要素 PRIMARY KEY(製品番号) ) ↑ 表に対する一意性制約 ↑ 表要素 COMMENT '在庫品とその数量, 格納倉庫の表' ↑ 注釈定義
実表につける名前を指定します。表名には、36文字以内の先頭が英字で始まる英数字、または18文字以内の日本語文字列を指定します。表名は、スキーマ内で一意です。ほかのスキーマに同じ表名の表が定義されていてもかまいません。
スキーマ定義の要素として表定義を記述する場合、スキーマ名で修飾して表名を記述するときは、スキーマ定義で指定したスキーマ名と同じ名前を指定しなければなりません。スキーマ名での修飾を省略して表名を記述するときは、スキーマ定義で指定したスキーマ名で修飾したとみなされます。
表名は、データ操作のSQL文において、操作の対象となる表を指定するために使用します。
いろいろな表名の例
CREATE TABLE STOCK ( … ) (1) CREATE TABLE A1234 ( … ) (2) CREATE TABLE 在庫表( … ) (3) CREATE TABLE ストック( … ) (4) CREATE TABLE すとっく( … ) (5) CREATE TABLE STOCK( … ) (6) CREATE TABLE stock( … ) (7) CREATE TABLE A1234( … ) (8) CREATE TABLE a1234( … ) (9)
(3)~(9)は、日本語の表名です。(6)~(9)は、(1)または(2)と混同しやすいので、使用しないことをお勧めします。
誤った表名指定
CREATE SCHEMA STOCKS CREATE TABLE S.在庫表 ( ... ) ← スキーマ名がSTOCKSではありません。
正しい表名指定
CREATE SCHEMA STOCKS
CREATE TABLE STOCKS.在庫表 ( ... ) ← スキーマ名が一致しています。
CREATE TABLE 発注表 ( ... ) ← スキーマ名省略。スキーマ名は
STOCKSになります。
表を構成する各列について、以下の事項を定義します。
列名
列のデータ型
既定値
列の制約
列の注釈定義
列の定義には、列名と列のデータ型の指定が必要です。ほかの事項は必要に応じて指定します。
列につける名前を指定します。列名には、36文字以内の先頭が英字で始まる英数字、または18文字以内の日本語文字列を指定します。列名は、表内で一意です。
いろいろな列名の例
CREATE TABLE S1.STOCK ( PNO SMALLINT … ) (1) CREATE TABLE S1.STOCK ( COL1 SMALLINT … ) (2) CREATE TABLE S1.STOCK ( 製品番号 SMALLINT … ) (3) CREATE TABLE S1.STOCK ( セイヒン SMALLINT … ) (4) CREATE TABLE S1.STOCK ( せいひん SMALLINT … ) (5) CREATE TABLE S1.STOCK ( PNO SMALLINT … ) (6) CREATE TABLE S1.STOCK ( pno SMALLINT … ) (7) CREATE TABLE S1.STOCK ( COL1 SMALLINT … ) (8)
(3)~(8)は、日本語の列名です。(6)~(8)は、(1)または(2)と混同しやすいので、使用しないことをお勧めします。
列のデータ型を指定します。格納するデータの種類およびデータの大きさ(長さ)によってデータ型を決めます。
参照
指定できるデータ型の詳細については、“Symfoware Server SQLリファレンス”を参照してください。
在庫表の製品名のデータ型を固定長10桁の文字列とする
CREATE TABLE STOCKS.在庫表 (製品名 CHARACTER(10) … )
例1と同じ定義
CREATE TABLE STOCKS.在庫表 (製品名 CHAR(10) … )
在庫表の製品名のデータ型を可変長10桁の文字列とする
CREATE TABLE STOCKS.在庫表 (製品名 CHARACTER VARYING(10) … )
例3と同じ定義
CREATE TABLE STOCKS.在庫表 (製品名 VARCHAR(10) … )
在庫表の製品名のデータ型を固定長10桁の各国語文字列とする
CREATE TABLE STOCKS.在庫表 (製品名 NATIONAL CHARACTER(10) … )
在庫表の製品名のデータ型を可変長10桁の各国語文字列とする
CREATE TABLE STOCKS.在庫表 (製品名 NCHAR VARYING(10) … )
在庫表の製品名のデータ型を可変長1桁の各国語文字列とする
CREATE TABLE STOCKS.在庫表 (製品名 NCHAR VARYING … )
在庫表の在庫数量のデータ型を桁数10、小数点以下2桁の外部10進数とする
CREATE TABLE STOCKS.在庫表 (在庫数量 NUMERIC(10,2) … )
在庫表の在庫数量のデータ型を桁数10、小数点以下2桁の内部10進数とする
CREATE TABLE STOCKS.在庫表 (在庫数量 DECIMAL(10,2) … )
在庫表の在庫数量のデータ型を以下の整数とする
-231~231-1の整数
CREATE TABLE STOCKS.在庫表 (在庫数量 INTEGER … )
-215~215-1の整数
CREATE TABLE STOCKS.在庫表 (在庫数量 SMALLINT … )
在庫表の在庫数量のデータ型を精度22の概数とする
CREATE TABLE STOCKS.在庫表 (在庫数量 FLOAT(22) … )
在庫表の在庫数量のデータ型を倍精度の概数とする
CREATE TABLE STOCKS.在庫表 (在庫数量 DOUBLE PRECISION … )
列の値に対する省略値を指定できます。表に行を挿入するとき、該当列の値が指定されていない場合に、列に設定する値を指定します。
既定値として指定できる値には、定数、ログイン名、NULL値、現在の日付、現在の時刻、現在の時刻印および順序があります。
在庫表の列“製品番号”の列定義の例
CREATE TABLE STOCKS.在庫表 ( 製品番号 INTEGER DEFAULT 10
↑
既定値指定
:
)
在庫表の列“製品番号”に対して、順序を使用した場合の列定義の例
CREATE TABLE STOCKS.在庫表 ( 製品番号 INTEGER DEFAULT STOCKS.順序1.NEXTVAL
↑
既定値指定
:
)
列に対して、格納されるデータについての制約を指定できます。データ型指定のうしろに指定します。列の制約には以下の2つがあります。
列のデータに同じ値が重複して存在することを許さない場合、UNIQUEまたはPRIMARY KEYを指定します。
一意性制約については、あとで詳しく説明します。
注意
表には一意性制約を必ず定義してください。
在庫表の製品番号の列定義の例を以下に示します。製品番号は次のように規定するものとします。
製品番号は8桁以内の整数
製品番号は製品ごとに一意で、製品番号で在庫表の行を一意に特定
製品番号を入力しない行は挿入不可
在庫表の列“製品番号”の列定義の例
CREATE TABLE STOCKS.在庫表 ( 製品番号 INTEGER NOT NULL PRIMARY KEY : )
表中のいくつかの列の組合せに対しての制約(表制約)として一意性制約があります。あるいは、列制約として表の1つの列に対して指定される一意性制約もあります。
一意性制約を指定すると、指定された列または列の組は、同じ値を重複してもつことはできません。指定された列の値または列の組の値は、表中で一意に決定されます。一意性制約はUNIQUEまたはPRIMARY KEYにより指定します。
指定された列または列の組の値について、表の中で同一の値をもつ行が存在することを許さない場合に指定します。指定形式は次のとおりです。
UNIQUE (列名 [ {, 列名} …] )
UNIQUEを指定した列については、列定義においてNOT NULLを指定しておかなければなりません。
“製品番号と製品名の両方がともに一致する行があってはならない”という制約を指定した在庫表を定義する例を以下に示します。
列の組に対して表制約を指定する例
CREATE TABLE STOCKS.在庫表 (…, UNIQUE( 製品番号 , 製品名 )← 表に対する一意性制約 ↑ ↑ 列名 列名
この例のような一意性制約が指定された在庫表には、“図3.16 一意性制約に違反するデータの例”の[3]と[4]のような行を同時に含むことはできません。“図3.16 一意性制約に違反するデータの例”の場合、[3]と[4]の行は、製品番号が両者とも“123”であり、かつ、製品名が両者とも“冷蔵庫”であるため、一意性制約違反となります。[1]と[2]の行は製品名が一致しますが製品番号は異なるので、一意性制約違反にはなりません。同様に[5]と[6]の行および[7]と[8]の行も一意性制約違反にはなりません。なお、一意性制約が、製品番号にだけ指定されている場合には、“図3.16 一意性制約に違反するデータの例”の[3]、[4]および[5]、[6]の行は一意性制約違反となります。
図3.16 一意性制約に違反するデータの例
表の中でその行を一意に決定する列または列の組を主キーといいます。主キーに指定された列または列の組には、表の中で同一の値をもつ行を含むことはできません。指定形式は次のとおりです。
PRIMARY KEY (列名 [ {, 列名} …] )
PRIMARY KEYを指定した列については、列定義においてNOT NULLを指定しておかなければなりません。PRIMARY KEYは表定義中で一度しか指定できません。
在庫表の製品番号に関する一意性制約を表制約で指定する例を以下に示します。
表制約による製品番号の一意性制約の指定例
CREATE TABLE STOCKS.在庫表 (…, PRIMARY KEY ( 製品番号 )← 表に対する一意性制約 ↑ 列名
表に対して、文字列または各国語文字列で注釈を指定することができます。最大256バイトの文字列を指定することができます。文字列と各国語文字列の両方を注釈として指定することもできます。注釈が不要な場合は、指定を省略します。以下に例を示します。
在庫表に、文字列の注釈を指定
CREATE TABLE STOCKS.在庫表 ( 製品番号 SMALLINT NOT NULL, …
COMMENT '在庫品とその数量, 格納倉庫の表')
↑
注釈定義
ビュー表の定義は、CREATE VIEW文を使用して行います。ビュー表の利用目的としては、アプリケーションでのデータ操作を簡易化するため、複数の表を結合して1個の表として処理するため、および、アプリケーションとデータとの独立性を高めるために使用します。
ビュー定義で定義する事項を以下に示します。
表名(ビュー表名)
ビュー列リスト
列名
列の注釈定義
問合せ指定
表(ビュー表)の注釈定義
在庫管理データベースのビュー表の定義の例を以下に示します。在庫表から製品番号および在庫数量の、在庫数量が50以上の行のビュー表を定義します。
大量在庫表(ビュー定義)を定義するCREATE VIEW文
CREATE VIEW STOCKS.大量在庫表 (品番,数量) ↑ ↑ ビュー表の表名 ビュー列リスト COMMENT '在庫数量が50以上のリスト' ↑ 注釈定義 AS SELECT 製品番号,在庫数量 FROM STOCKS.在庫表 WHERE 在庫数量 >= 50 ↑ 問合せ指定
ビュー表につける名前を指定します。表名には、36文字以内の先頭が英字で始まる英数字、または18文字以内の日本語文字列を指定します。ビュー表名はスキーマ内で一意です。
ビュー表名の指定例
CREATE VIEW 大量在庫表 ( … ) CREATE VIEW L.STOCKS ( … )
ビュー表を構成する各列について、列名を指定します。
実表のどの部分をビュー表とするかを問合せ指定で指定します。
ビュー表“大量在庫表”を定義
CREATE VIEW 大量在庫表 (品番,数量) AS SELECT 製品番号,在庫数量 FROM STOCKS.在庫表
在庫表の製品番号および在庫数量をそれぞれ、ビュー表の品番、数量としています。
ビュー表に対して、文字列または各国語文字列で注釈を指定することができます。最大256バイトの文字列を指定することができます。文字列と各国語文字列の両方を注釈として指定することもできます。注釈が不要な場合は、指定を省略します。以下に例を示します。
大量在庫表に文字列の注釈を指定
CREATE VIEW 大量在庫表 (品番,数量) …
COMMENT '在庫数量が50以上のリスト'
↑
注釈定義
トリガ定義は、CREATE TRIGGER文で行います。トリガ定義では、トリガ事象と、起動する手続きを指定します。トリガ事象は、トリガを起動するきっかけとなる表に対するデータの更新方法を指定します。また、起動する手続きは、処理したい手続きを被トリガSQL文で指定します。
ここでは、トリガの利用目的によって、以下のように分類します。
単純なトリガ
プロシジャルーチンを呼び出すトリガ
表に対する更新を契機にして、別の表にデータを挿入するINSERT文を定義して自動的に実行することができます。
トリガの被トリガSQL文にCALL文を指定して、プロシジャルーチンを呼び出すことができます。
プロシジャルーチンを使用することによって、複数のSQL文で構成する処理手続きを被トリガSQL文として定義することができます。また、業務要件に応じたデータの整合性や一貫性を自由にカスタマイズすることができます。
たとえば、データの整合性や一貫性を保証する手続きを定義したプロシジャルーチンをトリガにより呼び出し、表間のデータの整合性を保証したり、更新するデータの値をチェックしたりすることができます。
トリガを使用すると、これらの情報の設定をシステムで自動的に実行することができるため、アプリケーションを簡素化でき、信頼性の高いシステムを構築することができます。
以下に、トリガの定義例を示します。
発注表に追加された行の発注価格が500万を超えている場合、トリガ“発注トリガ”により、その製品の取引先、仕入価格および発注数量を高額発注表に追加します。
トリガ定義例
CREATE TRIGGER STOCKS.発注トリガ AFTER INSERT ON STOCKS.発注表 REFERENCING NEW AS NEWREC FOR EACH ROW WHEN(NEWREC.仕入価格 * NEWREC.発注数量 > 5000000) INSERT INTO STOCKS.高額発注表 VALUES(NEWREC.取引先,NEWREC.仕入価格,NEWREC.発注数量)
発注表に行を挿入すると、トリガ“発注トリガ2”により、プロシジャルーチン“発注ルーチン”を呼び出します。“発注ルーチン”は、挿入データに対して整合性チェックを行います。そして、発注した製品の在庫数量について在庫表を更新します。
プロシジャルーチン定義例
CREATE PROCEDURE STOCKS.発注ルーチン ( IN NEW取引製品 SMALLINT, IN NEW発注数量 SMALLINT ) BEGIN -- SQL変数宣言 DECLARE SQLSTATE CHAR(5); DECLARE SQLMSG CHAR(256); DECLARE POINT SMALLINT; DECLARE S在庫数量 INTEGER; -- 条件宣言 DECLARE 入力発注数量不当 CONDITION FOR SQLSTATE'60001'; DECLARE 入力製品番号不当 CONDITION FOR SQLSTATE'60002'; DECLARE 在庫不足 CONDITION FOR SQLSTATE'60003'; DECLARE その他異常 CONDITION FOR SQLSTATE'60999'; -- ハンドラ宣言 DECLARE EXIT HANDLER FOR NOT FOUND BEGIN IF (POINT = 20 OR POINT = 30) THEN RESIGNAL 入力製品番号不当 '発注: 入力異常: 取引製品の値が不当'; ELSE RESIGNAL その他異常 '発注: 異常: 予想外のデータなし発生'; END IF; END; DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN RESIGNAL; --発生したエラーをそのまま返却する END; -- 本処理 -- (1)入力チェック SET POINT = 10; IF (NEW発注数量 < 1) THEN SIGNAL 入力発注数量不当 '発注: 入力異常: 発注数量の値が不当'; END IF; -- (2)在庫数量チェック SET POINT = 20; SELECT 在庫数量 INTO S在庫数量 FROM STOCKS.在庫表 WHERE 製品番号 = NEW取引製品 WITH OPTION LOCK_MODE(EXCLUSIVE LOCK); IF (NEW発注数量 > S在庫数量) THEN SIGNAL 在庫不足 '発注: 異常: 在庫不足です'; END IF; -- (3)発注作業 SET POINT = 30; UPDATE STOCKS.在庫表 SET 在庫数量 = 在庫数量 - NEW発注数量 WHERE 製品番号 = NEW取引製品; END
トリガ定義例
CREATE TRIGGER STOCKS.発注トリガ2 AFTER INSERT ON STOCKS.発注表 FOR EACH ROW CALL STOCKS.発注ルーチン(NEW.取引製品, NEW.発注数量);
注)“発注ルーチン”が不当な入力値を検出した際、INSERT文は以下のエラーになります。
「JYP1065E スキーマ “STOCKS”のトリガ“発注トリガ2”の被トリガ SQL文でエラーが発生しました.詳細メッセージ= JYP2550E SIGNAL文により例外が送信されました.例外メッセージ=“発注: 異常: 在庫不足です”」
上記のように、プロシジャルーチンとトリガを定義して、表を更新するSQL文を実行すると、被トリガSQL文で指定したプロシジャルーチンが自動的に実行され、データの一貫性を損なうような更新を抑止することができます。また、プロシジャルーチン中で、お互いに参照関係にある表の結合列の存在をチェックして表間のデータの整合性を保証したり、親となる表の行を削除する契機で、対応する子となる表のデータを自動的に削除したりするようなトリガを定義することもできます。
ただし、複雑な業務ロジックは、トリガで定義しないようにしてください。トリガは起動元となった表の更新の延長で動作します。トリガの中でトランザクションを制御することはできません。複雑な業務ロジックはプロシジャルーチンで作成し、アプリケーションから直接プロシジャルーチンをCALLするようにしてください。
トリガの動作
トリガは以下のように動作します。
トリガの実行順序は次のようになります。連鎖的に実行されるトリガである場合でも、各トリガは同じルールで行単位に実行されます。
トリガを定義している表を更新するSQL文が実行されます。
SQL文で影響を受ける行をループします。
SQL文がUPDATEまたはDELETEする行を位置づけます。
定義されているBEFOREトリガを実行します。
1.のSQL文により、行がUPDATEまたはDELETE、あるいはINSERTされます。
定義されているAFTERトリガを実行します。
同一の表に対して、同一のトリガ事象が複数定義された場合、トリガは順不同に実行されます。同じトリガ動作時点を指定したお互いのトリガは実行順序に影響されないように考慮してください。
ユーティリティ機能を利用して、データのロード(rdbsloaderコマンド)およびデータベースの再初期化(rdbfmtコマンド)を実行する場合、その実行の対象となる表にトリガが定義されていても、トリガは作用しません。
トリガを起動する元となったSQL文で更新している表を、被トリガSQL文で更新することはできません。
被トリガSQL文で更新する表にトリガが定義されていると、連鎖的にトリガが実行されます。一度実行されたトリガの延長で、再び同じトリガが実行された場合は、エラーになります。
被トリガSQL文は、トリガを起動するSQL文を実行したトランザクションと同じトランザクションとして動作します。トリガを起動するSQL文にLOCK_MODEを指定している場合は、被トリガSQL文により実行される各SQLデータ操作文に、暗黙的に同じLOCK_MODEが指定されたものとして動作します。
被トリガSQL文で、データベースの更新を行う場合、更新する表に定義されている一意性制約やNOT NULL制約は、SQL文ごとに検査されます。CALL文を指定している場合は、CALL文中のSQL文ごとに制約が検査されます。
被トリガSQL文中でエラーが発生した場合は、トリガを起動する元となったSQL文の実行が取り消され、エラーとなります。被トリガSQL文にCALL文を指定した場合は、呼び出されるプロシジャルーチン内の各SQL文の実行でエラーが発生すると、プロシジャルーチンに指定したエラー処理に従ってSQL文の実行を継続することができます。また、CALL文の実行をエラーにして、トリガを起動する元となったSQL文の実行を取り消し、エラーとすることもできます。
被トリガSQL文にCALL文を指定する場合、呼び出したプロシジャルーチン内で、トランザクションロールバックの例外が発生した場合は(SQLSTATEの例外コードが40)、トリガを起動する元となったSQL文を含むトランザクションが自動的にロールバックされます。
トリガ定義での注意事項を、以下に示します。
トリガを起動する元となったSQL文に副問合せを指定している場合、副問合せで指定している表を被トリガSQL文で更新することはできません。
UPDATE文:探索で表の一意性制約の列を更新すると、SQL文で複数の行を更新している時、一時的にデータの一意性を満たしていない状況が発生することがあります。このような場合に実行されるトリガの被トリガSQL文に指定したCALL文の延長で、トリガを起動する元となった更新中の行を参照すると、一時的に一意性を崩している更新中の行を参照できないことがあります。このため、CALL文で呼び出すプロシジャルーチンで、トリガの起動元となった表の更新後の行を参照する必要がある場合には、CALL文の引数で必要な列の値を受け渡すようにしてください。
トリガ定義時の権限
トリガの定義者は、トリガを定義するスキーマに対するCREATE権、トリガを定義する表に対するTRIGGER権および被トリガSQL文に指定したSQL操作に対応する権限が必要です。
INSERT文を指定する場合:被トリガSQL文で指定する表に対するINSERT権が必要です。
CALL文を指定する場合:被トリガSQL文で指定するプロシジャルーチンに対する実行権が必要です。
被トリガSQL文実行時の権限チェック
あるSQL文がトリガ契機となり、被トリガSQL文が実行された場合、その被トリガSQL文の権限チェックは行われません。アプリケーションの実行者は、被トリガSQL文で指定した表に対する権限は必要ありません。
プロシジャルーチンの定義は、CREATE PROCEDURE文で行います。
参照
プロシジャルーチン機能の詳細は、“Symfoware Server アプリケーション開発ガイド(共通編)”を参照してください。
在庫管理データベースにプロシジャルーチンPROC001を設定する例を以下に示します。
PROC001を定義する例
CREATE PROCEDURE STOCKS.PROC001 ( IN KEY1 INTEGER ) ↑ ↑ ルーチン名 パラメタ宣言 COMMENT '在庫不足の製品の発注依頼' ↑ 注釈定義 BEGIN -+ DECLARE 在庫数量変数 INTEGER; | SELECT 在庫数量 INTO 在庫数量変数 FROM STOCKS.在庫表;|→複合文 : | END -+
プロシジャルーチンに対して、文字列または各国語文字列で注釈を指定することができます。最大256バイトの文字列を指定することができます。文字列と各国語文字列の両方を注釈として指定することもできます。注釈が不要な場合は、指定を省略します。