web-dev-qa-db-ja.com

LIKEを使用して複数のテーブルでPostgreSQL GRANT ALL

Public.test_ *という名前のテーブルが100個以上あります

どうすれば簡単にGRANT ALLすべてのテーブルへのユーザーテストへのアクセスを一度に行いますか?

私が試した:

GRANT ALL ON TABLE public.test_* TO test;

しかし、それは機能していません...

8
Egidi

GRANTは、テーブル識別子にワイルドカードを使用しません。

_ON ALL TABLES IN SCHEMA_を使用できますが、これには単一のスキーマ名が必要です。

ワイルドカードパターンテーブル名で処理を行う場合は、DOブロックでPL/PgSQLのEXECUTE format(...)を使用して、_information_schema.tables_ビューをループする必要があります。 PL/PgSQLの動的DDLについては、DBA.seおよびスタックオーバーフローに関する多くの関連する回答を参照してください。

あなたにアイデアを与えるための未テストの大まかな例:

_DO
$$
DECLARE
    t record;
BEGIN
    FOR t IN 
    SELECT table_schema, table_name
    FROM information_schema.tables
    WHERE table_schema = 'public'
    AND table_name LIKE 'test\_%'
    LOOP
        EXECUTE format('GRANT ALL ON TABLE %I.%I TO test;', table_schema, table_name);
    END LOOP;
END;
$$ LANGUAGE plpgsql;
_

_%I_の意味については、format関数のリファレンスを参照してください。 format関数がない場合、PostgreSQLは廃止されているため、アップグレードを計画する必要があります。その間、_quote_ident_と文字列連結を使用できます。

7
Craig Ringer

@ Craigはすでに説明した
さらに、 GRANT は複数のオブジェクトに対する権限を一度に付与できるため、ループせずに単一のステートメントを使用します。

DO
$$
BEGIN
EXECUTE (
   SELECT 'GRANT ALL ON TABLE '
       || string_agg (format('%I.%I', table_schema, table_name), ',')
       || ' TO test'
   FROM   information_schema.tables
   WHERE  table_schema = 'public'
   AND    table_name LIKE 'test\_%'
   );
END
$$;

関連:

6