|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
Привет всем. Требуется определить наличие триггера определенного типа. Типы всех триггеров можно получить запросом: Код: sql 1. 2. 3.
С простыми триггерами вроде все просто: Код: powershell 1. 2. 3. 4. 5. 6.
А вот с комбинированными триггерами все сложнее (справа значение RDB$TRIGGER_TYPE в двоичном виде): Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Никакой закономерности выявить не смог. Разве что триггера AFTER на единицу больше триггеров BEFORE. Можно ли по значению RDB$TRIGGER_TYPE определить является ли триггер I или U или D без сравнения с вышеприведенными значениями? Например, требуется узнать, есть ли для конкретной VIEW хоть один триггер на UPDATE? С уважением, Polesov. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2017, 13:24 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
PolesovМожно ли по значению RDB$TRIGGER_TYPE определить является ли триггер I или U или D без сравнения с вышеприведенными значениями? Даже сравнением нельзя. Триггера insert or update и update or insert дадут разное значение. Код: plaintext 1. 2. 3. 4.
Результат этой функции 1 - insert, 2 - update, 3 - delete. Повторять для всех трёх слотов. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2017, 13:46 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovТриггера insert or update и update or insert дадут разное значение. Фигассе. А есть разница в механизме срабатывания таких триггеров? Dimitry Sibiryakov Код: plaintext 1. 2. 3. 4.
Результат этой функции 1 - insert, 2 - update, 3 - delete. Повторять для всех трёх слотов. Спасибо за информацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2017, 13:58 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
Polesov, doc\sql.extensions\README.universal_triggers ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2017, 14:27 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
hvlad, Спасибо, все понятно. А есть разница в механизме срабатывания триггеров insert or update и update or insert ? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2017, 14:46 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
PolesovА есть разница в механизме срабатывания триггеров insert or update и update or insert ?Конечно нет. Откуда бы ей взяться ? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2017, 14:48 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
hvladКонечно нет. Откуда бы ей взяться ? А зачем тогда такой замороченный алгоритм кодирования типа триггера? На мой взгляд вполне хватило бы 4 бит. Или "так исторически сложилось"? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2017, 14:55 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
PolesovА зачем тогда такой замороченный алгоритм кодирования типа триггера?Для обратной совместимости. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2017, 15:05 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
Привет всем. UDF, определяющая соответствие хоть одного из слотов в RDB$TRIGGER_TYPE типу DML. Возвращает 0 - false, 1 - true Код: pascal 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.
С уважением, Polesov. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2018, 22:42 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
Я бы для этого UDF не цеплял, проще RDB$TRIGGER_TYPE case-ом распарсить. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2018, 23:49 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустампроще RDB$TRIGGER_TYPE case-ом распарсить. С учетом алгоритма кодирования типа триггера 21072831 , case получится уж очень ветвистым. Тогда уж проще использовать битовые функции bin_and, bin_shl и т.п. Если баз данных, использующих данную функцию, несколько, то при изменении алгоритма, в случае pSQL-реализации, правки потребуется вносить в каждую БД. При UDF-реализации достаточно подменить файл библиотеки на сервере. Ну и UDF - одной больше, одной меньше :-) Впрочем, оба варианта имеют свои плюсы и свои минусы. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2018, 00:12 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
Polesov, Реализация вышеприведенной UDF на pSQL: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2018, 00:34 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
На SQL/PSQL гораздо лучше, ИМХО. Впрочем, не настаиваю. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2018, 00:58 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
Э... а разве bin_shr() модифицирует входные аргументы? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2018, 02:38 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
чччДЭ... а разве bin_shr() модифицирует входные аргументы? Нет, не модифицирует - ашипка. Правильно так: TRIGGER_TYPE = bin_shr( :TRIGGER_TYPE, 2 ); Иначе бесконечный цикл. Код: 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.
Кстати, замеры показали, что UDF примерно в 12 раз быстрее SP Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2018, 03:04 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
Тогда бы уж сразу в виде функции оформлял, а не процедуры. Код: sql 1. 2. 3. 4.
... и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2018, 13:42 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
? /* Без проверки, ибо мобильник */ ... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2018, 13:59 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
двоеточие вне SQL команд можно и не использовать ... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2018, 14:06 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
C двоеточием нагляднее. Да и привычка, автоматом уже набираешь. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2018, 14:13 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
Я в своей хранимой процедуре aux_get_create_statement (формирует SQL-запрос создания объекта БД по его имени) использовал такую вот конструкцию: Код: plsql 1. 2. 3. 4. 5. 6.
полученную на основе описания логики определения типа триггера из исходников Firebird : исходники Firebird на GitHub// that's how trigger action types are encoded /* bit 0 = TRIGGER_BEFORE/TRIGGER_AFTER flag, bits 1-2 = TRIGGER_INSERT/TRIGGER_UPDATE/TRIGGER_DELETE (slot #1), bits 3-4 = TRIGGER_INSERT/TRIGGER_UPDATE/TRIGGER_DELETE (slot #2), bits 5-6 = TRIGGER_INSERT/TRIGGER_UPDATE/TRIGGER_DELETE (slot #3), and finally the above calculated value is decremented example #1: TRIGGER_AFTER_DELETE = = ((TRIGGER_DELETE << 1) | TRIGGER_AFTER) - 1 = = ((3 << 1) | 1) - 1 = = 0x00000110 (6) example #2: TRIGGER_BEFORE_INSERT_UPDATE = = ((TRIGGER_UPDATE << 3) | (TRIGGER_INSERT << 1) | TRIGGER_BEFORE) - 1 = = ((2 << 3) | (1 << 1) | 0) - 1 = = 0x00010001 (17) example #3: TRIGGER_AFTER_UPDATE_DELETE_INSERT = = ((TRIGGER_INSERT << 5) | (TRIGGER_DELETE << 3) | (TRIGGER_UPDATE << 1) | TRIGGER_AFTER) - 1 = = ((1 << 5) | (3 << 3) | (2 << 1) | 1) - 1 = = 0x00111100 (60) */ ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2021, 02:35 |
|
Как определить тип триггера?
|
|||
---|---|---|---|
#18+
atronah Я в своей хранимой процедуре использовал такую вот конструкцию: Код: plsql 1. 2. 3. 4. 5. 6.
А неплохо, однако. Респект. Пригодится в случае автоматизации создания триггеров! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2021, 03:51 |
|
|
start [/forum/topic.php?fid=40&fpage=3&tid=1559899]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 157ms |
0 / 0 |