Oracle: исключая обновления одного столбца для увольнения триггера

Используйте в своих интересах ВИД и ПРЕДЕЛ, как Вы были бы с разбиением на страницы. Если Вы хотите ith блок строк, используйте СМЕЩЕНИЕ.

SELECT val FROM big_table
where val = someval
ORDER BY id DESC
LIMIT n;

В ответ на Nir: операция вида не обязательно оштрафована, это зависит от того, что делает планировщик запроса. Так как этот вариант использования крайне важен для выполнения разбиения на страницы, существует некоторая оптимизация (см. ссылку выше). Это верно в пост-ГРЭС также "ORDER BY... ПРЕДЕЛ может быть сделан, не сортируя" E.7.1. Последний маркер

explain extended select id from items where val = 48 order by id desc limit 10;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | items | const | PRIMARY       | PRIMARY | 4       | const |    1 | Using index | 
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+

10
задан Theo Lenndorff 19 September 2013 в 20:45
поделиться

3 ответа

Вы можете сделать что-то вроде этого:

create or replace trigger my_trigger
before update on my_table
for each row
declare
   n_cols integer := 0;
begin
   for r in (select column_name from all_tab_columns
             where table_name = 'MY_TABLE'
             and owner = 'MY_SCHEMA')
   loop
      if updating(r.column_name) then
         n_cols := n_cols + 1;
         exit when n_cols > 1;
      end if;
   end loop;
   if n_cols > 1 then
      do_something;
   end if;
end;

Хотя, наверное, не очень эффективно!

11
ответ дан 3 December 2019 в 20:05
поделиться

Я не думаю, что есть способ избежать необходимости перечислять все другие столбцы в таблице либо в теле триггера, либо в перед обновлением .. .

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

0
ответ дан 3 December 2019 в 20:05
поделиться

Вероятно, это не тот ответ, который вы хотите услышать, но я думаю, что вы слишком преувеличиваете бремя обслуживания. Очень часто структура таблицы после запуска в производство не является нормальным явлением. Если у вас есть таблица, в которой часто меняются номера или имена столбцов, то я бы посоветовал вам столкнуться с более серьезной архитектурной проблемой.

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

3
ответ дан 3 December 2019 в 20:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: