データベース・サーバーは、データベース操作の実行時にトランザクションを開始します。したがって、このタイムスタンプは内部トランザクションの時間を表す場合があります。 |
- 診断領域は、各複数文プロシージャの開始時点でクリアされます。
- GET DIAGNOSTICS文は、複数文プロシージャの複合文でのみ使用できます。
- 例外により複数文プロシージャがすぐに終了させられるため、RETURNED_SQLCODEまたはRETURNED_SQLSTATEにより警告メッセージのみが返されます。プロシージャが正常に終了した場合、RETURNED_SQLCODEまたはRETURNED_SQLSTATEにより成功メッセージが返されます。
例1: GET DIAGNOSTICS文を使用した行カウントの取得
PROCEDURE increate_nh (SQLSTATE, :rows_affected INTEGER); BEGIN ATOMIC UPDATE salary_history SET salary_amount = salary_amount * 1.05 WHERE salary_end IS NULL AND employee_id IN (SELECT employee_id FROM employees WHERE state = 'NH' ); GET DIAGNOSTICS :rows_affected = ROW_COUNT; END;
例2: RETURNED_SQLSTATEの使用
SQL> DECLARE :Y CHAR(5); SQL> BEGIN cont> SET :Y = 'Hello'; cont> GET DIAGNOSTICS EXCEPTION 1 :Y = RETURNED_SQLSTATE; cont> END; SQL> PRINT :Y; Y 00000 SQL>
例3: RETURNED_SQLCODEの使用
SQL> DECLARE :X INTEGER; SQL> BEGIN cont> SET :X = 100; cont> GET DIAGNOSTICS EXCEPTION 1 :X = RETURNED_SQLCODE; cont> END; SQL> PRINT :X; X 0
例4: 現行の接続名の返し
SQL> CONNECT TO 'ATTACH FILENAME mf_personnel' AS 'my_connection'; SQL> DECLARE :conn_name VARCHAR(20); SQL> BEGIN cont> GET DIAGNOSTICS :conn_name = CONNECTION_NAME; cont> END; SQL> PRINT :conn_name; CONN_NAME my_connection
例5: TRANSACTION_TIMESTAMPオプションおよびTRANSACTION_SEQUENCEオプションの使用
SQL> set transaction read write; SQL> show transaction Transaction information: Statement constraint evaluation is off On the default alias Transaction characteristics: Read Write Transaction information returned by base system: a read-write transaction is in progress - updates have not been performed - transaction sequence number (TSN) is 0:256 - snapshot space for TSNs less than 0:256 can be reclaimed - recovery unit journal filename is USER2:[RDM$RUJ]SCRATCH$00018679B3AD.RUJ;1 - session ID number is 8 SQL> SQL> declare :x date vms; SQL> SQL> begin get diagnostics :x = transaction_timestamp; end; SQL> print :x; X 27-MAY-1999 22:39:17.02 SQL> SQL> declare :y bigint; SQL> SQL> begin get diagnostics :y = transaction_sequence; end; SQL> print :y; Y 256 SQL> SQL> select current_timestamp from rdb$database; 27-MAY-1999 22:39:18.20 1 row selected SQL> SQL> commit;
例6: HOT_STANDBY_MODEオプションおよびSERVER_IDENTIFICATIONオプションの使用
SQL> set flags 'trace'; SQL> declare :id, :hsmode char(31); SQL> begin cont> get diagnostics :id = SERVER_IDENTIFICATION, cont> :hsmode = HOT_STANDBY_MODE; cont> trace :id, :hsmode; cont> end; ~Xt: Oracle Rdb V7.1 NONE
例7: LIMIT_CPU_TIMEオプション、LIMIT_ROWS_FETCHEDオプションおよびLIMIT_ELAPSED_TIMEオプションの使用
SQL> set flags 'trace'; SQL> set query execution limit elapsed time 10 minutes; SQL> begin cont> declare :row_limit integer; cont> declare :elapsed_limit integer; cont> declare :cpu_limit integer; cont> get diagnostics cont> :cpu_limit = LIMIT_CPU_TIME, cont> :row_limit = LIMIT_ROWS_FETCHED, cont> :elapsed_limit = LIMIT_ELAPSED_TIME; cont> trace 'LIMIT_ROWS_FETCHED: ', :row_limit; cont> trace 'LIMIT_CPU_TIME: ', :cpu_limit; cont> trace 'LIMIT_ELAPSED_TIME: ', :elapsed_limit; cont> end; ~Xt: LIMIT_ROWS_FETCHED: 0 ~Xt: LIMIT_CPU_TIME: 0 ~Xt: LIMIT_ELAPSED_TIME: 600 SQL>
例8: 複合文でのTRACE_ENABLEDキーワードの使用
SQL> declare :x integer; SQL> begin cont> get diagnostics :x = TRACE_ENABLED; cont> end; SQL> print :x; X 0 SQL> set flags 'trace'; SQL> begin cont> get diagnostics :x = TRACE_ENABLED; cont> end; SQL> print :x; X 1
OpenVMS DCL記号または論理名により定義された値およびSQLセッション値を、ローカルで宣言されたSQL変数にロードします。
GET ENVIRONMENT文は、対話型SQLでのみ使用できます。
SESSION
対話型SQLセッションの選択されたオプションを返すようにGET ENVIRONMENTに指示します。このオプションを使用すると、SQLスクリプト実行中のセッション状態を保存してリストアできます。TRACE
変数のデータ型への変換の前に変換された文字列値を表示します。これはデータ変換エラーの診断の際に役立ちます。この表示は、ローカル記号、グローバル記号、論理名またはセッション値のいずれから結果が導出されたかを示します。次に例を示します。
SQL> GET ENVIRONMENT (TRACE) cont> :xx indicator :xx_ind = XX; 01: XX = XX "--" (Local) %RDB-E-ARITH_EXCEPT, truncation of a numeric value at runtime -COSI-F-INPCONERR, input conversion error
次の表は、GET ENVIRONMENT (SESSION)からの出力を受け入れる関連SETコマンドを示しています。このコマンドにより、SQLスクリプト内でのSETコマンド使用後の環境をアプリケーションで再設定できます。GET ENVIRONMENTから返される文字列値の詳細は、リストされているSETコマンドを参照してください。
表6-8 GET ENVIRONMENTのSESSIONキーワード SESSIONキーワード 関連SETコマンド DEFAULT_CATALOG SET CATALOG CONSTRAINT_MODE SET DEFAULT CONSTRAINT MODE CHARACTER_LENGTH SET CHARACTER LENGTH COMPOUND_TRANSACTIONS SET COMPOUND TRANSACTION DATE_FORMAT SET DEFAULT DATE FORMAT DEFAULT_CONSTRAINT_MODE SET DEFAULT CONSTRAINT MODE DIALECT SET DIALECT HOLD_CURSORS SET HOLD CURSOR NULL_STRING SET DISPLAY NULL STRING QUIET_COMMIT SET QUIET COMMIT QUOTING_RULES SET QUOTING RULES KEYWORD_RULES SET KEYWORD RULES DEFAULT_SCHEMA SET SCHEMA DEFAULT_ALIAS SET ALIAS
- NULLインジケータが指定されていない場合にDCL記号または論理名が見つからないときは、エラーがレポートされます。次に例を示します。
SQL> GET ENVIRONMENT cont> :x = THE_TIME; %SQL-F-UNDEFVAR, Variable THE_TIME is not defined -LIB-F-NOSUCHSYM, no such symbol
- 指定した記号が定義されていない場合に、変数に対してINDICATORが指定されているときは、インジケータは設定されますが、変数は変更されないままです。次に例を示します。
SQL> GET ENVIRONMENT :xx indicator :xx_ind = XX; SQL> SQL> PRINT :xx, :xx_ind; XX XX_IND 0 1
TRACEオプションが使用されると、記号の値はNULLとして表示されます。- 指定された変数は、DECLARE文を使用して定義されたローカル変数である必要があります。次に例を示します。
SQL> DECLARE :xx, :xx_ind INTEGER;
識別子はDCL記号または論理名であると想定されています。最初に記号名として変換され、失敗した場合は論理名として変換されます。変換が成功すると、文字列の結果が変数のデータ型に変換されます。名前は、OpenVMS DCLネーミング規則により定義されたルールに準拠する必要があります。
複数の割当てをカンマで区切って指定できます。
例1: GET ENVIRONMENT文の使用
$ emp_id = "00164" $ SQL$ SQL> ATTACH 'FILENAME MF_PERSONNEL'; SQL> DECLARE :e CHAR(5); SQL> GET ENVIRONMENT :e = emp_id; SQL> SELECT last_name, first_name FROM employees WHERE employee_id = :e; LAST_NAME FIRST_NAME Toliver Alvin 1 row selected SQL> ROLLBACK;
例2: SESSIONオプションの使用
この例ではSESSIONオプションを使用してDIALECTを保存し、SQLスクリプトの完了時にリストアします。
SQL> declare :Rdb_DIALECT char(10); SQL> get environment (session) :Rdb_DIALECT = DIALECT; SQL> set dialect 'SQL92'; SQL> -- get SQL92 semantics for UNIQUE constrain SQL> create table T (a integer unique); SQL> set dialect :Rdb_DIALECT; SQL> undeclare :Rdb_DIALECT;
オブジェクトのアクセス制御に権限またはロールを追加します。
次の注意事項は、すべてのGRANT文に適用されます。
- LIST、DEFAULTまたはRDB$SYSTEMのいずれかの記憶域が読取り専用に設定されている場合、GRANT文を実行できません。最初にこれらの記憶域を読取り/書込みに設定する必要があります。一部のデータベースではRDB$SYSTEMもデフォルトになり、記憶域をリストする場合があります。
- OpenVMS SYSPRV権限のあるユーザーは、暗黙的にDBADMデータベース権限のあるユーザーと同じ権限を受領します。
OpenVMS OPER権限のあるユーザーは、暗黙的にSELECTデータベース権限、INSERTデータベース権限、UPDATEデータベース権限およびDELETEデータベース権限を受領します。
OpenVMS SECURITY権限のあるユーザーは、暗黙的にSECURITYデータベース権限のあるユーザーと同じ権限を受領します。
OpenVMS BYPASS権限のあるユーザーは、暗黙的にすべての権限を受領します。ただし、Oracle Rdb DBADMデータベース権限とSECURITYデータベース権限およびDBCTRLデータベース権限およびDBCTRL表権限は除きます。
OpenVMS READALL権限のあるユーザーは、暗黙的にOracle Rdb SELECTデータベース権限とOracle Rdb SELECT表権限およびSHOWデータベース権限とSHOW表権限を受領します。- SELECT、INSERT、UPDATEおよびDELETEのデータ操作権限では、SQLは、特定の表へのアクセスを許可する前にデータベースと個々の表のアクセス権限セットをチェックします。たとえば、EMPLOYEES表を含むデータベースのSELECT権限が取り消されると、EMPLOYEES表自体のSELECT権限は所有していても、表の行の読取りができなくなります。
- SHOW PROTECTION文およびSHOW PRIVILEGES文に変更が表示されても、再度データベースにアタッチするまではACLへの追加と変更が有効になりません。他のユーザーに対してACLへの追加と変更が有効になるのは、他のユーザーが再度データベースにアタッチした後です。
- GRANT文は読取り/書込みトランザクションで実行する必要があります。アクティブなトランザクションがない場合にこの文を発行すると、SQLでは、直近のDECLARE TRANSACTION文で指定された特性を持つトランザクションが開始されます。
アクセス制御リスト(ACL)と呼ばれる、データベース、表、ビュー、列、モジュールまたは外部ルーチンに対するOracle Rdbアクセス権限セットのエントリに、権限を作成または追加します。ACLの各エントリは、識別子とその識別子に割り当てられた権限のリストで構成されます。
- 各識別子では、ユーザーまたはユーザーのセットが指定されます。
- 権限のリストでは、データベース、表、ビュー、列、モジュールまたは外部ルーチンに対して、ユーザーまたはユーザー・グループが実行可能な操作が指定されます。
ユーザーがデータベースで操作を実行しようとすると、SQLは、関連付けられているACLを上から下まで読み取って、そのユーザーの識別子を各エントリと比較します。SQLが最初の一致対象を見つけると、ただちにそのエントリにリストされている権限を付与して検索を中止します。以前のエントリと一致しない識別子はすべて、最終的に(SQLキーワードPUBLICと等しく)エントリ[*,*]になります。識別子[*,*]を持つエントリがない場合、一致していない識別子のユーザーは、データベース、表、ビュー、列、モジュールまたは外部ルーチンへのすべてのアクセスを拒否されます。
このため、エントリとリスト内でのその順序が重要になります。
Oracle Rdbのデフォルトの保護体系では、新しいデータベース、表、ビュー、列、モジュールまたは外部ルーチンを作成すると、DBCTRLを含め、そのオブジェクトに対するすべてのアクセス権を受領します。そのオブジェクトのすべての他のユーザーにはアクセス権が付与されません。Oracle Rdbのデフォルトの保護体系で作成された表やビューの場合、表やビューの作成者はDBCTRLを含め、そのオブジェクトに対するすべてのアクセス権を受領し、他のすべてのユーザーにはアクセス権が付与されません。
DBCTRLアクセス権により、オブジェクトの作成者は他のユーザーにDBCTRLを付与できます。データベース内に作成する新しい表のデフォルトの保護設定を調整する方法の詳細は、「使用方法」を参照してください。
データベース、表、列、モジュールまたは外部ルーチンに対するOracle Rdbアクセス権限セットのエントリから権限を削除する場合、またはエントリを完全に削除する場合は、「REVOKE文」を参照してください。
GRANT文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- 非ストアドSQLモジュールの非ストアド・プロシージャの一部として
- 動的SQLで動的に実行される文として
AFTER identifier
AFTER PUBLIC
POSITION n
変更または作成されるACL内のエントリの位置を指定します。AFTER引数またはPOSITION引数を使用すると、リスト内の位置を指定できます。SQLはこの位置を起点として、GRANT文のTO句で指定された識別子と一致する識別子を含むACLエントリを検索します。
AFTER引数とPOSITION引数に関する固有の情報は次のとおりです。
- AFTER引数では、識別子によってACL内のエントリが指定されます。SQLは、変更または作成するエントリの検索をこのエントリの後から開始します。AFTER引数で指定された識別子と一致する識別子を持つACLエントリがない場合、SQLはエラーを生成し、その文は失敗します。
SQLは、AFTER引数の識別子で指定されたエントリの後からACLのエントリの検索を開始します。GRANT文のTO句で指定された識別子と一致する識別子を持つエントリがある場合、SQLはGRANT文で指定された権限のみを含む新規エントリを作成します。SQLはACLに最初に出現するエントリのみを保持し、重複する識別子を持つエントリを削除します。
GRANT文のTO句で指定された識別子と一致する識別子を持つエントリがない場合は、SQLはAFTER引数で指定された識別子の直後に新規ACLエントリを作成します。
PUBLICの指定は、すべてのユーザー識別子のワイルドカード指定に相当します。- POSITION引数では、変更または作成するエントリのACL内での最初の相対位置が整数で指定されます。
SQLは、POSITION引数で指定された位置からACLのエントリの検索を開始します。GRANT文のTO句で指定された識別子と一致する識別子を持つエントリがある場合、SQLはGRANT文で指定された権限のみを含む新規エントリを作成します。SQLはACLに最初に出現するエントリのみを保持し、重複する識別子を持つエントリを削除します。
GRANT文のTO句で指定された識別子と一致する識別子を持つエントリがない場合、SQLはPOSITION引数で指定された相対位置でその識別子に対する新規ACLエントリを作成します(SQLが検索を開始する位置の前にあるエントリが一致する識別子を持つ場合でも同様です)。
リスト内のエントリの数よりも大きな位置を指定した場合、SQLはそのエントリをACLの最後に配置します。たとえば、リストに10個のエントリがある場合に12の位置を指定すると、新しいエントリは11の位置に配置され、その位置番号が与えられます。- AFTER引数またはPOSITION引数を省略すると、SQLは、ACL全体で、GRANT文のTO句で指定された識別子リストと一致する識別子リストを検索します。一致対象が見つかると、SQLは、権限リストで指定された権限が権限リストに存在していない場合は追加して、ACLエントリを変更します。一致対象がない場合、SQLはACLの先頭に新規エントリを作成します。
ALL PRIVILEGES
SQLがACLエントリの権限をすべて付与するように指定します。general-identifier
システム上のユーザーのグループを識別します。この識別子は、システム権限のデータベースのOpenVMSシステム・マネージャによって定義されます。次に、汎用識別子の例を示します。DATAENTRY
SECRETARIES
MANAGERSON SEQUENCE sequence-name
名前付きシーケンスのACLにGRANT文を適用するかどうかを指定します。ON DATABASE ALIAS *
ON TABLE *
ON MODULE *
ON FUNCTION *
ON PROCEDURE *
ON SEQUENCE *
指定された型のすべてのオブジェクトのACLにGRANT文を適用するかどうかを指定します。一部のオブジェクトで操作の権限が拒否された場合、GRANTは中断されます。db-privs
table-privs
column-privs
module-privs
ext-routine-privs
sequence-privs
既存のACLエントリに追加する、または新しいACLエントリに作成する権限リストを指定します。特定の権限キーワードで許可される操作は、その権限がデータベース、表、列、モジュール、外部ルーチンまたはシーケンスのいずれに付与されているかで異なります。表6-9に、データベース、表、列、モジュール、外部ルーチンおよびシーケンスに対する権限キーワードおよびその意味を示します。
表6-9 データベース、表、列、モジュール、外部ルーチンおよびシーケンスに対するSQL権限 権限 データベースのアクセス権限セットで付与する権限の内容 表、列、ビュー、モジュール、外部ルーチンまたはシーケンスのアクセス権限セットで付与する権限の内容 ALTER データベース・パラメータの変更またはドメインの変更。 表、索引または記憶域マップの変更。モジュール、外部ルーチンまたはシーケンスの変更。列権限には適用されない。 CREATE カタログ、スキーマ、表、ドメイン、照合順番、記憶域、外部ルーチン、モジュールまたはシーケンスの作成。 ビュー、トリガー、索引、シーケンス、記憶域マップまたは表を使用するアウトラインの作成。列権限には適用されない。 DBADM 名前付きオブジェクトでのデータ操作またはデータ定義操作の実行。多数のデータベース権限を無視。 適用不可。ただし、構文的には許可される。 DBCTRL データベースのアクセス権限セット・エントリの作成、削除または変更。 表、シーケンス、モジュールまたは外部ルーチンのアクセス権限セット・エントリの付与または取消し。列権限には適用されない。 DELETE データベースに定義された表からのデータの削除。 表からのデータの削除。列権限には適用されない。 DISTRIBTRAN データベースに対する分散(2フェーズ・コミットのプロトコル)トランザクションの実行。 適用不可。 DROP カタログ、スキーマ、ドメイン、照合順番またはパス名の削除。 表、索引または表を使用するアウトラインの削除。ビュー、列、制約、トリガー、シーケンスまたは記憶域マップの削除。ビュー、モジュール、外部ルーチンまたはシーケンスの削除。 EXECUTE 適用不可。 モジュールまたは外部ルーチンの実行の許可。列権限、順序権限または表権限には適用されない。 INSERT データベースに定義された表へのデータの格納。 表へのデータの格納。列権限または順序権限には適用されない。 OPERATOR 適用不可。構文的には許可されるが、実装されない。今後のバージョンのため予約。 適用不可。構文的には許可されるが、実装されない。今後のバージョンのため予約。 REFERENCES 適用不可。ただし、構文的には許可される。 表または列のデータを参照する制約の定義。LIKE句を使用する表の定義。それらのオブジェクトを参照するシノニムの定義。 SECURITY 多数のデータベース権限を無視。 適用不可。 SELECT データベースへのアタッチとそのデータベースに定義された表からのデータの読取り。 表からのデータの読取りまたはシーケンスのNEXTVAL疑似列およびCURRVAL疑似列の参照。列権限には適用されない。 SHOW 適用不可。構文的には許可されるが、実装されない。今後のバージョンのため予約。 適用不可。構文的には許可されるが、実装されない。今後のバージョンのため予約。 UPDATE データベースに定義された表のデータの更新。 表または列のデータの更新。