2016-08-31 4 views
1

Я пытаюсь выполнить итерацию по запросу, которое я только что сгенерировал, и выполнить триггеры, похоже, Postgres не распознает, что я хочу делать, как я могу его исправить?Iterate over query

CREATE OR REPLACE FUNCTION get_all_rezultz() RETURNS VOID AS 
    $BODY$ 

    BEGIN 
FOR r IN (SELECT 'CREATE TRIGGER ' || tab_name|| '_if_modified_trg AFTER INSERT OR UPDATE OR DELETE ON ' || tab_name|| ' FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); ' AS trigger_creation_query 
FROM (
SELECT quote_ident(table_name) as tab_name 
    FROM information_schema.tables 
    WHERE table_schema='public' 

    ) AS foo WHERE tab_name||'_if_modified_trg' NOT IN (SELECT tgname from pg_trigger where not tgisinternal)) 

LOOP 

    -- can do some processing here 
EXECUTE r.trigger_creation_query; 
END LOOP; 
RETURN; 
    END 
$BODY$ 
LANGUAGE plpgsql; 

Я получаю ошибку - ОШИБКА: переменная цикла из цикла по строкам должна быть запись или строку переменной или список скалярных переменных

+0

Существует дубликатом вопрос я ответил вчера: HTTP://stackoverflow.com/questions/39229079/check-if-trigger-exists/39229576#39229576 –

ответ

0
CREATE OR REPLACE FUNCTION get_all_rezultz() RETURNS VOID AS 
    $BODY$ 
    DECLARE 
    r RECORD; 
    BEGIN 
FOR r IN (SELECT 'CREATE TRIGGER ' || tab_name|| '_if_modified_trg AFTER INSERT OR UPDATE OR DELETE ON ' || tab_name|| ' FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); ' AS trigger_creation_query 
FROM (
SELECT quote_ident(table_name) as tab_name 
    FROM information_schema.tables 
    WHERE table_schema='public' 

    ) AS foo WHERE tab_name||'_if_modified_trg' NOT IN (SELECT tgname from pg_trigger where not tgisinternal)) 

LOOP 

    -- can do some processing here 
EXECUTE r.trigger_creation_query; 
END LOOP; 
RETURN; 
    END 
$BODY$ 
LANGUAGE plpgsql;