web-dev-qa-db-fra.com

PostgreSQL Grant All sur plusieurs tables en utilisant comme

J'ai plus de 100 tables nommées public.Test_ *

Comment puis-je facilement GRANT ALL Accès au test de l'utilisateur à toutes les tables à la fois?

J'ai essayé avec:

GRANT ALL ON TABLE public.test_* TO test;

Mais ça ne fonctionne pas ...

8
Egidi

GRANT ne prend pas de cartes génériques dans des identifiants de table.

Vous pouvez utiliser ON ALL TABLES IN SCHEMA, Mais cela nécessite un seul nom de schéma.

Si vous souhaitez effectuer des choses avec des noms de table à motif de caractères génériques, vous devrez utiliser PL/PGSQL EXECUTE format(...) dans un bloc DO Block pour boucler sur la vue information_schema.tables. Voir de nombreuses réponses connexes ici sur dba.se et débordement de pile pour DDL dynamique dans PL/PGSQL.

Exemple rugueux non testé pour vous donner l'idée:

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;

Pour quoi %I Signifie que la référence pour la fonction format. Si vous n'avez pas de fonction format, votre PostgreSQL est obsolète et que vous devriez probablement planifier une mise à niveau; Vous pouvez utiliser quote_ident et la concaténation de chaîne dans la période moyenne.

7
Craig Ringer

Quoi @ Craig déjà expliqué .
Plus, depuis ((GRANT peut accorder des privilèges sur plusieurs objets à la fois, vous pouvez Utilisez une seule déclaration sans boucle:

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
$$;

En rapport:

6
Erwin Brandstetter