Postgres 9.3 Debian 7.0
私は特定のユーザー用に特定のスキーマを作成し、このユーザー用にこのスキーマ内にビューを作成しました。そのため、彼が知っている唯一のテーブルが存在します。問題は、この同じユーザーがこのテーブルの主キーのシーケンスで使用する必要があることですが、「エラー:シーケンスの権限が拒否されました」と表示されています
元のテーブルとそのシーケンスはスキーマAに属しています。このユーザーのスキーマBは、このテーブルTの挿入可能なビューを持っています。このユーザーにスキーマAの使用を許可することはできません。そうしないと、すべての名前と定義を見ることができます私のテーブル。
問題は、彼がnextval()とcurrval()を呼び出せるように、このシーケンスのある種のビューを作成する方法はありますか?目的は、シーケンスが実際に属するメインスキーマへのアクセス権をユーザーに与えることなく、この制限されたユーザーがこのシーケンスを使用できるようにすることです。
これは可能です。serial
主キーの列のデフォルトは通常、次のように定義されます。
_ALTER TABLE schema_a.tbl ALTER COLUMN tbl_id
SET DEFAULT nextval('schema_a.tbl_tbl_id_seq'::regclass);
_
2つのオプション:
public
スキーマ-または十分な権限を持つスキーマ:
_GRANT USAGE ON SCHEMA public TO public; -- or: my_group
_
シーケンスを別のスキーマに移動する は簡単です。
_ALTER SEQUENCE schema_a.tbl_tbl_id_seq SET SCHEMA public;
_
NowUSAGE
を付与できます:
_GRANT USAGE ON SEQUENCE public.tbl_tbl_id_seq TO public; -- or: my_group
_
これにより、すべての参照が保持されます(列のデフォルトを含む)。
SECURITY DEFINER
_を使用した関数ラッパー何らかの理由でシーケンスを移動できない場合(1つとは考えられない場合)、代わりに、_SECURITY DEFINER
_を使用して、独自の関数でシーケンスへのアクセスをラップすることができます。再度、これらの関数をpublic
スキーマ(またはユーザーに十分な権限を持つ任意のスキーマ)に作成します。
_CREATE OR REPLACE FUNCTION public.next_tbl_tbl_id_seq()
RETURNS bigint AS
$func$
SELECT nextval('schema_a.tbl_tbl_id_seq'::regclass)
$func$ LANGUAGE plpgsql SECURITY DEFINER SET search_path = schema_a, pg_temp;
ALTER FUNCTION shop.f_deswap_name(text) OWNER TO owning_role;
_
ここで、_owning_role
_は、シーケンスの所有者または十分な権限を持つ任意のロールです。 currval()
の類似の関数...
マニュアルの章 "Writing SECURITY DEFINER Functionsly Safely" を必ずお読みください。