Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 25.03.2013
Сообщений: 6

Отключение каскадного выполнения триггеров

02.05.2018, 08:41. Показов 986. Ответов 4

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Я выполняю следующую команду:
SQL
1
INSERT INTO CSM_ACTUAL (SIGN_CODE,CREATE_DATE,CSM_NAME_ROD_CASE,CSM_NAME,CSM_CODE,CSM_NAME_SHORT,FTP_USER_NAME,SESS_ID) VALUES('6767',CAST('2018-04-27 12:24:22' AS TIMESTAMP),'6565','55665',10104,'56565','ftp_343',17);
С данной командой связан следующий триггер:
SQL
1
2
CREATE TRIGGER CSM_INS INSTEAD OF INSERT ON CSM_ACTUAL FOR EACH ROW
EXECUTE PROCEDURE "TriggerFunctionCsmIns"();
С триггером связана следующая функция:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
CREATE OR REPLACE FUNCTION "TriggerFunctionCsmIns"()
  RETURNS TRIGGER AS $$
  DECLARE INSERTED_ID INTEGER;
  DECLARE SESSION_ID INTEGER;
  DECLARE CHANGE_ID INTEGER;
BEGIN
  SESSION_ID = NEW.SESS_ID;
  SELECT "SetChangeBySessionId"(SESSION_ID) INTO CHANGE_ID;
 
  INSERTED_ID = (SELECT COALESCE (MAX(ID), 0) + 1 FROM CSM_ATTR WHERE ENTITY_ID = NEW.ENTITY_ID);
 
IF NOT EXISTS(SELECT * FROM CSM_FK WHERE CSM_CODE=NEW.CSM_CODE) THEN
    INSERT INTO CSM_FK(CSM_CODE) VALUES(NEW.CSM_CODE);
END IF;
INSERT INTO CSM_ATTR
(
ID, RECSTATE, SESS_ID, ENTITY_ID, CREATE_DATE,
DELETE_DATE, CREATION_ID, DELETION_ID, CSM_CODE, CSM_NAME,
ACCREDITATION_CODE, ACCREDITATION_DATE, ACCREDITATION_DATE_END, SIGN_CODE,
INN, KPP, OKPO, OKONH, OKATO, REGION, POSTCODE, ADDRESS, PHONE, FAX, E_MAIL,
DIRECTOR, DIRECTOR_DAT_CASE, DIRECTOR_ROD_CASE, DIRECTOR_POSITION,
DIRECTOR_POSITION_ROD_CASE, GLAVBUH, BANK, BIK, BANK_ACCOUNT, LORO_ACCOUNT,
BANK_BALANCE, OFK_NAME, OFK_INN, OFK_KPP, OFK_LACCOUNT, OFK_OKONH, OFK_OKPO,
MARK_DOC_NUM, MARK_DOC_DATE, MARK_DOC_DATE_END, CONTACT_PHONE, CONTACT_PERSON, AGENT_DOCNO,
AGENT_DOC_DATE, AGENT_DOC_EXPDATE, CSM_NAME_ROD_CASE, PARENT_CODE,
FTP_USER_NAME, LICENSES, LICENSE_SIGNATURE, CSM_NAME_SHORT
)
VALUES
(
INSERTED_ID, 1, NULL, INSERTED_ID, NEW.CREATE_DATE, NULL,
CHANGE_ID, NULL, NEW.CSM_CODE, NEW.CSM_NAME,
NEW.ACCREDITATION_CODE, NEW.ACCREDITATION_DATE,
NEW.ACCREDITATION_DATE_END, NEW.SIGN_CODE,
NEW.INN, NEW.KPP, NEW.OKPO,
NEW.OKONH, NEW.OKATO, NEW.REGION,
NEW.POSTCODE, NEW.ADDRESS, NEW.PHONE,
NEW.FAX, NEW.E_MAIL, NEW.DIRECTOR,
NEW.DIRECTOR_DAT_CASE, NEW.DIRECTOR_ROD_CASE,
NEW.DIRECTOR_POSITION,
NEW.DIRECTOR_POSITION_ROD_CASE, NEW.GLAVBUH,
NEW.BANK, NEW.BIK, NEW.BANK_ACCOUNT,
NEW.LORO_ACCOUNT, NEW.BANK_BALANCE,
NEW.OFK_NAME, NEW.OFK_INN,
NEW.OFK_KPP, NEW.OFK_LACCOUNT,
NEW.OFK_OKONH, NEW.OFK_OKPO,
NEW.MARK_DOC_NUM, NEW.MARK_DOC_DATE, NEW.MARK_DOC_DATE_END,
NEW.CONTACT_PHONE, NEW.CONTACT_PERSON,
NEW.AGENT_DOCNO, NEW.AGENT_DOC_DATE,
NEW.AGENT_DOC_EXPDATE, NEW.CSM_NAME_ROD_CASE,
NEW.PARENT_CODE, NEW.FTP_USER_NAME,
NEW.LICENSES, NEW.LICENSE_SIGNATURE, NEW.CSM_NAME_SHORT
);
 
 
INSERT INTO CSM_ATTR_LOG
(
ID,RECSTATE,SESS_ID,ENTITY_ID,CREATE_DATE,DELETE_DATE,CREATION_ID,DELETION_ID,CSM_CODE,CSM_NAME,
ACCREDITATION_CODE,ACCREDITATION_DATE,ACCREDITATION_DATE_END,SIGN_CODE,
INN,KPP,OKPO,OKONH,OKATO,REGION,POSTCODE,ADDRESS,PHONE,FAX,E_MAIL,
DIRECTOR,DIRECTOR_DAT_CASE,DIRECTOR_ROD_CASE,DIRECTOR_POSITION,
DIRECTOR_POSITION_ROD_CASE,GLAVBUH,BANK,BIK,BANK_ACCOUNT,LORO_ACCOUNT,
BANK_BALANCE,OFK_NAME,OFK_INN,OFK_KPP,OFK_LACCOUNT,OFK_OKONH,OFK_OKPO,
MARK_DOC_NUM,MARK_DOC_DATE,MARK_DOC_DATE_END,CONTACT_PHONE,CONTACT_PERSON,AGENT_DOCNO,
AGENT_DOC_DATE,AGENT_DOC_EXPDATE,CSM_NAME_ROD_CASE,PARENT_CODE,
FTP_USER_NAME,LICENSES,LICENSE_SIGNATURE,CSM_NAME_SHORT
)
VALUES
(INSERTED_ID, 1, NULL, INSERTED_ID, CURRENT_TIMESTAMP, NULL,
CHANGE_ID, NULL, NEW.CSM_CODE, NEW.CSM_NAME,
NEW.ACCREDITATION_CODE, NEW.ACCREDITATION_DATE,
NEW.ACCREDITATION_DATE_END, NEW.SIGN_CODE,
NEW.INN, NEW.KPP, NEW.OKPO,
NEW.OKONH, NEW.OKATO, NEW.REGION,
NEW.POSTCODE, NEW.ADDRESS, NEW.PHONE,
NEW.FAX, NEW.E_MAIL, NEW.DIRECTOR,
NEW.DIRECTOR_DAT_CASE, NEW.DIRECTOR_ROD_CASE,
NEW.DIRECTOR_POSITION,
NEW.DIRECTOR_POSITION_ROD_CASE, NEW.GLAVBUH,
NEW.BANK, NEW.BIK, NEW.BANK_ACCOUNT,
NEW.LORO_ACCOUNT, NEW.BANK_BALANCE,
NEW.OFK_NAME, NEW.OFK_INN,
NEW.OFK_KPP, NEW.OFK_LACCOUNT,
NEW.OFK_OKONH, NEW.OFK_OKPO,
NEW.MARK_DOC_NUM, NEW.MARK_DOC_DATE, NEW.MARK_DOC_DATE_END,
NEW.CONTACT_PHONE, NEW.CONTACT_PERSON,
NEW.AGENT_DOCNO, NEW.AGENT_DOC_DATE,
NEW.AGENT_DOC_EXPDATE, NEW.CSM_NAME_ROD_CASE,
NEW.PARENT_CODE, NEW.FTP_USER_NAME,
NEW.LICENSES, NEW.LICENSE_SIGNATURE, NEW.CSM_NAME_SHORT
);
RETURN NEW;
 
END;
$$
LANGUAGE plpgsql;
По тексту триггерной функции видно, что при её выполнении будет осуществляться Insert в таблицу CSM_ATTR (триггер TriggerFunctionCsmAttrIns) и Insert в таблицу CSM_ATTR_LOG (триггер TriggerFunctionCsmAttrIns).

Вопрос: Можно как то настроить PostgreSql, что бы не было каскадного срабатывания триггеров из другого триггеров?
P.S. в MS SQL Server такую настройку можно сделать на уровне сервере, как свойство Разрешить триггерам активизировать другие триггеры.
T-SQL
1
2
3
4
5
6
7
8
9
10
USE AdventureWorks2012 ;  
GO  
EXEC sp_configure 'show advanced options', 1;  
GO  
RECONFIGURE ;  
GO  
EXEC sp_configure 'nested triggers', 0 ;  
GO  
RECONFIGURE;  
GO
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.05.2018, 08:41
Ответы с готовыми решениями:

Изменение последовательности выполнения Триггеров
Привет всем!!! БД Больницы....У меня есть такой тайбл по имени ISTORIA. Есть поля DATE_POST, DATE_VIPES, VREM_PREBIVANIA. 1-й...

Настройка каскадного удаления
Добрый день уважаемые форумчане. Сделал клиентское приложение, которое работает со связными таблицами. И сейчас возникла необходимость в...

Matplotlib построение каскадного спектра
У меня получилось построить каскадный спектр, но не могу форматировать ось X в datetime. Пробовал заменить метки на свои даты, не помогло,...

4
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
02.05.2018, 13:10
Про вложенные триггеры я что-то не припомню, надо в документации смотреть.
Есть вот так
SQL
1
ALTER TABLE TABLE_NAME DISABLE TRIGGER trigger_name
0
0 / 0 / 0
Регистрация: 25.03.2013
Сообщений: 6
02.05.2018, 15:49  [ТС]
Эта команда приведет к отключению триггера, а мне нужно чтобы он не срабатывал в ответ на команду вставки, которая находиться в другом триггере.
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
03.05.2018, 15:53
Когда триггер отключен, он не срабатывает.
Перед вставкой отключите тот "вложенный" триггер, который вы не хотите чтобы сработал.
После вставки включите триггер снова.
0
0 / 0 / 0
Регистрация: 25.03.2013
Сообщений: 6
05.05.2018, 09:29  [ТС]
Для триггера типа ALTER можно выполнить следующую команду создания триггера:
SQL
1
2
CREATE TRIGGER CSM_ATTR_INS AFTER INSERT ON CSM_ATTR FOR EACH ROW WHEN (pg_trigger_depth() = 0)
EXECUTE PROCEDURE "TriggerFunctionCsmAttrIns"();
Однако для триггера типа INSTEAD OF раздел WHEN недопустим. Буду думать как реализовать для таких типов триггеров.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.05.2018, 09:29
Помогаю со студенческими работами здесь

Ошибка при компиляции каскадного декодере
У меня написан код, но когда компилирую,выскакивает ошибка. Не могу понять в чем дело. Помогите разобраться. Код во вложении

Сортировка методом каскадного слияния со специальным распределением
Задание - реализовать этот алгоритм для однмоерного динамического массива. попытки почитать Кнута успехом не увенчались - не понятно. Буду...

Триггер:запрещение каскадного удаления если срабатывает ограничение
вообщем есть база. главная - педагоги, побочная - ученики. внешний ключ стоит на каскадном удалении(именно в этом задача. менять его...

Создание триггеров на c#
Добрый день. Пытаюсь создать триггер на c# : .", Event = @"FOR INSERT")] public static void StatusAudit() { ...

Использование триггеров
Нужно написать триггерные процедуры для Oracle DB, которые будут делать следующее: мониторить таблицу X (int a, string b, float c) и в...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru