[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 メーリングリストの案内