[pgsql-jp: 25649] Re: 外部キーのリファレンス先のテーブル所有者
WADA Hiroyuki
wada @ komine-ag.co.jp
2002年 4月 22日 (月) 23:31:05 JST
和田@横から失礼します。
Tatsuo Ishii wrote:
> > 7.0.3 でも、7.1.3 でも同じ動作です。
> >
> > ムリなのはしょうがないのですが、この仕様、皆さんは納得できますか?
>
> 7.2のGRANT REFERENCESで解決できない問題なのですか?
私もそう思ったのですが、なんだかちょっとおかしいので。
(cygwinの7.2.1-1で試しました)
まず参照されるtableを作り、
\c - wada
You are now connected as new user wada.
CREATE TABLE test1(id int primary key);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index
'test1_pkey' for table 'test1'
CREATE
GRANTせずに参照しようとすると、
\c - tester
You are now connected as new user tester.
CREATE TABLE test2(id int, FOREIGN KEY(id) REFERENCES test1(id)
ON DELETE CASCADE);
NOTICE: CREATE TABLE will create implicit trigger(s) for FOREIGN KEY
check(s)
ERROR: permission denied
エラーメッセージが新しくなってます。ここはOK。
次に、GRANT REFERENCES して
\c - wada
You are now connected as new user wada.
GRANT REFERENCES ON test1 TO tester;
GRANT
それから参照すると、
\c - tester
You are now connected as new user tester.
CREATE TABLE test2(id int, FOREIGN KEY(id) REFERENCES test1(id)
ON DELETE CASCADE);
NOTICE: CREATE TABLE will create implicit trigger(s) for
FOREIGN KEY check(s)
CREATE
ちゃんとできました。ここもOK(?)
ところが、
DROP TABLE test2;
NOTICE: DROP TABLE implicitly drops referential integrity trigger
from table "test1"
ERROR: test1: Must be table owner.
となって自分がownerなtableを削除できません。実際にはtest1のtriggerの
方が削除できないようなので、
\c - wada
You are now connected as new user wada.
GRANT TRIGGER ON test1 TO tester;
GRANT
としてみても、
\z test1
Access privileges for database "wada"
Table | Access privileges
-------+----------------------------
test1 | {=,wada=arwdRxt,tester=xt}
(1 row)
\c - tester
You are now connected as new user tester.
DROP TABLE test2;
NOTICE: DROP TABLE implicitly drops referential integrity
trigger from table "test1"
ERROR: test1: Must be table owner.
念のため GRANT ALL もやってみましたが変化ありません。
INSERTとDELETEが別なのでINSERT権限だけでは自分で追加した
レコードを削除できないのと似たようではありますが。。。
そもそも別々にGRANTできるのに、GRANT TRIGGER してない状態で
ON DELETE な REFERENCE を作れたのがおかしいような気がします。
pgsql-jp メーリングリストの案内