FrontPage


Firebird SQL リファレンス:CREATE VIEW, DROP VIEW, CREATE GENERATOR, DROP GENERATOR, SET GENERETOR, CREATE SHADOW, DROP SHADOW



CREATE VIEW

 1つまたはいくつかのテーブルよりのデータを得るためのビューを、新規に作成 します。 SQL,DSQL,isqlで使用できます。

構文

CREATE VIEW name [(view_col [, view_col …])]
    AS <select> [WITH CHECK OPTION];


※ DSQLで使用する場合、終端文字のセミコロンは不要です。 isql及びC/C++の埋め込みSQLでは行の終わりを示すために終端文字は必要です。

引数説明
nameビュー名です。データベース内の、すべてのビュー、テーブル、プロシージャにおいて一意である必要があります。
view_colビューの列の名前です。
・各列の名前は、ビューの中で一意である必要があります。
・必要ならば、ビューの中に式を含めることが出来ます。(必須ではありません。)
・デフォルトでは、指定したテーブルの列名が使用されます。
selectビューに対して行を設定する、SELECT を指定します。
WITH CHECK OPTIONビューに対してINSERTやUPDATEを実行する前に、SELECTのWHERE節で指定した条件に合致するかチェックを行うようにします。


詳細の説明

 CREATE VIEW により、データベースのいくつかのテーブルに含まれるデータによる ビューを作成できます。ビュー内の行は、元となるテーブルに対する SELECT により 選択された列から構成されます。
 ビューは、その定義のみがデータベースに格納されます。そのデータは、物理的に はデータベースに格納されません。
 ビューは、テーブルと同様にSELECTや、JOIN,UNIONなどの操作対象に指定すること が出来ます。

 ビューを作成したユーザーは所有者となり、他ユーザーへのGRANTも含めて、すべて の特権(ロール、トリガ、ビュー、ストアドプロシ−ジャ)を保有します。また、それら の特権を与えられたユーザーは、元となったテーブルに対して特権をもたなくても、 ビューにアクセスすることが可能です。
 ただし、ビューの作成時には、

  • リードオンリーのビューの場合、元となるテーブルすべてにSELECT特権が必要です。
  • 更新可能なビューの場合、元となるテーブルすべてにALL特権が必要です。


 view_col の指定を行うことにより、そのビューの列に指定した名前の列が存在する ことを保証できます。
 ビューでの列名指定の順番は、SELECTで指定した列名リストの順番と対応します。 それは前方一致指定となりますので、ビュー内のすべての列名が明示的に指定されて いるとは限りません。

 view_col による列には、出力された2つの列を結合する式を元にしたものを指定 することが出来ます。その式は、1つの値を返す式でなければならず、配列や配列の 要素を返す式であってはなりません。また、ビューに式を含む場合には、列名の指定 は必ず必要となります。
※式で使われる列は、すべて事前に宣言されたものでなければなりません。

 指定するSELECTでは、ORDER BYを使用することは出来ません。

 元の列指定に SELECT * 〜の指定を使用した場合、ビュー内の列の順番はテーブル での順番と同じになります。

 WITH CHECK OPTION を有効にすることにより、ビューで行の追加や更新があった 時に、事前にデータベースエンジンがチェックを行うことが出来ます。 WITH CHECK OPTIONは、リードオンリーであるビューに対しての指定は行わないで 下さい。

※ストアドプロシージャに対するSELECTをベースとしたビューを作成することは 出来ません。

※DSQLでは、UNIONが含まれたビュー定義をサポートしていません。そのような ビューを作成する場合は、埋め込みSQLを使用してください。

 更新可能なビューの場合は以下の条件を満たしている必要があります。これらの 条件が1つでも満たされない場合は、リードオンリーとなります。

  • 1つのテーブルまたは別のビューのサブセットであること。
  • 元となるテーブル中でビューの定義から外された列は、すべてNULL値の設定が 可能であること。
  • ビューのSELECT文には、サブクエリ、DISTNICT、HAVING、集計関数、テーブル結合、 ユーザー定義関数(UDF)、ストアドプロシージャを含まないこと。
    ※リードオンリーのビューでも、ユーザー定義の参照制約、トリガ、ユニーク インデックスなどにより更新することは可能です。

用例

すべて isql での例です。

  • 更新可能なビューを作成しています。
    CREATE VIEW SNOW_LINE (CITY, STATE, SNOW_ALTITUDE) AS
      SELECT CITY, STATE, ALTITUDE
        FROM CITIES WHERE ALTITUDE > 5000;


  • ネストしたクエリを使用したビューです。
    CREATE VIEW RECENT_CITIES AS
      SELECT STATE, CITY, POPULATION
        FROM CITIES WHERE STATE IN
          (SELECT STATE FROM STATES WHERE STATEHOOD > '1-JAN-1850');


  • 一連の動作例です。更新可能なビューに WITH CHECK OPTION を使用し、WHERE句 によるチェックを通らないものを入力できないようにします。
    • WITH CHECK OPTION 付きのビューを作成します。
      CREATE VIEW HALF_MILE_CITIES AS
        SELECT CITY, STATE, ALTITUDE
          FROM CITIES
          WHERE ALTITUDE > 2500
        WITH CHECK OPTION;
    • WITH CHECK OPTION が指定されているので、次の挿入は失敗します。
      INSERT INTO HALF_MILE_CITIES (CITY, STATE, ALTITUDE)
        VALUES ('Chicago', 'Illinois', 250);
    • 次のような挿入は成功します。
      INSERT INTO HALF_MILE_CITIES (CITY, STATE, ALTITUDE)
        VALUES ('Truckee', 'California', 2736);
    • WITH CHECK OPTIONを指定したビューを更新するとき、ビューで指定した検索条件 に合致しない行を更新することは出来ません。次のような更新は失敗します。
      UPDATE HALF_MILE_CITIES
        SET ALTITUDE = 2000
        WHERE STATE = 'NY';


  • 2つのテーブルを結合しているので、リードオンリーのビューとなります。
    CREATE VIEW PHONE_LIST AS
      SELECT EMP_NO, FIRST_NAME, LAST_NAME, PHONE_EXT, LOCATION, PHONE_NO
        FROM EMPLOYEE, DEPARTMENT
        WHERE EMPLOYEE.DEPT_NO = DEPARTMENT.DEPT_NO;


参照

 CREATE TABLE , DROP VIEW , GRANT , INSERT , REVOKE , SELECT , UPDATE


 すべての情報を得るには、Data Definition Guide の views の項を参照して 下さい。






DROP VIEW

 ビュー定義をデータベースから削除します。 SQL,DSQL,isqlで使用できます。

構文

DROP VIEW name;


※ DSQLで使用する場合、終端文字のセミコロンは不要です。 isql及びC/C++の埋め込みSQLでは行の終わりを示すために終端文字は必要です。

引数説明
name削除したい、既存のビューの名前です。


詳細の説明

 DROP VIEW により、ビューが他のビューやストアドプロシージャ、CHECK制約など により現在使用されていない場合に限り、ビューをデータベースから削除することが 出来ます。

 ビューを削除できるのは、作成者、SYSDBAユーザー、およびOSの管理者権限を 持ったユーザーのみです。

用例

 ビューを削除します。

DROP VIEW PHONE_LIST;


参照

 CREATE VIEW






RECREATE VIEW

 既存のビューを破棄せずに、同じ名前で再作成できます。 SQL,DSQLで使用できます。

 構文はCREATE VIEWとまったく同一です。

 使用中のビューを再作成しようとすると失敗します。






CREATE GENERATOR

 データベースで使用するジェネレータを宣言します。 SQL,DSQL,isql で使用可能です。
 この文書は、公開されているIB6のSQLレファレンスを基とし、1.5.1までの 各リリースノートにおける追加内容に関して反映・統合されています。

構文

CREATE GENERATOR name;


※ DSQLで使用する場合、終端文字のセミコロンは不要です。 isql及びC/C++の埋め込みSQLでは行の終わりを示すために終端文字は必要です。

引数説明
nameジェネレータの名前です。データベースで一意である必要があります。


詳細の説明

 CREATE GENERATOR により、データベースにジェネレータを宣言し、その初期値を 0とします。ジェネレータは、組込み関数GEN_ID()を使用した列に対し、自動的に 連続した番号を生成します。ジェネレータは、行を特定する番号として用いる PRIMARY KEYに、ユニークな番号を付与するためによく使用されます。

 データベースには、多数のジェネレータを宣言することが出来ます。ジェネレータ はデータベース内でグローバルなオブジェクトであり、どのトランザクションから でも更新することが出来ます。また、そのように複数のトランザクションで共有して 使用された場合でも、同じ値が割当てられないことが保証されます。

 GEN_ID()を呼び出す書込み時のトリガ、プロシ−ジャ、SQL文のために値を事前に 変更する場合、SET GENERETOR を使用します。

用例

  • isqlでの使用例です。EMPNO_GENというジェネレータを宣言し、トリガの定義の なかで GEN_ID() を呼び出すようにしています。SET TERM は、isqlで終端文字を 変更する文です。 NEW.RMPNOの値は 1から始まり、その後は1づつ加算されていきます。
    CREATE GENERATOR EMPNO_GEN;
    
    COMMIT;
    
    SET TERM !! ;
    
    CREATE TRIGGER CREATE_EMPNO FOR EMPLOYEES
      BEFORE INSERT POSITION 0
      AS BEGIN
      NEW.EMPNO = GEN_ID(EMPNO_GEN, 1);
    
    END
    !!
    SET TERM ; !!


参照

 GEN_ID() , DROP GENERETOR , SET GENERATOR







DROP GENERATOR

 既存のジェネレータをデータベースから削除します。 SQL,DSQL,isql で使用可能です。
 この文書は、1.5.1までのリリースノートにおける追加内容に関して反映・統合 されています。

構文

DROP GENERATOR name;


※ DSQLで使用する場合、終端文字のセミコロンは不要です。 isql及びC/C++の埋め込みSQLでは行の終わりを示すために終端文字は必要です。

引数説明
name削除を行いたい、既存のジェネレータの名前です。


詳細の説明

 DROP GENERETOR により、既存のジェネレータをデータベースから削除します。 これにより確保されていたストレージのエリアは解放され、次回のリストアにより 再利用可能となります。

用例

 ジェネレータの削除を行います。

DROP GENERATOR EMPNO_GEN;

参照

 CREATE GENERATOR






SET GENERATOR

 既存のジェネレータに、新しい値をセットします。 SQL, DSQL, isqlで使用できます。

構文

SET GENERATOR name TO int;


※ DSQLで使用する場合、終端文字のセミコロンは不要です。 isql及びC/C++の埋め込みSQLでは行の終わりを示すために終端文字は必要です。

引数説明
name既存のジェネレータの名前です。
intジェネレータに設定したい値です。設定可能な範囲は、整数値の-2^31〜2^31-1です。


詳細の説明

 SET GENERETOR により、作成済みのジェネレータの値の初期化またはリセットが できます。ジェネレータは、GEN_ID()関数により連続したユニークな番号を提供 します。新しく作成し、SET GENERETOR により初期化を行っていないジェネレータ の開始値は、0となります。

 int は、ジェネレータにセットする新しい値です。挿入や更新での列値の設定 のためにGEN_ID()関数を呼び出すと、GEN_ID()関数で指定したステップで インクリメントされた数値を返します。
 SET GENERATOR で開始値を 0 にセットし、GEN_ID()のステップ値を1とした場合、 最初の GEN_ID() での呼び出しで返る値は 1 となります。

重要  PRIMARY KEY、UNIQUE 制約が設定された列への値設定に使用されている既存の ジェネレータに値をセットするとき、新設定値が適当なものでない場合は、既存の 行と同じ値が生成され、新しい挿入や更新が失敗する場合がありますので注意して 下さい。

用例

 isqlでの例です。ジェネレータの値を1,000に設定します。次回のGEN_ID()呼び出し をステップ値 1 で行った場合、得られる値は 1,001 となります。

SET GENERATOR CUST_NO_GEN TO 1000;


参照

 CREATE GENERATOR , CREATE PROCEDURE , CREATE TRIGGER , GEN_ID()






CREATE SHADOW

 データベースの複製をいくつか作成します。コピーは非同期に行われます。 SQL,DSQL,isqlで使用できます。
 情報が少ないため、IB6 の Data Definition Guide 、Operation Gide からの 情報を元に、独自かつ大幅に補足しました。

構文

CREATE SHADOW set_num [AUTO | MANUAL] [CONDITIONAL]
    'filespec' [LENGTH [=] int [PAGE[S]]]
    [<secondary_file>];
<secondary_file> = FILE 'filespec' [<fileinfo>] [<secondary_file>]
<fileinfo> = LENGTH [=] int [PAGE[S]]
             | STARTING [AT [PAGE]] int [<fileinfo>]


※ DSQLで使用する場合、終端文字のセミコロンは不要です。 isql及びC/C++の埋め込みSQLでは行の終わりを示すために終端文字は必要です。


引数説明
set_numシャドウセットの番号を表す正の整数。以降の指定するものは、すべてこの番号のシャドウセットに所属します。
AUTO省略時のデフォルト指定です。指定を行うと、シャドウが使用できない場合はデータベースがデフォルトアクセス動作をするようになります。
・すべての接続やアクセスは成功します。
・シャドウに対するすべての参照が削除され、シャドウファイルとの接続が切断されます。
MANUAL指定を行うと、シャドウが利用可能になる、もしくはすべてのシャドウに対する参照が無くなるまで、データベースへの接続やアクセスは失敗します。
CONDITIONALプライマリ(主)なシャドウが利用できなくなった場合や、ディスク異常によりデータベースをシャドウに交代する場合、シャドウ機能を継続したまま新しいシャドウを作成します。
'filespec'シャドウファイルの完全なパス名とファイル名です。ローカルなファイルを指定する必要があります。ノードの指定を含んだり、ネットワークファイルシステムを指定することは出来ません。また、詳細の説明も読んでください。
LENGTH [=] int [PAGE[S]]追加するシャドウファイルのサイズを、データベースのページ数で指定します。ページサイズはデータベースの設定に依存します。
secondary_fileセカンダリ(二次)シャドウファイルのパス名とサイズを指定します。セカンダリファイルの指定を同時に行う場合、サイズ指定はプライマリファイルに対してのみ行います。
STARTING [AT [PAGE]] intセカンダリシャドウファイルの、格納を開始するページ番号を指定します。


構文

 CREATE SHADOW により、二次的な記憶装置にいくつかのデータベースのコピーを 作成することによって、(記憶装置の故障などが原因である)データベースアクセス が不可能になるという事態を防ぎます。そのデータベースコピーはシャドウセット と呼ばれ、1つまたはいくつかのファイルで構成されます。各シャドウセットには、 一意な整数の番号が振られます。
 シャドウの作成は、データベースの排他アクセスを必要としないため、いつでも 行うことが出来ます。

 ディスクのシャドウは以下の3つのコンポーネントから成り立っています。

  • シャドウ化するデータベース
  • システムテーブルのRDB$FILES。(シャドウファイルのリストとデータベースの その他の情報を格納)
  • シャドウセット。1つまたはいくつかのシャドウファイルから成り立ちます



 CREATE SHADOW が実行されると、データベースに最も最近接続された アプリケーションのためにシャドウを設置します。シャドウセットは1つまたは いくつかのファイルで構成されます。ディスク装置に故障が発生した場合、 データベース管理者(DBA)は、シャドウセットをデータベースと交代させるために ディスク上のシャドウを活性化します。 (訳注:gfixコマンドなどの管理ツールにより活性化できます)。 もし CONDITIONAL が指定された場合は、データベース管理者(DBA)がシャドウの 活性化によりデータベースの交代を行うときに、データベースのための新しい シャドウが設置されます。

 データベースのサイズがシャドウを作成するディスクに納まりきれない場合は、 secondary_file 指定を行うことにより、複数ファイル構成のシャドウファイルを 定義できます。複数ファイル構成のシャドウファイルは、各々別のディスク装置 に格納することも出来ます。

※既存のディスクシャドウにセカンダリファイルを追加したい場合は、DROP SHAOW で一度削除した後に、CREATE SHADOW により所望するファイル数で構成された シャドウを再作成することにより実現します。

 シャドウファイルは、Windows 等のNFS以外のシステムにおいては、データベース と同じホストに設置する必要があります。ファイルの指定にホスト指定を含んだり、 マッピングされたドライブを指定することは出来ません。
 UNIX/Linuxでは、NFSでマウントされたディレクトリに設置することは可能です。 しかし、(障害以外に排他アクセス問題などの)NFSに関するトラブルがあった場合 にはシャドウが永遠に失われる危険があります。そのため、これは推奨できる運用 ではありません。

 データベースのシャドウファイルは、データベースファイル本体と同様の理由で 使用できなくなる場合があります。例えば、ディスク障害、ネットワーク障害、 過失による削除などの理由です。
 AUTO/MANUALの指定を行うことにより、シャドウで異常が発生した時の動作が指定 できます。指定を省略した場合、AUTOを指定したものとみなされます。

  • AUTO指定
     シャドウの操作が不可能となった場合でも、データベースへのアクセスはそのまま 継続出来ます。
     オリジナルのシャドウを作成するときに CONDITIONAL 指定が同時に行われた場合 は、新しいシャドウが自動的に作成されます。指定を行わなかった場合は、手動で シャドウを作成する必要があります。
  • MANUAL指定
     障害時のデータベース連続運用の保証よりも、(データベース内容のより確実な 信頼性と継続性を重視するために)シャドウ処理の継続性が重要である場合、 MANUAL指定によるマニュアルモードは非常に有効です。マニュアルモードでは、 シャドウの操作が不可能な状態になると、以後のデータベースへの接続が不可能 となります。
     データベースに接続できるようにするためには、データベース管理者が古い シャドウファイルの削除とそれらへの参照を削除し、新しいシャドウを作成しな ければなりません。

 シャドウを作成するときに CONDITIONAL 指定を行った場合、それは条件付の シャドウとなり、データベースの交代が行われるときに自動的に新たなシャドウ を作成します。これにより、シャドウ処理は自動継続します。
 条件付のシャドウにおいてシャドウが自動作成されるのは、つぎの2つのケース のいずれかまたは両方の場合です。

  • データベースファイル本体またはいずれかのシャドウファイルが使用できない 状態に陥った場合
  • ハードウェア異常のため、シャドウがデータベースの処理を引き継いだ場合

用例

 すべて、isqlでの例です。

  • シングル構成(employee.shd)のシャドウファイル(シャドウセット1)を作成します。
    CREATE SHADOW 1 AUTO 'employee.shd';
  • シングル構成(employee.shd)、AUTO、CONDITIONAL指定のシャドウファイル (シャドウセット2)を作成します。
    CREATE SHADOW 2 CONDITIONAL 'employee.shd' LENGTH 1000;
  • マルチファイル構成のシャドウセットを作成します。
    • セカンダリファイルの開始ページを指定しています。
      CREATE SHADOW 3 AUTO 'employee.sh1'
          FILE 'employee.sh2' STARTING AT PAGE 1000
          FILE 'employee.sh3' STARTING AT PAGE 2000;
    • プライマリや最終以外のセカンダリファイルのサイズを指定しています。
      CREATE SHADOW 4 MANUAL 'employee.sdw' LENGTH 1000
          FILE 'employee.sh1' LENGTH 1000
          FILE 'employee.sh2';


シャドウの活性化(障害時の交代)

 この項は、Data Definition Guideの、Activating a shadowの訳をベースとして います。

 データベースが何らかの理由で使用不可能になったときは、作成済みのシャドウ を活性化することによりデータベースのオペレーションを再開できます。これは、 「SYSDBAユーザー」または「データベースの所有者」としてログインを行った gfixコマンドに、-active (または -a)オプションをつけて実行することにより 実現されます。

重要 シャドウを活性化する前に、メインデータベースが使用不可となって いるかを忘れずにチェックしましょう。メインデータベースが使用可能な状態で あるときにシャドウが活性化されると、その前後や最中にメインデータベースと 接続しているアプリケーションなどにより、シャドウが不適当な状態に陥る場合が ありえます。

 gfix でシャドウを活性化する場合には、シャドウのプライマリファイルのみを 1つ指定します。(マルチファイル構成のシャドウの場合も同様です。)
 例えば、employee.fdb というデータベースのシャドウ(employee.shd) を活性化 する場合、次のようなコマンドを実行します。ちなみに、通常はログインする ユーザー名やパスワードのオプション指定(-user,-password)も同時に必要です。

gfix -a employee.shd

 シャドウの活性化を行った後は、その名前をオリジナルのデータベースと同じ名前 に変更することが推奨されています。そして、別のドライブ装置が使用可能である ならば、新たなシャドウをその別ドライブに作成するべきです。

参照

 DROP SHADOW


 これ以上の情報が欲しい場合は、Operations Guide や Data Definition Guide の using shadows の項を参照して下さい。






DROP SHADOW

 データベースのシャドウを削除します。 SQL,DSQL,isqlで使用できます。
 情報が少ないため、IB6 の Operation Guide からの情報を元に、独自に 補足しました。

構文

DROP SHADOW set_num;


※ DSQLで使用する場合、終端文字のセミコロンは不要です。 isql及びC/C++の埋め込みSQLでは行の終わりを示すために終端文字は必要です。

引数説明
set_num既存のシャドウセットを識別するための、正の整数番号


詳細の説明

 DROP SHADOW により、シャドウセットを削除してシャドウ処理から切り離します。
 isql で SHOW DATABASE コマンドを打ち込むことにより、データベースで使用中の シャドウセットを参照できます。

 シャドウの削除を行うと、メタデータの削除と同時にシャドウファイル自体の削除 も行われます。そのため、削除を行った場合は、これを回復させることは出来なく なります。しかし、シャドウは単にメインデータベースのコピーであるので、通常は ほとんど問題となりません。

 シャドウを削除できるのは、作成者、SYSDBA ユーザー、または OS のルート権限を 所有するユーザーのみです。

用例

 isqlで、データベースのシャドウセットを削除する例です。

DROP SHADOW 1;


参照

 CREATE SHADOW