Вы обычно только получаете отказ сегментации, при попытке получить доступ к памяти, Ваш процесс не владеет.
В случае чего Вы видите a[11]
(и a[10]
между прочим), память, которой Ваш процесс владеет, но не принадлежит a[]
массив. a[25000]
так далеко от a[]
, это, вероятно, вне Вашей памяти в целом.
Изменение a[11]
намного более коварно, поскольку это тихо влияет на другую переменную (или стековый фрейм, который может вызвать другой отказ сегментации, когда Ваша функция возвращается).
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7004.htm#SQLRF01405
Примечание. Я предполагаю, что ORACLE - это базы данных, поскольку вы отметили свой вопрос с помощью ORACLE
Единственный способ использовать один триггер для нескольких таблиц - это создать представление.
Если бы я не хотел для создания представления я бы создал сценарий (или что-то еще, используя нужный язык) и список таблиц, в которых будет создан этот триггер (сделайте создание триггеров динамическим). Я вижу, что ваша точка зрения состоит в том, чтобы обеспечить лучшую ремонтопригодность в этой ситуации, и я думаю, что создание представления является более чистым решением (и простым в обслуживании), чем динамическое создание триггера для каждой таблицы.
Почему бы вам не поместить свою логику в хранимую процедуру, а затем просто вызвать ее из триггеров?
Я также предлагаю вам взглянуть на уведомление об изменении , судя по звуку, который, вероятно, то, что вам нужно, больше, чем простой старый триггер.
Также будьте осторожны при вызове внешних ресурсов. Все, что вы вызываете в триггере, должно быть транзакционным, поскольку Oracle может запустить триггер несколько раз до того, как ваш DML будет фактически завершен.