ページの先頭行へ戻る
PRIMEFLEX for HA Database 業務開発ガイド(Native SQL編)
FUJITSU Integrated System

3.3.6 論理構造の定義

データベーススペースの作成が終了したら、論理構造の定義を行います。論理構造の定義を行うと、その情報がRDBディクショナリに格納されます。

論理構造の定義には、スキーマ定義、順序定義、表定義、ビュー定義、トリガ定義、およびプロシジャルーチン定義があります。

以下に論理構造の定義の流れを示します。

図3.15 論理構造の定義の流れ

スキーマ定義

スキーマはスキーマ名により管理され、1つのデータベースに対して複数個作成することができます。

スキーマ定義は、CREATE SCHEMA文で行います。スキーマ定義では、スキーマを構成する要素として実表およびビュー表の定義を含めて記述します。

順序定義

順序を定義することにより、順序で一意な値を自動的に生成することができます。主キー値の作成に利用できます。

順序定義は、CREATE SEQUENCE文で行います。すでに定義済のスキーマに対して順序定義を追加する場合も、同文で行います。

表定義

表定義では、実表名および実表を構成する列を定義します。1つのスキーマに対して複数個の実表を作成することができます。

表定義は、CREATE TABLE文で行います。

すでに定義済のスキーマに対して表定義を追加する場合も、同文で行います。

ビュー定義

ビュー定義では、ビュー表名およびビュー表を構成する列を定義します。1つのスキーマに対して複数個のビュー表を作成することができます。ビュー定義はCREATE VIEW文で行います。

すでに定義済のスキーマに対してビュー定義を追加する場合も、同文で行います。

トリガ定義

トリガを定義することにより、アプリケーションが行う表の更新処理に連動して、自動的にほかの表にデータを挿入することができます。

トリガ定義は、CREATE TRIGGER文で行います。すでに定義済のスキーマに対してトリガの定義を追加する場合も、同文で行います。

プロシジャルーチン定義

データベースを操作する業務の中には、つねに一定のパターンで処理を行うものもあります。このような一定のパターンの処理を、処理手続きとしてスキーマに定義しておくことができます。この処理手続きを、プロシジャルーチンと呼びます。プロシジャルーチン定義では、スキーマに所属するプロシジャルーチンを定義します。1つのスキーマに対して複数個のプロシジャルーチンを作成することができます。プロシジャルーチン定義は、CREATE PROCEDURE文で行います。

すでに定義済のスキーマに対してプロシジャルーチン定義を追加する場合も、同文で行います。

3.3.6.1 スキーマ定義

スキーマ定義では、スキーマ名の定義、スキーマの注釈定義およびスキーマを構成する以下の要素の定義を行います。

スキーマ名の定義は、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コマンドを使用する場合:

プロシジャルーチン定義は同一の定義ファイルに記述することができません。
プロシジャルーチン定義は別の定義ファイルに記述し、rdbddlexコマンドにxオプションを指定して定義します。

スキーマ名

スキーマ名には、36文字以内の先頭が英字で始まる英数字、または18文字以内の日本語文字列を指定します。

スキーマ名は、データベース内で一意です。

スキーマ名は、SQL文において順序、実表およびビュー表を指定する場合に、順序および表名を修飾する名前として使用します。また、インデックス定義においてインデックスを指定する場合にも、表名を修飾する名前として使用します。

スキーマの注釈定義

スキーマに対して、文字列または各国語文字列で注釈を指定することができます。最大256バイトの文字列を指定することができます。文字列と各国語文字列の両方を注釈として指定することもできます。注釈が不要な場合は、指定を省略します。以下に例を示します。

スキーマ“STOCKS”に注釈を指定

CREATE SCHEMA  STOCKS    COMMENT '在庫管理業務用'
                                    ↑
                                   注釈定義

3.3.6.2 順序定義

順序の定義は、CREATE SEQUENCE文を使用して行います。

順序を定義することにより、順序で一意な値を自動的に生成します。順序は、主キー値の作成に利用できます。

在庫管理データベースに順序を定義する例を以下に示します。スキーマSTOCKSに属する順序1を定義するものとします。

順序を定義する例

CREATE SEQUENCE  STOCKS.順序1
                      ↑
                    順序名

        INCREMENT  BY  1  START   WITH 1
                       ↑              ↑
                     増分値          初期値

順序名

順序につける名前を指定します。順序名には、36文字以内の先頭が英字で始まる英数字、または18文字以内の日本語文字列を指定します。順序名は、スキーマ内で一意です。ほかのスキーマに同じ順序名の順序が定義されていてもかまいません。

3.3.6.3 表定義

実表の定義は、CREATE TABLE文を使用して行います。

表定義で定義する事項を以下に示します。

在庫管理データベースの実表の定義の例を以下に示します。スキーマSTOCKSに属する在庫表を定義するものとします。

在庫表を定義するCREATE TABLE文

CREATE TABLE  STOCKS.在庫表  ( 製品番号   SMALLINT  NOT NULL,
                       ↑         ↑         ↑        ↑
                      表名       列名      データ型   列の制約
                                             ↑
                                           表要素

                              製品名     NATIONAL CHARACTER(10)  NOT NULL,
                                ↑                 ↑                ↑
                               列名             データ型          列の制約
                                                   ↑
                                                 表要素

                              在庫数量   INTEGER,
                                 ↑         ↑
                                列名      データ型
                                       ↑ 
                                     表要素

                              倉庫番号   SMALLINT,
                                 ↑          ↑
                                列名       データ型
                                        ↑
                                      表要素

                              PRIMARY KEY(製品番号) )
                                        ↑
                                表に対する一意性制約
                                        ↑
                                      表要素

                              COMMENT '在庫品とその数量, 格納倉庫の表'
                                                ↑
                                             注釈定義

表名

実表につける名前を指定します。表名には、36文字以内の先頭が英字で始まる英数字、または18文字以内の日本語文字列を指定します。表名は、スキーマ内で一意です。ほかのスキーマに同じ表名の表が定義されていてもかまいません。

スキーマ定義の要素として表定義を記述する場合、スキーマ名で修飾して表名を記述するときは、スキーマ定義で指定したスキーマ名と同じ名前を指定しなければなりません。スキーマ名での修飾を省略して表名を記述するときは、スキーマ定義で指定したスキーマ名で修飾したとみなされます。

表名は、データ操作のSQL文において、操作の対象となる表を指定するために使用します。

例1

いろいろな表名の例

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)と混同しやすいので、使用しないことをお勧めします。

例2

誤った表名指定

CREATE SCHEMA   STOCKS
CREATE TABLE  S.在庫表 ( ... )  ←  スキーマ名がSTOCKSではありません。
例3

正しい表名指定

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リファレンス”を参照してください。

例1

在庫表の製品名のデータ型を固定長10桁の文字列とする

CREATE TABLE  STOCKS.在庫表   (製品名  CHARACTER(10) … )
例2

例1と同じ定義

CREATE TABLE  STOCKS.在庫表   (製品名  CHAR(10) … )
例3

在庫表の製品名のデータ型を可変長10桁の文字列とする

CREATE TABLE  STOCKS.在庫表   (製品名  CHARACTER VARYING(10) … )
例4

例3と同じ定義

CREATE TABLE  STOCKS.在庫表   (製品名  VARCHAR(10) … )
例5

在庫表の製品名のデータ型を固定長10桁の各国語文字列とする

CREATE TABLE  STOCKS.在庫表   (製品名  NATIONAL CHARACTER(10)  … )
例6

在庫表の製品名のデータ型を可変長10桁の各国語文字列とする

CREATE TABLE  STOCKS.在庫表   (製品名  NCHAR VARYING(10) … )
例7

在庫表の製品名のデータ型を可変長1桁の各国語文字列とする

CREATE TABLE  STOCKS.在庫表   (製品名  NCHAR VARYING … )
例8

在庫表の在庫数量のデータ型を桁数10、小数点以下2桁の外部10進数とする

CREATE TABLE  STOCKS.在庫表   (在庫数量  NUMERIC(10,2) … )
例9

在庫表の在庫数量のデータ型を桁数10、小数点以下2桁の内部10進数とする

CREATE TABLE  STOCKS.在庫表   (在庫数量  DECIMAL(10,2) … )
例10

在庫表の在庫数量のデータ型を以下の整数とする

-231~231-1の整数

CREATE TABLE  STOCKS.在庫表   (在庫数量  INTEGER … )

-215~215-1の整数

CREATE TABLE  STOCKS.在庫表   (在庫数量  SMALLINT … )
例11

在庫表の在庫数量のデータ型を精度22の概数とする

CREATE TABLE  STOCKS.在庫表   (在庫数量  FLOAT(22) … )
例12

在庫表の在庫数量のデータ型を倍精度の概数とする

CREATE TABLE  STOCKS.在庫表   (在庫数量  DOUBLE PRECISION … )
既定値

列の値に対する省略値を指定できます。表に行を挿入するとき、該当列の値が指定されていない場合に、列に設定する値を指定します。

既定値として指定できる値には、定数、ログイン名、NULL値、現在の日付、現在の時刻、現在の時刻印および順序があります。

例1

在庫表の列“製品番号”の列定義の例

CREATE TABLE STOCKS.在庫表 ( 製品番号 INTEGER  DEFAULT 10
                                                  ↑
                                              既定値指定
                              :
                             )
例2

在庫表の列“製品番号”に対して、順序を使用した場合の列定義の例

CREATE TABLE STOCKS.在庫表 ( 製品番号 INTEGER  DEFAULT STOCKS.順序1.NEXTVAL
                                                         ↑
                                                     既定値指定
                              :
                             )
列の制約

列に対して、格納されるデータについての制約を指定できます。データ型指定のうしろに指定します。列の制約には以下の2つがあります。

NOT NULL制約:

列のデータにNULL値を許さない場合、NOT NULLを指定します。

一意性制約:

列のデータに同じ値が重複して存在することを許さない場合、UNIQUEまたはPRIMARY KEYを指定します。

一意性制約については、あとで詳しく説明します。

注意

表には一意性制約を必ず定義してください。

在庫表の製品番号の列定義の例を以下に示します。製品番号は次のように規定するものとします。

  • 製品番号は8桁以内の整数

  • 製品番号は製品ごとに一意で、製品番号で在庫表の行を一意に特定

  • 製品番号を入力しない行は挿入不可

在庫表の列“製品番号”の列定義の例

CREATE TABLE  STOCKS.在庫表  ( 製品番号  INTEGER
                                         NOT NULL
                                         PRIMARY KEY
                              :
                             )
列の注釈定義

列に対して、文字列または各国語文字列で注釈を指定することができます。最大256バイトの文字列を指定することができます。文字列と各国語文字列の両方を注釈として指定することもできます。注釈が不要な場合は、指定を省略します。以下に例を示します。

在庫表の“製品番号”列に注釈を指定

CREATE TABLE  STOCKS.在庫表  ( 製品番号 SMALLINT … COMMENT 'PRODUCT-NO' )
                                                             ↑
                                                          注釈定義

一意性制約

表中のいくつかの列の組合せに対しての制約(表制約)として一意性制約があります。あるいは、列制約として表の1つの列に対して指定される一意性制約もあります。

一意性制約を指定すると、指定された列または列の組は、同じ値を重複してもつことはできません。指定された列の値または列の組の値は、表中で一意に決定されます。一意性制約はUNIQUEまたはPRIMARY KEYにより指定します。

UNIQUE

指定された列または列の組の値について、表の中で同一の値をもつ行が存在することを許さない場合に指定します。指定形式は次のとおりです。

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 (列名 [ {, 列名} …]  )

PRIMARY KEYを指定した列については、列定義においてNOT NULLを指定しておかなければなりません。PRIMARY KEYは表定義中で一度しか指定できません。

在庫表の製品番号に関する一意性制約を表制約で指定する例を以下に示します。

表制約による製品番号の一意性制約の指定例

CREATE TABLE  STOCKS.在庫表 (…,

                     PRIMARY KEY ( 製品番号 )← 表に対する一意性制約
                                      ↑
                                     列名

表の注釈定義

表に対して、文字列または各国語文字列で注釈を指定することができます。最大256バイトの文字列を指定することができます。文字列と各国語文字列の両方を注釈として指定することもできます。注釈が不要な場合は、指定を省略します。以下に例を示します。

在庫表に、文字列の注釈を指定

CREATE TABLE  STOCKS.在庫表  ( 製品番号   SMALLINT  NOT NULL, …
                               COMMENT '在庫品とその数量, 格納倉庫の表')
                                                 ↑
                                              注釈定義

3.3.6.4 マルチメディアデータを格納する表の定義

ここでは、画像や音声などのデータを格納する表の定義方法について説明します。これらのデータは、BLOB型の列に格納します。

格納構造がSEQUENTIAL構造で、スキーマS1に製品写真表を定義する例

CREATE TABLE  S1.製品写真表  ( 製品番号  SMALLINT  PRIMARY KEY NOT NULL,
                               製品写真  BLOB(1M) NOT NULL)

ここでは、BLOB型以外の列として、“製品番号”を定義し、1メガバイトのBLOB型の列“製品写真”を定義しています。

3.3.6.5 ビュー定義

ビュー表の定義は、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 ( … )

ビュー列リスト

ビュー表を構成する各列について、列名を指定します。

列名

ビュー表を構成する各列の名前を指定します。列名には、36文字以内の先頭が英字で始まる英数字、または18文字以内の日本語文字列を指定します。列名はビュー表内で一意です。

列名が“品番”および“数量”のビュー表を定義

CREATE VIEW  大量在庫表 (品番, 数量)
列の注釈定義

ビュー表を構成する各列に対して、文字列または各国語文字列で注釈を指定することができます。最大256バイトの文字列を指定することができます。文字列と各国語文字列の両方を注釈として指定することもできます。注釈が不要な場合は、指定を省略します。以下に例を示します。

大量在庫表の“品番”列に注釈を指定

CREATE VIEW  大量在庫表 (品番   COMMENT 'PRODUCT-NO', … )
                                         ↑
                                      注釈定義

問合せ指定

実表のどの部分をビュー表とするかを問合せ指定で指定します。

ビュー表“大量在庫表”を定義

CREATE VIEW  大量在庫表 (品番,数量)
             AS SELECT   製品番号,在庫数量  FROM STOCKS.在庫表

在庫表の製品番号および在庫数量をそれぞれ、ビュー表の品番、数量としています。

表(ビュー表)の注釈定義

ビュー表に対して、文字列または各国語文字列で注釈を指定することができます。最大256バイトの文字列を指定することができます。文字列と各国語文字列の両方を注釈として指定することもできます。注釈が不要な場合は、指定を省略します。以下に例を示します。

大量在庫表に文字列の注釈を指定

CREATE VIEW  大量在庫表 (品番,数量)   …
             COMMENT '在庫数量が50以上のリスト'
                              ↑
                           注釈定義

3.3.6.6 トリガ定義

トリガ定義は、CREATE TRIGGER文で行います。トリガ定義では、トリガ事象と、起動する手続きを指定します。トリガ事象は、トリガを起動するきっかけとなる表に対するデータの更新方法を指定します。また、起動する手続きは、処理したい手続きを被トリガSQL文で指定します。

ここでは、トリガの利用目的によって、以下のように分類します。

単純なトリガ

表に対する更新を契機にして、別の表にデータを挿入するINSERT文を定義して自動的に実行することができます。

プロシジャルーチンを呼び出すトリガ

トリガの被トリガSQL文にCALL文を指定して、プロシジャルーチンを呼び出すことができます。

プロシジャルーチンを使用することによって、複数のSQL文で構成する処理手続きを被トリガSQL文として定義することができます。また、業務要件に応じたデータの整合性や一貫性を自由にカスタマイズすることができます。

たとえば、データの整合性や一貫性を保証する手続きを定義したプロシジャルーチンをトリガにより呼び出し、表間のデータの整合性を保証したり、更新するデータの値をチェックしたりすることができます。

トリガを使用すると、これらの情報の設定をシステムで自動的に実行することができるため、アプリケーションを簡素化でき、信頼性の高いシステムを構築することができます。

以下に、トリガの定義例を示します。

例1 単純なトリガの場合

発注表に追加された行の発注価格が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 プロシジャルーチンを呼び出すトリガの場合

発注表に行を挿入すると、トリガ“発注トリガ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するようにしてください。

トリガの動作

トリガは以下のように動作します。

トリガ定義での注意事項

トリガ定義での注意事項を、以下に示します。

3.3.6.7 プロシジャルーチン定義

プロシジャルーチンの定義は、CREATE PROCEDURE文で行います。

参照

プロシジャルーチン機能の詳細は、“Symfoware Server アプリケーション開発ガイド(共通編)”を参照してください。

在庫管理データベースにプロシジャルーチンPROC001を設定する例を以下に示します。

PROC001を定義する例

CREATE PROCEDURE   STOCKS.PROC001  ( IN  KEY1  INTEGER )
                             ↑              ↑
                         ルーチン名      パラメタ宣言

                    COMMENT '在庫不足の製品の発注依頼'
                                   ↑
                                注釈定義
   BEGIN                                                     -+
     DECLARE 在庫数量変数 INTEGER;                            |
     SELECT  在庫数量  INTO  在庫数量変数 FROM  STOCKS.在庫表;|→複合文
          :                                                   |
   END                                                       -+

プロシジャの注釈定義

プロシジャルーチンに対して、文字列または各国語文字列で注釈を指定することができます。最大256バイトの文字列を指定することができます。文字列と各国語文字列の両方を注釈として指定することもできます。注釈が不要な場合は、指定を省略します。