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 ...
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.
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: