如何检查(withtrigger)创建表是否已被PL / pgSQL函数中的另一个表引用?

问题描述 投票:0回答:1

我正在建立一个数据库,可以检查每个表创建是否在名为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;

提示:我替换了由NULL命名的提及,错误消失了。但只要检查的变量保持等于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;
postgresql triggers plpgsql create-table
1个回答
0
投票

最后我找到了以下解决方案:

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;
© www.soinside.com 2019 - 2024. All rights reserved.