[pgsql-jp: 25651] Re: 外部キーのリファレンス先のテーブル所有者
Jun Kitamura
kitamura @ zoozee.jp
2002年 4月 23日 (火) 03:59:19 JST
北村@zoozee です。
> 和田@横から失礼します。
とんでもないです。ありがとうございます。
> Tatsuo Ishii wrote:
>
> > > 7.0.3 でも、7.1.3 でも同じ動作です。
> > >
> > > ムリなのはしょうがないのですが、この仕様、皆さんは納得できますか?
> >
> > 7.2のGRANT REFERENCESで解決できない問題なのですか?
>
> 私もそう思ったのですが、なんだかちょっとおかしいので。
> (cygwinの7.2.1-1で試しました)
> まず参照されるtableを作り、
(snip)
> となって自分がownerなtableを削除できません。実際にはtest1のtriggerの
> 方が削除できないようなので、
(snip)
> 念のため GRANT ALL もやってみましたが変化ありません。
> INSERTとDELETEが別なのでINSERT権限だけでは自分で追加した
> レコードを削除できないのと似たようではありますが。。。
私も(重い腰を上げて(汗)) 7.2.1 をインストールして、実験してみました。
結果は和田さんのものと同じでした。
たしかに、自分の所有するテーブル(test2)が削除できませんでした。
> そもそも別々にGRANTできるのに、GRANT TRIGGER してない状態で
> ON DELETE な REFERENCE を作れたのがおかしいような気がします。
TRIGGER と、implicit TRIGGER は別扱いだったような。
なので、REFERENCE と TRIGGER を別物として扱うのは、納得できます。
test2 テーブルが削除できないのも、test1 に対する TRIGGER 権限よりも
ALTER TABLE .. DROP CONSTRAINT の実行権限(=テーブルオーナーか否か)になっ
てしまうのでは無いでしょうか。(だとすればなんとなく納得です(test2 テーブ
ルが削除できない状況に満足しているわけじゃないです))。
とりあえず、解決の糸口は見えたので「保留」です(汗)。
余談なんですが、REFERENCE 権限さえあれば、SELECT 権限が無くても良いので、
総当りすれば test2 を使って test1 のキー値に何があるか調べることができま
すね (test1 がキー値を隠す意味(というか、そういうシチュエーション)が無い
ですが)。
一応サマリ
-------ここから
・外部キーのリファレンス先のテーブル所有者が違う場合
→リファレンス先テーブルで GRANT REFERENCE。
(SELECT 権限が無くても、REFERENCE さえあれば可能)
→(問題点)自テーブルが削除できなくなる。
ユーザA
CREATE TABLE t1(
a int4,
PRIMARY KEY(a),
b int4
);
GRANT REFERENCES ON t1 TO ユーザB
ユーザB
CREATE TABLE t2 (
a int4,
CONSTRAINT t2_a
FOREIGN KEY(a)
REFERENCES t1(a)
ON UPDATE CASCADE
ON DELETE CASCADE,
c int4
);
DROP TABLE t2; -- これが実行できない
ERROR: t1: Must be table owner.
------ここまで
# 7.2 のすごさと便利さで色々遊んでしまったので時間が・・・・。
pgsql-jp メーリングリストの案内