Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Отключение каскадного выполнения триггеров / 7 сообщений из 7, страница 1 из 1
27.04.2018, 14:45
    #39637503
ASukhov1986
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отключение каскадного выполнения триггеров
Здравствуйте!
Я выполняю следующую команду:
Код: plsql
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);



С данной командой связан следующий триггер:
Код: plsql
1.
2.
CREATE TRIGGER CSM_INS INSTEAD OF INSERT ON CSM_ACTUAL FOR EACH ROW
EXECUTE PROCEDURE "TriggerFunctionCsmIns"();



С триггером связана следующая функция:
Код: plsql
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 такую настройку можно сделать на уровне сервере, как свойство Разрешить триггерам активизировать другие триггеры .
...
Рейтинг: 0 / 0
27.04.2018, 14:45
    #39637505
ASukhov1986
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отключение каскадного выполнения триггеров
ASukhov1986,
...
Рейтинг: 0 / 0
27.04.2018, 14:59
    #39637515
ASukhov1986
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отключение каскадного выполнения триггеров
ASukhov1986,

В MS SQl Server это так:
Код: 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 / 0
03.05.2018, 10:46
    #39639226
ASukhov1986
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отключение каскадного выполнения триггеров
ASukhov1986,
Для триггера типа ALTER можно выполнить следующую команду создания триггера:
Код: plsql
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 / 0
03.05.2018, 12:07
    #39639282
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отключение каскадного выполнения триггеров
ASukhov1986ASukhov1986,
Для триггера типа ALTER можно выполнить следующую команду создания триггера:
Код: plsql
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 / 0
03.05.2018, 17:25
    #39639576
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отключение каскадного выполнения триггеров
Ролг ХупинASukhov1986ASukhov1986,
Для триггера типа ALTER можно выполнить следующую команду создания триггера:
Код: plsql
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 / 0
03.05.2018, 17:46
    #39639593
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отключение каскадного выполнения триггеров
qwwqРолг Хупинпропущено...



юзер, не надо больше здесь писать
как вы можете, ролг ?

ваш можно сказать коллега по МССКЛ тащит с собой все старые рефлексы. и вместо того чтобы спросить как сделать нечто верно, спрашивает, как в пж пройти по граблям .

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


тащить быть вынужденным носителем комплексов SQL Server - это простительно
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Отключение каскадного выполнения триггеров / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]