Selectete Statements ausführen

Hallo,

ich erzeuge mir mittels des folgenden SELECT Befehls Statements zum ‘granten’ von Rechten.

    
SELECT 'GRANT SELECT ON ' || relname || ' TO viewer;'
    FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
    WHERE nspname = 'public' AND relkind IN ('r', 'v');

Nun möchte ich die Befehle die dieser SELECT liefert gerne allesamt ausführen. Wie würdet ihr das machen?
Mein erster Ansatz war es die Statements in einen Record zu schreiben und diesen dann durch zu iterieren. Funktioniert leider noch nicht ganz.
Wenn ich zum testen das selectete in record inserten will, bleibt dieser leer.

Mein zweiter Ansatz wäre es eventuell mit einer Row-Typen variablen zu machen.

Was davon wäre die bessere Variante? Oder vielleicht hat jemand ja noch eine andere Idee.

EXECUTE verwenden, innerhalb von plpgsql.

Andreas

Dass der Befehl mit EXECUTE ausgeführt werden muss weiß ich. Das Problem war bis jetzt, dass jede Zeile des Select’s ausgeführt werden muss. Also in einer Schleife und das hat Probleme bereitet.
Bin auch noch nicht so ganz hinter die Funktionsweise von “FOR record IN …” gestiegen.

ich hab gerade ein Beispiel gefunden:

declare
r record;
begin
for r in EXECUTE ''select * from '' || $1 loop
return next r;
end loop;

Wenn ich das jetzt für meinen Select anpasse, sagt er mir dass ein Loop fehlt.

grant_expressions RECORD;

BEGIN
    FOR grant_expressions IN EXECUTE 
        'SELECT 'GRANT SELECT ON ' || relname || ' TO viewer;' as t
        FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
        WHERE nspname = 'public' AND relkind IN ('r', 'v')'
    LOOP
        RETURN NEXT grant_expressions; 
    END LOOP;

    RETURN;

Wie gesagt, so ganz seh ich da noch nicht durch.



[09:00]	<akretschmer>	??grantall
[09:00]	<pg_docbot>	For information about 'grantall' see:
[09:00]	<pg_docbot>	http://pgedit.com/public/sql/acl_admin/index.html :: http://www.onlamp.com/databases/2006/01/19/examples/plperl-article-2.sql :: http://www.depesz.com/index.php/2007/10/19/grantall/ :: http://www.depesz.com/index.php/2009/11/07/waiting-for-8-5-grant-all/

schreib es halt einfach ab …

Andreas

Warum so umständlich? Du kannst das EXECUTE doch einfach innerhalb von dem LOOP aufrufen, mit dem String den Du sowieso über den Cursor bekommst.
Es gibt keinen Grund das SQL zurückzugeben.