web-dev-qa-db-ja.com

別のスキーマでのシーケンスの許可

Postgres 9.3 Debian 7.0

私は特定のユーザー用に特定のスキーマを作成し、このユーザー用にこのスキーマ内にビューを作成しました。そのため、彼が知っている唯一のテーブルが存在します。問題は、この同じユーザーがこのテーブルの主キーのシーケンスで使用する必要があることですが、「エラー:シーケンスの権限が拒否されました」と表示されています

元のテーブルとそのシーケンスはスキーマAに属しています。このユーザーのスキーマBは、このテーブルTの挿入可能なビューを持っています。このユーザーにスキーマAの使用を許可することはできません。そうしないと、すべての名前と定義を見ることができます私のテーブル。

問題は、彼がnextval()とcurrval()を呼び出せるように、このシーケンスのある種のビューを作成する方法はありますか?目的は、シーケンスが実際に属するメインスキーマへのアクセス権をユーザーに与えることなく、この制限されたユーザーがこのシーケンスを使用できるようにすることです。

4

これは可能です。
serial主キーの列のデフォルトは通常、次のように定義されます。

_ALTER TABLE schema_a.tbl ALTER COLUMN tbl_id
SET DEFAULT nextval('schema_a.tbl_tbl_id_seq'::regclass);
_

2つのオプション:

1.シーケンスを移動する(私の好み)

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
_

これにより、すべての参照が保持されます(列のデフォルトを含む)。

2. _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" を必ずお読みください。

5