0 / 0 / 0
Регистрация: 12.02.2012
Сообщений: 23
|
|
1 | |
Использовать имя таблицы в качестве параметра триггерной функции06.10.2013, 14:57. Показов 3509. Ответов 1
Метки нет (Все метки)
Добрый день всем, есть такая задача:
Имеем 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
|
06.10.2013, 14:57 | |
Ответы с готовыми решениями:
1
MS SQL. Передать имя таблицы в качестве параметра в запрос Как передать функции в качестве параметра имя объекта jQuery? Как правильно использовать массив в качестве параметра функции ? Можно ли использовать юнит в качестве входного параметра для функции |
1241 / 960 / 379
Регистрация: 02.09.2012
Сообщений: 2,936
|
||||||
07.10.2013, 00:24 | 2 | |||||
Основные ошибки: 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 | |
07.10.2013, 00:24 | |
Помогаю со студенческими работами здесь
2
Как получить данные из другой таблицы внутри триггерной функции Короткое имя файла в качестве параметра Принимать и передавать в качестве параметра имя файла Как задать имя подпрограммы в качестве формального параметра Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |