|
CHECK constraint
|
|||
---|---|---|---|
#18+
А ткните меня, пожалуйста, в документацию, где описывается порядок проверки констрейнтов и срабатывания триггеров. Наткнулся на то, что CHECK отрабатывает раньше, чем триггер. Удивился. Сервер IB XE3 С уважением, Vasilisk ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2016, 18:13 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
CHECK делается системным триггером. Срабатывает в порядке общей очереди. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2016, 18:19 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovCHECK делается системным триггеромЗнаю Dimitry SibiryakovСрабатывает в порядке общей очереди.И эту очередь нельзя изменить? Посмотрел RDB$TRIGGERS.RDB$TRIGGER_SEQUENCE. Для всех чеков стоит 0. И, как я понимаю, модификации не подлежит? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2016, 18:26 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
_Vasilisk_И эту очередь нельзя изменить? Отрицательную позицию своим триггерам давать пробовал? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2016, 18:44 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovОтрицательную позицию своим триггерам давать пробовал?Invalid token. Dynamic SQL Error. SQL error code = -104. Token unknown - line 2, char 29. -. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2016, 18:50 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Значит не судьба. Возможно, триггера с одинаковыми позициями выполняются в алфавитном порядке. Попробуй. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2016, 18:54 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovВозможноЭто уже осознанное подкладывание себе граблей. Спасибо за помощь. В итоге изменил логику. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2016, 19:21 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
К слову, ситуация вообще выглядит странной. Мало того, что все остальные констрейнты проверяются после триггеров, а чеки до, так еще и получается, что я в триггере могу нарушить чек-констрейнт для изначально валидных данных, и мне за это ничего не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2016, 20:26 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Считается, что триггера пишут не идиоты. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2016, 20:59 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Не знаю, как оно там в IB, но в FB вот так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
причём достаточно давно. Вроде была какая-то возня вокруг этого во времена fb1 (?), но я не помню деталей PS Запись про "BUG #8458" - это со времён IB, не наше. Т.е. по-идее, всё было правильно ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2016, 23:35 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
_Vasilisk_что я в триггере могу нарушить чек-констрейнт для изначально валидных данных, и мне за это ничего не будет. по идее поьзовательские триггера бывают BEFORE UPDATE и AFTER UPDATE при этом AU изменить значение не может и вполне может вызываться после чеков а вот BU может и по идее чеки должны делаться по результатам изменения значений BU-триггерами ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2016, 10:40 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
hvladНе знаю, как оно там в IB, но в FB вот так:Итак, результаты изысканий DDL Код: 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.
Код: sql 1.
Server Version: WI-V9.0.3.437 (IB 2009) Server Implementation: InterBase/x86/Windows NT Server Version: WI-V11.0.4.810 (IB XE3) Server Implementation: InterBase/x64/Windows Operation violates CHECK constraint on view or table . Operation violates CHECK constraint INTEG_2 on view or table TEST. Server Version: WI-V2.5.1.26351 Firebird 2.5 Server Implementation: Firebird/x86/Windows NT1 record(s) was(were) inserted into TEST Просто нет слов ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2016, 15:12 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
_Vasilisk_, а назначить этот триггер не BU а AU в интербейзе позволят ? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2016, 15:23 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Ariochа назначить этот триггер не BU а AU в интербейзе позволят ?Какой триггер? Вы о чем? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2016, 15:31 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
_Vasilisk_, из вашего скрипта сделать его after insert а не before съест такое интербейз ? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2016, 15:34 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Arioch, ты сегодня какую-то чепуху несёшь. BEFORE и AFTER триггеры они разные по смыслу. Ничего ты в AFTER триггере подправить уже не сможешь, следовательно констрейну это никак не поможет ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2016, 15:37 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Симонов Денис, молодец, возьми с полки пирожок (С) но к самому впросу этот труизм ничего не добавляет, а вопрос был, позволяет ли именно IB создать такой триггер или нет ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2016, 15:41 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Ariochа вопрос был, позволяет ли именно IB создать такой триггер или нетПозволяет. И какой в нем будет смысл? Модифицировать поля уже поздно ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2016, 15:48 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Ariochиз вашего скрипта сделать его after insert а не before съест такое интербейз ?Такое никто не съест. Нельзя в AFTER триггере модифицировать поля вставляемой записи ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2016, 15:49 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
_Vasilisk_, продолжайте платить за IB :) PS не удержался, вырвалось ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2016, 15:56 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
_Vasilisk_Позволяет. _Vasilisk_Такое никто не съест. Плюрализм мнений в одной голове ? После приведённого вам примера я от IB чего угодно могу ожидать _Vasilisk_Нельзя в AFTER триггере модифицировать поля вставляемой записи Сами записи м.б. и нет, а вот модифицировать переменные контекста - те самые NEW.xxxx - по моему ранние FB и до-FBшные IB позволяли ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2016, 17:57 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Arioch, ну значит не скопировали они это исправление из FB. ЕМНИП это правилось ещё в Firebird 1.0 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2016, 18:00 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Симонов Денис, Пока не понятно Василиск не пробовал, а у мну IB нет Вот-вот, я же помню что это было, хотя и правилось. И если у них до сих пор чеки не вовремя вызываютсЯ, то может быть они вообще ничего в триггерах не правили. Хотя, конечно, целая пака халявных переменных... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2016, 18:20 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
AriochПлюрализм мнений в одной голове ?Вы внятно формулируйте свои желания AriochПока не понятно Василиск не пробовалЧто я не пробовал? Я уже все написал AriochСами записи м.б. и нет, а вот модифицировать переменные контекста - те самые NEW.xxxx - по моему ранние FB и до-FBшные IB позволялиКак раз выполнение INSERT/DELETE/UPDATE не запрешено нигде. А вот модифицировать контекст - только в BEFORE ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2016, 23:26 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
не пробовали 19487599 сделать ваш триггер Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
и посмотреть позволит ли это IB _Vasilisk_модифицировать контекст - только в BEFORE раньше это было не так, и судя по другому древнему багу в IB - этот тоже могли не исправить ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 10:38 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Ariochи посмотреть позволит ли это IBСтроить логику системы на багах? Увольте! Ariochне пробовалиИ не буду ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 14:54 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
_Vasilisk_Строить логику системы на багах? кто вам это предлагал? не додумывайте _Vasilisk_И не буду Жаль, может ещё у кого под руками свежий IB есть ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 14:57 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Arioch, у меня есть много свежих и несвежих ИБ. Но проверять не буду. Потому что, если правильно помню, это я рапортовал (возможно, с чьей-то подачи, а может и нет) про это поведение, которое исправили в ФБ 1 (см. коммент Влада). А вот рапортовал-ли я это в ИБ - не помню. Впрочем, у меня на очереди лежат несколько мелких багрепортов в ИБ, может и это проверю, где-нибудь в середине августа (и отправлю). ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 15:40 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Arioch, самое интересное зачем оно тебя надо? Пользуешься IB? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 15:48 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Симонов Денис, пользовался бы - был бы IB в наличии - сам бы и проверил любопытно же ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 16:24 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Ariochлюбопытно же Код: sql 1. 2. 3. 4. 5. 6.
Компилируется. Запрос Код: sql 1.
вставляет в таблицу 1. IB 2009 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 16:49 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
_Vasilisk_, значит в IB контекст NEW не делали readonly в AFTER триггерах. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 16:52 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
_Vasilisk_, спасибо. Симонов Денис, ну гипотетически могли поправить в XE3 - но вряд ли, раз они ВООБЩЕ триггеры не трогали, то почти наверняка не трогали вообще ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2016, 17:07 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
hvladНе знаю, как оно там в IB, но в FB вот так: Код: plaintext 1. 2. 3.
"system triggers first " - это те самые, что обеспечивают FK ? Как-то не очень сильно бросилось в глаза, что они "first". DDL: Код: plaintext 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.
Output: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Т.е. во втором стейтменте, который пытается вставить корректное значение для check'a (pid > 0), но отсутствующее в master-таблице, мы видим ошибку о нарушении FK. Однако, значение генератора при этом такое же ( 7 ), как и в результате первого стейтмента, который обломался ввиду нарушения chek'a. Это значит, что: 1) сначала отработал tdetl_bi (он удвоил начальное значение генератора и оно стало = 10), 2) затем check (он своим хитрым условием уменьшил значение генератора на 3 и оно стало = 7), 3) а затем уже принялся за работу system-триггер, проверяющий FK. Итого получаем порядок срабатывания: user_defined trigger ==> check ==> system trigger. Или я не прав ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 22:34 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
На всякий случай, вдруг кому понадобится: последовательность срабатывания триггеров на master & detail таблицах при каскадах. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 22:44 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Ваня Сусанин"system triggers first " - это те самые, что обеспечивают FK ?Нет. Это те, которые созданы системой, но не для check constraints, у них RDB$SYSTEM_FLAG = 1. Сейчас таких быть вообще не должно, может раньше были, не знаю. check constraints, о которых речь, имеют типы 3, 4 и 5. Полный список тут: Код: sql 1. 2. 3.
В твой поток бессознательного я не вникал, скажу лишь, что это Ваня Сусанин1) сначала отработал tdetl_bi (он удвоил начальное значение генератора и оно стало = 10), 2) затем check (он своим хитрым условием уменьшил значение генератора на 3 и оно стало = 7), 3) а затем уже принялся за работу system-триггер, проверяющий FK.полностью соответствует комментарию в коде, который я приводил ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 23:12 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
hvladВаня Сусанин"system triggers first " - это те самые, что обеспечивают FK ?Нет. Это те, которые созданы системой, но не для check constraints, у них RDB$SYSTEM_FLAG = 1. Сейчас таких быть вообще не должно, может раньше были, не знаю. в порядке бреда тогда это м.б. были триггера для изменения БД прямыми модификациями системных таблиц? вот они и следили за этим. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 11:18 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
hvladполностью соответствует комментарию в коде, который я приводил ну вроде не совсем "then user triggers, then triggers that implement check constraints." это если буквально читать означает (USER) BEFORE-xxx, (USER) AFTER-xxx, CHECK_xxx а по факту идёт (USER) BEFORE-xxx, CHECK_xxx, (USER) AFTER-xxx ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 11:23 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Ariochэто если буквально читать означает (USER) BEFORE-xxx, (USER) AFTER-xxx, CHECK_xxx Это ты неправильно читаешь. Весь коммент относится исключительно к BEFORE триггерам, ибо проверять что-то после вставки - странная идея. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 11:59 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
hvladсозданы системой, но не для check constraints, у них RDB$SYSTEM_FLAG = 1. Сейчас таких быть вообще не должно, может раньше были, не знаю.Недосмотрел, их полно :) Они не разрешают некоторые манипуляции с системным каталогом. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 12:08 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovAriochэто если буквально читать означает (USER) BEFORE-xxx, (USER) AFTER-xxx, CHECK_xxx Это ты неправильно читаешь. Весь коммент относится исключительно к BEFORE триггерам, ибо проверять что-то после вставки - странная идея.В комменте вообще не упоминаются BEFORE\AFTER события. Посему итоговый порядок таков BEFORE SYSTEM (1) BEFORE USER BEFORE SYSTEM (3-5) AFTER SYSTEM (1) AFTER USER AFTER SYSTEM (3-5) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 12:11 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
hvlad, т.е. сортировка "по двум столбцам", сначала по before/after и потом внутри каждого по system/user/check IMHO было бы неплохо это вно в комментарий воткнуть при случае ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 12:17 |
|
CHECK constraint
|
|||
---|---|---|---|
#18+
hvladВ комменте вообще не упоминаются BEFORE\AFTER события и обычно это означает, что раз не указаны подмножества, то в ход идёт всё множества комментарии то пишут, не для тех кто уже понял функцию, а для тех кто только начинает разбираться не код функции поясняет комментарии, а наоборот.... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2016, 12:19 |
|
|
start [/forum/topic.php?all=1&fid=40&tid=1562026]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
others: | 284ms |
total: | 442ms |
0 / 0 |