ヘッダーをスキップ
Oracle Rdb SQLリファレンス・マニュアル
リリース7.2
E06178-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

列の権限は、特定の列ACLに対して指定された権限との組合せで表に対して定義された権限によって決まります。

SELECT権限は、UPDATEおよびREFERENCESを除く他のすべてのデータ操作の前提条件です。SELECT権限を付与しないと、事実上、権限リストで指定されている権限も含めて、SELECT、INSERTおよびDELETEの各権限を拒否します。SELECT権限をユーザー自身が拒否することはできません。

SELECT、INSERT、UPDATEおよびDELETEのデータ操作権限では、SQLは、特定の表へのアクセスを許可する前にデータベースと個々の表のACLをチェックします。たとえば、EMPLOYEES表のSELECT権限を付与された場合、EMPLOYEES表を含むデータベースのSELECT権限も所有している場合を除き、表の行の選択ができません。

表に対するUPDATE権限のあるユーザーは、表のすべての列に対して自動的にUPDATE権限を受領します。列を更新するには、列または表に対するUPDATE権限が必要です。ただし、UPDATE権限は、ユーザーによる更新が可能な特定の列のみを定義し、表エントリからUPDATE権限を削除することによって制限できます。

列のデータは、列に対するUPDATE権限およびデータベースに対するSELECT権限でのみ変更できます。

REFERENCES権限により、ANSI/ISOスタイルの権限のあるデータベースの制約を定義できます。ACLスタイルの権限のあるデータベースでは、制約を定義するにはCREATE権限が必要です。

作成するデータベースまたは表のDBCTRL権限をユーザー自身が拒否することはできません。この制限によって、機能すると予想したGRANT文が失敗する場合があります。

たとえば、ACLにPUBLICのエントリがないとします。DBCTRL権限を含まないACLの最上部にPUBLICのエントリを作成し、所有者を含むリストのすべての他のエントリのDBCTRLを事実上拒否しているため、次のGRANT文は失敗します。


SQL> GRANT SELECT, INSERT ON EMPLOYEES TO PUBLIC;
%RDB-E-NO_PRIV, privilege denied by database facility

role-name

ロールの名前です。CREATE ROLE文で作成されたロール名または自動作成されるロール名などが該当します。(オペレーティング・システムのグループまたは権利の識別子としてロール名が存在する場合、GRANT文が発行されると、Oracle Rdbではロールが自動的に作成されます。自動的に作成されるロールは、常にIDENTIFIED EXTERNALLYの属性を持ちます。)

TO identifier

TO PUBLIC

新規または変更されたACLエントリの識別子を指定します。PUBLICの指定は、すべてのユーザー識別子のワイルドカード指定に相当します。

次の4種類の識別子を指定できます。

複数の識別子を指定するには、各識別子をプラス記号(+)で結合します。これらの識別子は複数識別子と呼ばれます。 この識別子では、個々の識別子によって定義されたグループすべてに共通するユーザーのみが識別されます。識別子すべてと一致しないユーザーは、そのエントリによって制御されません。

たとえば、複数識別子SECRETARIES + INTERACTIVEでは、対話型プロセスの汎用識別子SECRETARIESで定義されたグループのメンバーのみが指定されます。対話型プロセスではないSECRETARIESグループのメンバーは識別されません。

次の引数は3種類の識別子を簡潔に説明します。識別子の詳細は、使用中のオペレーティング・システムのドキュメントを参照してください。

system-identifier

システムのインストール時に権限データベースが作成される際に、OpenVMSシステムによって自動的に定義される識別子を指定します。システム定義識別子は、実行するログインのタイプに応じて割り当てられます。有効なすべてのシステム定義識別子を次に示します。
BATCH
NETWORK
INTERACTIVE
LOCAL
DIALUP
REMOTE

user-identifier

システム上の各ユーザーを識別します。

ユーザー識別子は、標準のOpenVMSのユーザー識別コード(UIC)、グループ名およびメンバー名(ユーザー名)で構成されます。グループ名はオプションです。ユーザー識別子には、数値形式または英数字形式を使用できます。次に、同じユーザーを識別する有効なすべてのユーザー識別子を示します。

K_JONES
[SYSTEM3, K_JONES]
[341,311]

ユーザー識別子の一部としてアスタリスク(*)のワイルドカード文字を使用できます。たとえば、1つのグループ内のすべてのユーザーを指定する場合は、識別子として[system3, *]を入力できます。

Oracle Rdbでは、データベースの作成時に識別子[*,*](PUBLICとも呼ばれる)を含むACLエントリが自動的に作成されます。このエントリによって、システム上のすべてのユーザーに付与する権限を指定します。

複数のユーザー識別子を複数識別子で使用することはできません。


使用方法


例1: ACLの変更を有効にするためのデータベースの再宣言

この例では、GRANT文およびREVOKE文が有効になるのは、再度データベースにアタッチした後であることを示しています。


SQL> -- Display the ACL for the EMPLOYEES table:
SQL> SHOW PROTECTION ON TABLE EMPLOYEES;
Protection on Table EMPLOYEES
    (IDENTIFIER=[sql,warring],ACCESS=SELECT+INSERT+UPDATE+DELETE+SHOW+CREATE+
      ALTER+DROP+DBCTRL+DBADM+REFERENCES)
    (IDENTIFIER=[*,*],ACCESS=SELECT+INSERT+UPDATE+DELETE+ALTER+DROP)
SQL>
SQL> -- User warring, the owner of the database, denies
SQL> -- herself INSERT access to the EMPLOYEES table:
SQL> REVOKE INSERT ON TABLE EMPLOYEES FROM warring;
SQL> COMMIT;
SQL>
SQL> -- The SHOW PROTECTION statement displays the change
SQL> -- (INSERT is no longer part of the ACL entry
SQL> -- for warring):
SQL> SHOW PROTECTION ON TABLE EMPLOYEES;
Protection on Table EMPLOYEES
    (IDENTIFIER=[sql,warring],ACCESS=SELECT+UPDATE+DELETE+SHOW+CREATE+ALTER+
      DROP+DBCTRL+DBADM+REFERENCES)
    (IDENTIFIER=[*,*],ACCESS=SELECT+INSERT+UPDATE+DELETE+ALTER+DROP)
SQL>
SQL> -- But the change is not yet effective.
SQL> -- User warring can still store rows in the EMPLOYEES table:
SQL> INSERT INTO EMPLOYEES (EMPLOYEE_ID) VALUES ('99999');
1 row inserted
SQL> SELECT EMPLOYEE_ID
cont>   FROM EMPLOYEES
cont>   WHERE EMPLOYEE_ID = '99999';
 EMPLOYEE_ID
 99999
1 row selected
SQL> ROLLBACK;
SQL>
SQL> -- To make the ACL change take effect, issue another ATTACH statement
SQL> -- to override the current declaration:
SQL> ATTACH 'FILENAME personnel';
This database context has already been declared.
Would you like to override this declaration (No)? Y
SQL>
SQL> -- Now warring cannot insert new rows into the EMPLOYEES table:
SQL> INSERT INTO EMPLOYEES (EMPLOYEE_ID) VALUES ("99999");
%RDB-E-NO_PRIV, privilege denied by database facility
SQL>
SQL> -- A GRANT statement gives all privileges back to warring:
SQL> GRANT ALL ON TABLE EMPLOYEES TO warring;
SQL> COMMIT;

例2: SQLコマンド・ファイルを使用したACLの作成

次のSQLコマンド・ファイルでは、デフォルトの別名RDB$DBHANDLEを指定して、デフォルト・データベースのACLを作成します。ACLエントリの順序付けには、次の2つの一般的ガイドラインを使用します。

SQLではリストを上から下まで読み取るため、特定の識別子があるエントリを前に、一般的な識別子があるエントリを後ろに配置する必要があります。たとえば、最も一般的なユーザー識別子[*,*]をリストの最初に配置すると、すべてのユーザーがそれに一致し、Oracle Rdbはそこに指定されたすべてのアクセス権をすべてのユーザーに付与または拒否します。

同様に、一般エントリ[admin,*]を特定エントリ[admin,ford]の前に配置すると、SQLではユーザー[admin,ford]が[admin,*]に一致し、ユーザー[admin,ford]が必要とするアクセス権INSERT、UPDATEおよびDELETEが拒否されます。


-- Database Administrator -- needs all privileges.
--
     GRANT ALL
     ON DATABASE ALIAS RDB$DBHANDLE
     TO [group2,adams]
     POSITION 1;

-- Assistant -- needs to be able to use data definition statements.
--
     GRANT SELECT,CREATE,ALTER,DROP
     ON DATABASE ALIAS RDB$DBHANDLE
     TO [group2,clark]
     POSITION 2;

-- Operator -- needs to be able to perform database maintenance tasks.
--
     GRANT SELECT, ALTER, DBADM
     ON DATABASE ALIAS RDB$DBHANDLE
     TO [group2,lawrence]
     POSITION 3;

-- Security Administrator -- needs to specify and show security events
-- audited for a database and review the audit trail.
--
     GRANT SECURITY
     ON DATABASE ALIAS RDB$DBHANDLE
     TO [group2,davis]
     POSITION 4;

-- Manager -- needs to be able to use all data manipulation statements.
--
     GRANT SELECT,INSERT,UPDATE,DELETE
     ON DATABASE ALIAS RDB$DBHANDLE
     TO [admin,smith]
     POSITION 5;

-- Secretary -- needs to be able to read, write, and delete data.
-- No access to data definition or maintenance.
--
     GRANT SELECT,INSERT,UPDATE,DELETE
     ON DATABASE ALIAS RDB$DBHANDLE
     TO [admin,ford]
     POSITION 6;

-- Programmers -- need to perform data definition and data manipulation
-- on some tables and constraints to test application programs.
--
     GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,ALTER,DROP,REFERENCES
     ON DATABASE ALIAS RDB$DBHANDLE
     TO PROGRAMMERS
     POSITION 7;

-- Clerks -- need to be able only to read data. No access to modify, erase,
-- store, data definition, or maintenance statements.
--
     GRANT SELECT
     ON DATABASE ALIAS RDB$DBHANDLE
     TO [admin,*]
     POSITION 8;

-- Deny access to all users not explicitly granted access to the database.
--
     REVOKE ALL
     ON DATABASE ALIAS RDB$DBHANDLE
     FROM PUBLIC
     POSITION 9;

例3: 列アクセス権の付与および表アクセス権の拒否

特定の列に影響する制約を定義するには、REFERENCES権限が必要です。列のデータを更新するには、UPDATE権限が必要です。表に対するUPDATE権限のあるユーザーは、表のすべての列に対して自動的にUPDATE権限を受領します。列を更新するには、列または表に対するUPDATE権限が必要です。ただし、データベース管理者は、ユーザーによる更新が可能な列のみを定義し、表エントリからUPDATE権限を削除することによって制限できます。現行給与は機密情報であるため、この額を更新する機能の制限が必要な場合があります。

次の例では、ユーザー[admin,ford]が、SALARY_STARTおよびSALARY_ENDを除くSALARY_HISTORY表の列を更新できないようにします。たとえば、ユーザー[admin,ford]は、SALARY_AMOUNT列を更新できません。


SQL> GRANT UPDATE ON COLUMN SALARY_HISTORY.SALARY_START
cont> TO [admin,ford];
SQL> GRANT UPDATE ON COLUMN SALARY_HISTORY.SALARY_END
cont> TO [admin,ford];
SQL> --
SQL> REVOKE UPDATE ON TABLE SALARY_HISTORY FROM [admin,ford];
SQL> --
SQL> COMMIT;
SQL> --
SQL> SHOW PROTECTION ON TABLE SALARY_HISTORY;
Protection on Table SALARY_HISTORY
    (IDENTIFIER=[grp2,jones],ACCESS=SELECT+INSERT+UPDATE+DELETE+SHOW+CREATE+
     ALTER+DROP+DBCTRL+DBADM+REFERENCES+SECURITY+DISTRIBTRAN)
    (IDENTIFIER=[*,*],ACCESS=NONE)
SQL> --
SQL> SHOW PROTECTION ON COLUMN SALARY_HISTORY.SALARY_START;
Protection on Column SALARY_HISTORY.SALARY_START
    (IDENTIFIER=[admin,ford],ACCESS=UPDATE)
    (IDENTIFIER=[*,*],ACCESS=NONE)

例4: すべてのユーザーへの順序に対するSELECT権限の付与


SQL> SHOW PROTECTION ON SEQUENCE EMPID
Protection on Sequence EMPID
    (IDENTIFIER=[RDB,STRAUTS],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,STRAUTS],ACCESS=SELECT+SHOW+ALTER+DROP+DBCTRL)
    (IDENTIFIER=[*,*],ACCESS=SELECT)

例5: ロールに対するINSERT ON TABLE権限の付与


SQL> SHOW PROTECTION ON TABLE JOBS
Protection on Table JOBS
    (IDENTIFIER=[250,254],ACCESS=SELECT+INSERT+UPDATE+DELETE+SHOW+CREATE+ALTER+
      DROP+DBCTRL+DBADM+REFERENCES)
    (IDENTIFIER=PUBLIC,ACCESS=SELECT+INSERT+UPDATE+DELETE+SHOW+CREATE+ALTER+DROP
      +DBADM+REFERENCES)
SQL> CREATE ROLE ADMINISTRATOR;
SQL> GRANT INSERT ON TABLE JOBS TO ADMINISTRATOR AFTER [250,254];
SQL> SHOW PROTECTION ON TABLE JOBS
Protection on Table JOBS
    (IDENTIFIER=[250,254],ACCESS=SELECT+INSERT+UPDATE+DELETE+SHOW+CREATE+ALTER+
      DROP+DBCTRL+DBADM+REFERENCES)
    (IDENTIFIER=ADMINISTRATOR,ACCESS=INSERT)
    (IDENTIFIER=PUBLIC,ACCESS=SELECT+INSERT+UPDATE+DELETE+SHOW+CREATE+ALTER+DROP
      +DBADM+REFERENCES)

例6: ユーザーへのすべてのアクセス権の許可


SQL> -- Allow all access to user JAIN
SQL> GRANT SELECT ON DATABASE ALIAS *   to jain;
SQL> GRANT SELECT ON TABLE *            to jain;
SQL> GRANT EXECUTE ON MODULE *          to jain;
SQL> GRANT EXECUTE ON PROCEDURE *       to jain;
SQL> GRANT EXECUTE ON FUNCTION  *       to jain;

例7: 権限の付与時におけるユーザーの自動作成


SQL> ATTACH 'FILENAME MF_PERSONNEL.RDB';
SQL> SHOW USERS
Users in database with filename mf_personnel.rdb
     tsmith
     jstuart
SQL> GRANT ALL ON DATABASE ALIAS RDB$DBHANDLE TO CDAY;
%RDB-W-META_WARN, metadata successfully updated with the reported warning
-RDMS-W-PRFCREATED, some users or roles were created
SQL> SHOW USERS
Users in database with filename mf_personnel.rdb
     tsmith
     jstuart
     cday