我正在建立一个数据库,可以检查每个表创建是否在名为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;
最后我找到了以下解决方案:
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;