Я настраиваю базу данных, которая может при каждом создании таблицы проверять, не указано ли указанное имя в таблице с именем 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;