0 / 0 / 0
Регистрация: 12.02.2012
Сообщений: 23
1

Использовать имя таблицы в качестве параметра триггерной функции

06.10.2013, 14:57. Показов 3509. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день всем, есть такая задача:
Имеем 3 таблицы: group1(id serial, name1 text), prod(id serial, group_id serial, name1 text), message(id serial, message text, datetime).
group1 это группы товаров а prod сами товары. Они связаны внешним ключом по group_id.
Так же есть 4-ая таблица tables(id serial, table_name) в колонке которой записаны имена таблиц(в данном случае prod) а может быть таких таблиц как prod много prod1,prod2,prod3 и т.д. Нужно создать триггер и соответственно триггерную функцию, чтобы при удалении записи из group1 удалялись записи которые имеют group_id равным id из таблички group1 во всех таблица prod,prod1,prod2 и т .д. Сделал триггер на удаление из одной таблицы prod а из нескольких не могу, не знаю как передать в качестве параметра функции колонку таблицы где имена таблиц записаны.
Вот код :
CREATE or replace FUNCTION func1() RETURNS trigger AS '

declare
name1 record;

BEGIN
for name1 in EXECUTE(select table_name FROM tables1)
loop
delete from name1 where group_id=OLD.id;
return OLD;

end loop;



END; '
LANGUAGE plpgsql;
Выводит ошибку: "ошибка синтаксиса примерное положение prod"

Помогите разобраться пожалуйста как правильно надо сделать а то я чайник в постгрессе)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2013, 14:57
Ответы с готовыми решениями:

MS SQL. Передать имя таблицы в качестве параметра в запрос
Написал запрос, возвращающий количество элементов с определенным именем в таблице. Использую запрос...

Как передать функции в качестве параметра имя объекта jQuery?
Имеется функция, которая работает с объектом например: $('.photos img'). Имя селектора CSS И...

Как правильно использовать массив в качестве параметра функции ?
Здравствуйте ! Подскажите, пожалуйста правильный синтаксис описания функции, в качестве параметра...

Можно ли использовать юнит в качестве входного параметра для функции
В проекте есть n-ное количество unit'ов, причем с разными названиями, но в каждом юните есть...

1
1241 / 960 / 379
Регистрация: 02.09.2012
Сообщений: 2,936
07.10.2013, 00:24 2
SQL
1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE FUNCTION func1() RETURNS TRIGGER AS $BODY$
DECLARE
  name1 text;
BEGIN
  FOR name1 IN SELECT TABLE_NAME FROM tables1
  loop
    EXECUTE 'delete from ' || name1 || ' where group_id=' || OLD.id;
  END loop;
  RETURN OLD;
END;
$BODY$
LANGUAGE plpgsql;
Как-то так.
Основные ошибки:
1. Зачем execute вокруг select? Так сложно получается, проще FOR.. IN SELECT работает.
2. Защем RETURN в цикле. Вы хотите только один раз, удалить? И нужен RETURN в конце.
3. EXECUTE как раз использовать для DELETE.

Примеры можно подсмотреть здесь

А по существу вопроса! Лучше тригеры стараться не использовать - вы обрекаете себя на изнурительный труд по борьбе со странными ошибками в будущем. У СУБД достаточно средств для обеспечения целостности. см. например "CONSTRAINT ... FOREIGN KEY ... ON DELETE CASCADE". Создав такой внешний ключ у каждой дочерней таблицы (в вашем случае: prod, prod1,....), удаляя из group1, вы каскадно удалите и из prod (prod1,...).
0
07.10.2013, 00:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2013, 00:24
Помогаю со студенческими работами здесь

Как получить данные из другой таблицы внутри триггерной функции
Добрый день. Нужна помощь в создании триггерной функции на PL/pgSQL Задача у меня следующая:...

Короткое имя файла в качестве параметра
Написать командный файл, который: принимает в качестве параметра короткое имя файла вызывает...

Принимать и передавать в качестве параметра имя файла
Добрый вечер. Написать командный файл, который: принимает в качестве параметра короткое имя файла...

Как задать имя подпрограммы в качестве формального параметра
Не могу реализовать переопределение имени подпрограммы. Программа должна обращаться к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru