FrontBaseには、Row Level Privilegesと呼ばれるユニークな機能が用意されている。これは、それぞれの行についてアクセス優先権を指定できるものである。各行それぞれが、特定のユーザに所有され、特定のグループに属すると考えるのである。各行に対するアクセス優先権(SELECT, UPDATE および DELETE)は、所有者、グループ、人間について指定することができる。
Row Level Privilegesは、フリー版では利用できない、ライセンス・ユーザ向けのみのオプションであることに注意すること。
Row Level Privilegesの実装
Row Level Privileges機能を使うには、既存のデータベースを、オプションとして与えられる機能を使って初期化しなければならない:
/Local/Library/FrontBase/bin/FrontBase -rlpriv <database name>
FBDatabaseManager経由でデータベースを作成するとき、-rlprivを指定する方法でもよい。
一旦作成されると、このオプションがデータベースに記録される。すなわち、データベース・サーバをこれ以降、停止・開始したとき、改めてオプションを指定する必要はない。
メタ・データの管理
CREATE GROUP <group name>;
-- CURRENT_USER は _SYSTEMでなければならない。
DROP GROUP <group name> RESTRICT|CASCADE;
-- CURRENT_USER は _SYSTEMでなければならない。
ALTER GROUP <group name> ADD USER <user name>;
-- CURRENT_USER は _SYSTEMでなければならない。
ALTER GROUP <group name> DROP USER <user name>;
-- CURRENT_USER は _SYSTEMでなければならない。
ALTER USER <user name> SET DEFAULT GROUP <group name>;
-- CURRENT_USER は _SYSTEM あるいは <user name>でなければならない。
ALTER TABLE <table name> SET DEFAULT PRIVILEGES(<row privileges>)
[USER <user name>];
-- CURRENT_USER は _SYSTEM あるいは <user name>でなければならない。ユーザ名が
-- 与えられていない場合、カレント・ユーザ名が使われる。
<row privileges> ::= <row privs> | <row privileges> , <row privs>
<row privs> ::= <owner privs> | <group privs> | <world privs>
<user privs> ::= USER = * | <priv mask>
<group privs> ::= GROUP = * | <priv mask>
<world privs> ::= * = * | <priv mask>
<priv mask> ::= <priv> | <priv mask> + <priv>
<priv> ::= SELECT | UPDATE | DELETE
例:
ALTER TABLE T0
SET DEFAULT PRIVILEGES(USER=*, GROUP=SELECT+UPDATE, *=SELECT);
コンテント・データの管理
UPDATE <table name> SET PRIVILEGES(<row privileges>) [WHERE <cond expr>];
UPDATE <table name> SET GROUP <group name> [WHERE <cond expr>];
UPDATE <table name> SET USER <user name> [WHERE <cond expr>];
-- CURRENT_USER は、行の所有者か、_SYSTEMでなければならない。
行に対するアクセス優先権のSELECT
所有者、グループや行の既存セットに対する優先権は、次の方法で取り出すことができる:
SELECT USER, GROUP, PRIVILEGES FROM <table> WHERE <cond expr>;
SELECTをVIEWでくるむことにより、値をクエリーで利用することができる:
CREATE VIEW(ROW_OWNER, ROW_GROUP, ROW_PRIVS) T0_PRIVS
SELECT USER, GROUP, PRIVILEGES FROM T0;
SELECT * FROM T0_PRIVS WHERE ROW_OWNER = '<user name>';
|