ストアド・ファンクションの値を返します。
RETURN制御文は、次の環境の複合文で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
value-expr
このファンクション・コールの結果として返される値式です。value-exprは、ストアド・ファンクションのRETURNS句で定義されたデータ型と代入互換性を持つ必要があります。値式の詳細は、第2.6節を参照してください。
- RETURN文は、ストアド・ファンクションの定義時の必須構文です。
- 条件式が原因でRETURN文が実行されない場合は、実行時に例外が発生します。
- RETURN文は、ストアド・ファンクション内でのみ使用できます。
- RETURN文をストアド・ファンクション定義のRETURNS句と混同しないでください。RETURNS句はファンクションのデータ型を定義します。RETURN句は結果を返すために実行されます。
例1: ストアド・ファンクションでのRETURN文の指定
SQL> CREATE MODULE utility_functions cont> LANGUAGE SQL cont> FUNCTION abs (IN :arg INTEGER) RETURNS INTEGER cont> COMMENT 'Returns the absolute value of an integer'; cont> BEGIN cont> RETURN CASE cont> WHEN :arg < 0 THEN - :arg cont> ELSE :arg cont> END; cont> END; . . . cont> END MODULE;
データベース・オブジェクトのOracle Rdbアクセス制御リスト(ACL)のエントリから権限を削除するか、またはエントリを完全に削除します。アクセス制御リストの各エントリは、識別子(またはロール)とその識別子に割り当てられた権限のリストで構成されます。
- 各識別子では、ユーザーまたはユーザーのセットが指定されます。
- 権限のリストでは、データベース、表、列、モジュール、プロシージャ、ファンクションまたは順序に対して、ユーザーまたはユーザー・グループが実行可能な操作が指定されます。
ユーザーがデータベースで操作を実行しようとすると、SQLは、関連付けられているACLを上から下まで読み取って、そのユーザーの識別子を各エントリと比較します。SQLが最初の一致対象を見つけると、ただちにそのエントリにリストされている権限を付与して検索を中止します。前のエントリと一致しないすべての識別子はその後のエントリと比較され、一致しない場合は(失敗の結果として)エントリ[*,*]の権限がこれらの識別子に付与されます(このエントリが存在する場合)。ユーザー識別子[*,*]を持つエントリがない場合、一致していないユーザー識別子は、データベース、表または列へのすべてのアクセスを拒否されます。このため、エントリとリスト内でのその順序が重要になります。
データベース・オブジェクトのOracle Rdbアクセス制御リストでのエントリ作成またはエントリへの権限追加の詳細は、「GRANT文」を参照してください。
REVOKE文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- 非ストアドSQLモジュールの非ストアド・プロシージャの一部として
- 動的SQLで動的に実行される文として
AFTER identifier
AFTER PUBLIC
POSITION n
ACL内のエントリの位置を指定します。AFTER引数またはPOSITION引数を省略すると、SQLは、ACL全体で、REVOKE文のFROM句で指定された識別子リストと一致する識別子リストを検索します。一致対象が見つかると、SQLは、権限リストで指定された権限を削除して、ACLエントリを変更します。一致対象がない場合、SQLはエラーを生成し、REVOKE文はACLに影響しません。AFTER引数またはPOSITION引数を使用すると、リスト内の位置を指定できます。SQLはこの位置を起点として、REVOKE文のFROM句で指定された識別子と一致する識別子を含むACLエントリを検索します。
- AFTER引数では、識別子によってACL内のエントリが指定されます。SQLは、変更または削除するエントリの検索をこのエントリの後から開始します。AFTER引数で指定された識別子と一致する識別子を持つACLエントリがない場合、SQLはエラーを生成し、その文は失敗します。
SQLは、AFTER引数の識別子で指定されたエントリの後からACLのエントリの検索を開始します。REVOKE文のFROM句で指定された識別子と一致する識別子を持つエントリがある場合、SQLはそのACLエントリを変更または削除します。
REVOKE文のFROM句で指定された識別子と一致する識別子を持つエントリがない場合、SQLはエラーを生成し、その文は失敗します(SQLが検索を開始する位置の前にあるエントリが一致する識別子を持つ場合でも同様です)。
PUBLICの指定は、すべてのユーザー識別子のワイルドカード指定に相当します。- POSITION引数では、変更または削除するエントリのACL内での最初の相対位置が整数で指定されます。この整数がACL内のエントリの数よりも大きい場合、SQLはエラーを生成し、その文は失敗します。
SQLは、POSITION引数で指定された位置からACLのエントリの検索を開始します。REVOKE文のFROM句で指定された識別子と一致する識別子を持つエントリがある場合、SQLはそのACLエントリを変更または削除します。
REVOKE文のFROM句で指定された識別子と一致する識別子を持つエントリがない場合、SQLはエラーを生成し、その文は失敗します(SQLが検索を開始する位置の前にあるエントリが一致する識別子を持つ場合でも同様です)。
ALL PRIVILEGES
SQLがACLエントリの権限をすべて取り消すように指定します。REVOKE ALL PRIVILEGES文は、REVOKE ENTRY文とは異なります。REVOKE ALL PRIVILEGES文では、エントリ全体はACLから削除されません。識別子は残りますが、権限は削除されます。空のACLエントリでは、識別子が一致しているユーザーのアクセスがすべて拒否されます。その後、ACLのエントリにPUBLICアクセスが付与された場合でも同様です。ENTRY
識別子を含むエントリ全体をACLから削除します。FROM identifier
FROM PUBLIC
変更または削除するACLエントリの識別子を指定します。PUBLICの指定は、すべてのユーザー識別子のワイルドカード指定に相当します。次の4種類の識別子を指定できます。
- ユーザー識別子
- 汎用識別子
- システム定義識別子
- ロール名
複数の識別子を指定するには、各識別子をプラス記号(+)で結合します。これらの識別子は複数識別子と呼ばれます。 この識別子では、個々の識別子によって定義されたグループすべてに共通するユーザーのみが識別されます。識別子すべてと一致しないユーザーは、そのエントリによって制御されません。
たとえば、複数識別子SECRETARIES + INTERACTIVEでは、対話型プロセスの汎用識別子SECRETARIESで定義されたグループのメンバーのみが指定されます。対話型プロセスではないSECRETARIESグループのメンバーは識別されません。
識別子の詳細は、使用中のオペレーティング・システムのドキュメントを参照してください。
general-identifier
システム上のユーザーのグループを識別します。この識別子は、システム権限のデータベースのOpenVMSシステム・マネージャによって定義されます。次に、汎用識別子の例を示します。
- DATAENTRY
- SECRETARIES
- MANAGERS
ON DATABASE ALIAS alias
ON TABLE table-name
ON COLUMN column-name
ON MODULE module-name
ON FUNCTION ext-routine-name
ON PROCEDURE ext-routine-name
ON SEQUENCE sequence-name
データベース・オブジェクトのACLにREVOKE文を適用するかどうかを指定します。ON句の任意の形式に対する名前のリストを指定できます。少なくとも関連表名を使用して列名を修飾する必要があります。ON DATABASE ALIAS *
ON TABLE *
ON MODULE *
ON FUNCTION *
ON PROCEDURE *
ON SEQUENCE *
指定された型のすべてのオブジェクトのACLにREVOKE文を適用するかどうかを指定します。db-privs
table-privs
column-privs
module-privs
ext-routine-privs
sequence-privs-ansi
既存のACLエントリから削除する権限のリストを指定します。特定の権限キーワードで許可される操作は、その権限がデータベース、表、列、モジュール、外部ルーチン、または順序のいずれに付与されているかで異なります。「GRANT文」の表6-9には、データベース、表、モジュール、列、外部ルーチンおよび順序の権限キーワードとその意味が示されています。列レベルで明確に付与されている列レベルの権限のみを取り消すことができます。
SELECT、INSERTおよびDELETEのデータ操作権限では、SQLは、特定の表へのアクセスを許可する前にデータベースと個々の表のACLをチェックします。たとえば、EMPLOYEES表を含むデータベースのSELECT権限が取り消されると、EMPLOYEES表自体のSELECT権限は所有していても、表の行の読取りができなくなります。
データ操作権限のUPDATEとREFERENCESを取り消すには、少なくともデータベースへの読取りアクセス権と該当する列の権限が必要です。
作成するデータベース、表、モジュール、外部ルーチンまたは順序のDBCTRL権限をユーザー自身が拒否することはできません。
SELECT権限は、他のすべての権限の前提条件です。SELECT権限を取り消すと、事実上、権限リストで指定されている権限も含めてすべての権限を拒否します。この制限によって、機能すると予想したREVOKE文が失敗する場合があります。たとえば、次のREVOKE文は、所有者のACLエントリのSELECT権限を取り消そうとしたために失敗します。この文の失敗は、表のDBCTRLを所有者に対して暗黙的に拒否したことに原因があります。
SQL> REVOKE SELECT ON EMPLOYEES FROM serle; %RDB-E-NO_PRIV, privilege denied by database facility
role-name
ロールの名前です。CREATE ROLE文で作成されたロール名などが該当します。オペレーティング・システムのグループまたは権利の識別子としてロール名が存在する場合、Oracle RdbではGRANT文の発行時にロールが自動的に作成されます。自動的に作成されるロールは、常にIDENTIFIED EXTERNALLYの属性を持ちます。system-identifier
システムのインストール時に権限データベースが作成される際に、OpenVMSシステムによって自動的に定義されます。システム定義識別子は、実行するログインのタイプに応じて割り当てられます。有効なすべてのシステム定義識別子を次に示します。
- BATCH
- NETWORK
- INTERACTIVE
- LOCAL
- DIALUP
- REMOTE
user-identifier
システム上の各ユーザーを一意に識別します。ユーザー識別子は、標準のOpenVMSのユーザー識別コード(UIC)、グループ名およびメンバー名(ユーザー名)で構成されます。グループ名はオプションです。ユーザー識別子には、数値形式または英数字形式を使用できます。次に、同じユーザーを識別する有効なすべてのユーザー識別子を示します。
K_JONES
[SYSTEM3, K_JONES]
[341,311]ユーザー識別子の一部としてアスタリスク(*)のワイルドカード文字を使用できます。たとえば、OpenVMSシステムの1つのグループ内のすべてのユーザーを指定する場合は、識別子として[341,*]を入力できます。
Oracle Rdbでは、データベースの作成時に識別子[*,*]を含むACLエントリが自動的に作成されます。このエントリによって、DBCTRLを除くすべての権限がすべてのユーザーに付与されます。
複数のユーザー識別子を複数識別子で使用することはできません。
- ストアド・モジュールのルーチンに対してREVOKE権限を使用することはできません。かわりにモジュールに対してREVOKEを使用します。
Oracle Rdbデータベースの保護の詳細は、『Oracle Rdb7 Guide to Database Design and Definition』のデータベース権限の定義に関する章を参照してください。
例1: REVOKEを使用したデータベースおよび表へのユーザー・アクセスの管理
SQL> attach 'filename DB$:MF_PERSONNEL'; SQL> SQL> -- examine current privileges SQL> show protection on database RDB$DBHANDLE; Protection on Alias RDB$DBHANDLE (IDENTIFIER=SQLNET4RDB,ACCESS=SELECT+INSERT+UPDATE+DELETE+SHOW+CREATE+ALTER+ DROP+DBCTRL+OPERATOR+DBADM+SECURITY+DISTRIBTRAN) (IDENTIFIER=[DOC,DOC_READER],ACCESS=SELECT+CREATE) (IDENTIFIER=[DOC,DOC_WRITER],ACCESS=SELECT+INSERT+UPDATE+DELETE+SHOW+CREATE+ ALTER+DROP+DBCTRL+OPERATOR+DBADM+REFERENCES) (IDENTIFIER=[*,*],ACCESS=SELECT+INSERT+UPDATE+DELETE+SHOW+CREATE+ALTER+DROP+ OPERATOR+DBADM+REFERENCES) SQL> SQL> -- revoke selected privileges SQL> revoke CREATE on database alias RDB$DBHANDLE from DOC_WRITER; SQL> revoke DISTRIBTRAN on database alias RDB$DBHANDLE from DOC_REVIEWER; SQL> show protection on database RDB$DBHANDLE; Protection on Alias RDB$DBHANDLE (IDENTIFIER=SQLNET4RDB,ACCESS=SELECT+INSERT+UPDATE+DELETE+SHOW+CREATE+ALTER+ DROP+DBCTRL+OPERATOR+DBADM+SECURITY+DISTRIBTRAN) (IDENTIFIER=[DOC,DOC_READER],ACCESS=SELECT) (IDENTIFIER=[DOC,DOC_WRITER],ACCESS=SELECT+INSERT+UPDATE+DELETE+SHOW+ALTER+ DROP+DBCTRL+OPERATOR+DBADM+REFERENCES) (IDENTIFIER=[*,*],ACCESS=SELECT+INSERT+UPDATE+DELETE+SHOW+CREATE+ALTER+DROP+ OPERATOR+DBADM+REFERENCES) SQL> SQL> -- No longer all access to DOC_REVIEWER, use wildcard for all tables SQL> revoke ALL PRIVILEGES on table * from DOC_REVIEWER; SQL> commit;
例2: ユーザーのDROP順序権限の取消し
SQL> CREATE SEQUENCE EMPID; SQL> SHOW PROTECTION ON SEQUENCE EMPID Protection on Sequence EMPID (IDENTIFIER=[RDB,STUART],ACCESS=SELECT+SHOW+ALTER+DROP+DBCTRL) (IDENTIFIER=[*,*],ACCESS=NONE) SQL> GRANT SELECT ON SEQUENCE EMPID TO PUBLIC; SQL> SHOW PROTECTION ON SEQUENCE EMPID; Protection on Sequence EMPID (IDENTIFIER=[RDB,STUART],ACCESS=SELECT+SHOW+ALTER+DROP+DBCTRL) (IDENTIFIER=[*,*],ACCESS=SELECT) SQL> REVOKE DROP ON SEQUENCE EMPID FROM STUART; SQL> SHOW PROTECTION ON SEQUENCE EMPID; Protection on Sequence EMPID (IDENTIFIER=[RDB,STUART],ACCESS=SELECT+SHOW+ALTER+DBCTRL) (IDENTIFIER=[*,*],ACCESS=SELECT)
特定のユーザーがデータベース・オブジェクトに対して付与したOracle Rdbアクセス制御リストの権限を削除します。ANSI/ISOスタイルのアクセス権限セットの各エントリは、識別子とその識別子に割り当てられた権限のリストで構成されます。
- 各識別子では、ユーザーまたはPUBLICキーワードが指定されます。
- 権限のセットでは、データベース、表、列、モジュール、プロシージャ、ファンクションまたは順序に対して、ユーザーまたはユーザー・グループが実行可能な操作が指定されます。
ANSI/ISOスタイルのデータベースの場合、アクセス権限セットは順序に依存しません。アクセス権限セットのエントリと一致したユーザーは、データベース・オブジェクトに付与されているすべての権限およびPUBLICについて定義されている権限を取得します。アクセス権限セットにエントリがないユーザーは、PUBLICについて定義されている権限のみを取得します。PUBLIC識別子は、データベース・オブジェクトにアクセスできなくても、常にアクセス制御リストのエントリを持ちます。
データベース・オブジェクトのOracle Rdbアクセス制御リストでのエントリ作成またはエントリへの権限追加の詳細は、「GRANT文: ANSI/ISOスタイル」を参照してください。
REVOKE文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- 非ストアドSQLモジュールの非ストアド・プロシージャの一部として
- 動的SQLで動的に実行される文として
ALL PRIVILEGES
SQLがアクセス権限セットのエントリの権限をすべて取り消すように指定します。FROM identifier-ansi-style
FROM PUBLIC
変更または削除するアクセス権限セットのエントリの識別子を指定します。PUBLICの指定は、すべてのユーザー識別子のワイルドカード指定に相当します。唯一の識別子は、OpenVMSのユーザー識別コード(UIC)に変換される識別子です。
ユーザー識別子の詳細は、オペレーティング・システムのドキュメントを参照してください。
ON DATABASE ALIAS alias
ON TABLE table-name
ON COLUMN column-name
ON MODULE module-name
ON FUNCTION ext-routine-name
ON PROCEDURE ext-routine-name
ON SEQUENCE sequence-name
データベース・オブジェクトのACLにREVOKE文を適用するかどうかを指定します。ON句の任意の形式に対する名前のリストを指定できます。少なくとも関連表名を使用して列名を修飾する必要があります。ON DATABASE ALIAS *
ON TABLE *
ON MODULE *
ON FUNCTION *
ON PROCEDURE *
ON SEQUENCE *
指定された型のすべてのオブジェクトのACLにREVOKE文を適用するかどうかを指定します。一部のオブジェクトで操作の権限が拒否された場合、REVOKEは中断されます。ただし、オブジェクトによっては保護の変更が適用されます。db-privs-ansi
table-privs-ansi
column-privs-ansi
module-privs-ansi
ext-routine-privs-ansi
sequence-privs-ansi
既存のアクセス権限セットのエントリから削除する権限のリストを指定します。特定の権限キーワードで許可される操作は、その権限がデータベース、表、列、モジュール、ルーチン、または順序のいずれに付与されているかで異なります。「GRANT文」の表6-9には、データベース、表、モジュールおよび外部ルーチンの権限キーワードとその意味が示されています。user-identifier
システム上の各ユーザーを一意に識別します。ユーザー識別子は、標準のOpenVMSのユーザー識別コード(UIC)、グループ名およびメンバー名(ユーザー名)で構成されます。グループ名はオプションです。ユーザー識別子には、数値形式または英数字形式を使用できます。次に、同じユーザーを識別する有効なすべてのユーザー識別子を示します。
K_JONES
[SYSTEM3, K_JONES]
[341,311]Oracle Rdbでは、データベースの作成時にPUBLIC識別子を含むアクセス権限セットのエントリが自動的に作成されます。このエントリによって、DBCTRLを除くすべての権限がすべてのユーザーに付与されます。PUBLIC識別子は、アクセス権限セットのデータベースで使用可能な唯一のワイルドカードです。
複数のユーザー識別子を複数識別子で使用することはできません。
- 列レベルで明確に付与されている列レベルの権限のみを取り消すことができます。
- データ操作権限のUPDATEとREFERENCESを取り消すには、少なくともデータベースへの選択アクセス権と該当する列の権限が付与されている必要があります。
- WITH GRANT OPTION句で権限を付与された権限受領者の権限が取り消されると、その権限受領者から権限を付与されたすべてのユーザーから同様にその権限が取り消されます(ただし、これらのユーザーが、その権限をまだ保持している別のユーザーからもその権限を付与されている場合は除きます)。
- ストアド・モジュールのルーチンに対してREVOKE権限を使用することはできません。かわりにモジュールに対してREVOKEを使用します。
Oracle Rdbデータベースの保護の詳細は、『Oracle Rdb7 Guide to Database Design and Definition』のデータベース権限の定義に関する章を参照してください。
例1: REVOKE文を使用したユーザー・アクセスの管理
SQL> attach 'filename DB$:ANSI_PERSONNEL'; SQL> SQL> -- examine current privileges SQL> show protection on database RDB$DBHANDLE; Protection on Alias RDB$DBHANDLE [DOC,DOC_WRITER]: With Grant Option: SELECT,INSERT,UPDATE,DELETE,SHOW,CREATE,ALTER,DROP, DBCTRL,OPERATOR,DBADM,SECURITY,DISTRIBTRAN Without Grant Option: SELECT,INSERT,UPDATE,DELETE,SHOW,CREATE,ALTER,DROP, DBCTRL,OPERATOR,DBADM,SECURITY,DISTRIBTRAN [DOC,DOC_READER]: With Grant Option: NONE Without Grant Option: SELECT,CREATE [*,*]: With Grant Option: NONE Without Grant Option: NONE SQL> SQL> -- revoke selected privileges SQL> revoke CREATE on database alias RDB$DBHANDLE from DOC_READER; SQL> revoke DISTRIBTRAN on database alias RDB$DBHANDLE from DOC_WRITER; SQL> show protection on database RDB$DBHANDLE; Protection on Alias RDB$DBHANDLE [DOC,DOC_WRITER]: With Grant Option: SELECT,INSERT,UPDATE,DELETE,SHOW,CREATE,ALTER,DROP, DBCTRL,OPERATOR,DBADM,SECURITY Without Grant Option: SELECT,INSERT,UPDATE,DELETE,SHOW,CREATE,ALTER,DROP, DBCTRL,OPERATOR,DBADM,SECURITY [DOC,DOC_READER]: With Grant Option: NONE Without Grant Option: SELECT [*,*]: With Grant Option: NONE Without Grant Option: NONE SQL> SQL> -- prevent drop by revoking the privilege SQL> revoke DROP on table * from DOC_READER; SQL> commit;
例2: WITH GRANT OPTION句で付与された権限の取消し
WITH GRANT OPTION句で権限を付与された権限受領者rdb_docの権限が取り消されると、その権限受領者から権限を付与されたすべてのユーザーから同様にその権限が取り消されます。
SQL> SHOW PROTECTION ON TABLE EMPLOYEES; [*,*]: With Grant Option: NONE Without Grant Option: SELECT [SQL,WARRING]: With Grant Option: SELECT,INSERT,UPDATE,DELETE,SHOW,CREATE,ALTER, DROP,DBCTRL,OPERATOR,DBADM,REFERENCES Without Grant Option: SELECT,INSERT,UPDATE,DELETE,SHOW,CREATE,ALTER, DROP,DBCTRL,DBADM,REFERENCES [RDB,RDB_DOC]: With Grant Option: SHOW Without Grant Option: NONE SQL> SQL> REVOKE SHOW ON EMPLOYEES FROM [rdb,rdb_doc]; SQL> SHOW PROTECTION ON EMPLOYEES; Protection on Table EMPLOYEES [*,*]: With Grant Option: NONE Without Grant Option: SELECT [RDB,RDB_DOC]: With Grant Option: NONE Without Grant Option: NONE
例3: 列の権限の取消し
この例は、特定の列に付与されているUPDATE権限を取り消すことにより、その列の権限を制限する方法を示しています。
SQL> SHOW PROTECTION ON COLUMN EMPLOYEES.EMPLOYEE_ID; [RDB,RDB_DOC]: With Grant Option: NONE Without Grant Option: UPDATE SQL> REVOKE UPDATE ON COLUMN EMPLOYEES.EMPLOYEE_ID FROM [rdb,rdb_doc]; SQL> SHOW PROTECTION ON COLUMN EMPLOYEES.EMPLOYEE_ID; [RDB,RDB_DOC]: With Grant Option: NONE Without Grant Option: NONE
例4: ユーザーの順序のDROP権限の取消し
この例は、ANSIスタイルのデータベースのSEQUENCEに対するREVOKEのアクションを示しています。
SQL> create sequence EMPLOYEE_ID_GEN; SQL> grant select on sequence EMPLOYEE_ID_GEN to public; SQL> grant all privileges on sequence EMPLOYEE_ID_GEN to stuart; SQL> show protection on sequence EMPLOYEE_ID_GEN; Protection on Sequence EMPLOYEE_ID_GEN [DOCS,STUART]: With Grant Option: NONE Without Grant Option: SELECT,SHOW,ALTER,DROP,DBCTRL,REFERENCES [DOCS,FREEMAN]: With Grant Option: SELECT,SHOW,ALTER,DROP,DBCTRL,REFERENCES Without Grant Option: NONE [*,*]: With Grant Option: NONE Without Grant Option: SELECT SQL> revoke drop on sequence EMPLOYEE_ID_GEN from stuart; SQL> show protection on sequence EMPLOYEE_ID_GEN; Protection on Sequence EMPLOYEE_ID_GEN [DOCS,STUART]: With Grant Option: NONE Without Grant Option: SELECT,SHOW,ALTER,DBCTRL,REFERENCES [DOCS,FREEMAN]: With Grant Option: SELECT,SHOW,ALTER,DROP,DBCTRL,REFERENCES Without Grant Option: NONE [*,*]: With Grant Option: NONE Without Grant Option: SELECT SQL>