Public.test_ *という名前のテーブルが100個以上あります
どうすれば簡単にGRANT ALL
すべてのテーブルへのユーザーテストへのアクセスを一度に行いますか?
私が試した:
GRANT ALL ON TABLE public.test_* TO test;
しかし、それは機能していません...
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
_と文字列連結を使用できます。
何 @ 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
$$;
関連: