Как проверить (с помощью триггера), что на созданную таблицу уже ссылается другая таблица в функции PL / pgSQL? - PullRequest
0 голосов
/ 04 апреля 2019

Я настраиваю базу данных, которая может при каждом создании таблицы проверять, не указано ли указанное имя в таблице с именем core_metadata.Для этого я добавил триггер, который срабатывает при создании таблицы.Но я все еще застреваю с этой ошибкой, когда я пытаюсь СОЗДАТЬ новую таблицу в базе данных (сообщение об ошибке возвращается функцией триггера).

Мой код функции следующий:

DECLARE created_table record;    
DECLARE name_check varchar(255);
DECLARE namedd varchar(255);
DECLARE checked integer;

BEGIN
    checked := 0;
    FOR created_table IN SELECT * FROM pg_event_trigger_ddl_commands() WHERE command_tag in ('CREATE TABLE','CREATE TABLE AS','ALTER TABLE')
    LOOP    
        namedd  := created_table.object_identity;
        SELECT referenced_tables.object_identity INTO name_check FROM 
        (SELECT CONCAT('public.',data_table) AS object_identity FROM core_metadata) AS referenced_tables 
        WHERE referenced_tables.object_identity = namedd;

        IF name_check THEN 
            checked := 1;
        END IF;
    END LOOP;
    IF checked = 0 THEN 
        RAISE EXCEPTION 'Table must be first defined into core_metadata (%)', checked;
    ELSE
        RAISE NOTICE 'Table added to metadata (%)',checked;
    END IF;
END;

СОВЕТ: Я заменил упоминание namedd на NULL, и ошибка исчезла.Но пока переменная check остается равной 0, моя функция не работает должным образом.

DECLARE created_table record;    
DECLARE name_check varchar(255);
DECLARE namedd varchar(255);
DECLARE checked integer := 0;

BEGIN
    FOR created_table IN SELECT * FROM pg_event_trigger_ddl_commands() WHERE command_tag in ('CREATE TABLE','CREATE TABLE AS','ALTER TABLE')
    LOOP    
        namedd  := created_table.object_identity;
        SELECT referenced_tables.object_identity INTO name_check FROM 
        (SELECT CONCAT('public.',data_table) AS object_identity FROM core_metadata) AS referenced_tables 
        WHERE referenced_tables.object_identity = NULL ;

        IF name_check THEN 
            checked := 1;
        END IF;
    END LOOP;
    IF checked = 0 THEN 
        RAISE EXCEPTION 'Table must be first defined into core_metadata (%)', checked;
    ELSE
        RAISE NOTICE 'Table added to metadata (%)',checked;
    END IF;
END;

1 Ответ

0 голосов
/ 04 апреля 2019

Наконец я нашел следующее решение:

DECLARE checked integer := 0;
DECLARE r record;
DECLARE t record;

BEGIN
    FOR r IN SELECT * FROM pg_event_trigger_ddl_commands()
    LOOP    
        FOR t IN SELECT CONCAT('public.',data_table) AS object_identity FROM core_metadata
        LOOP
            IF r.object_identity =  t.object_identity THEN
                checked := 1;
            ELSE
                RAISE NOTICE '% - %', r.object_identity, t.object_identity;
            END IF;
        END LOOP;
    END LOOP;
    IF checked = 0 THEN 
        RAISE EXCEPTION 'Table must be first defined into core_metadata (%)', checked;
    ELSE
        RAISE NOTICE 'Table added to metadata (%)',checked;
    END IF;
END;
...