Когда я хочу вставить столбец в существующую таблицу (или уменьшить размер поля) в базе данных Oracle, я переименовываю его, заново создаю другую таблицу (со старым именем) и копирую данные из старой в новую таблицу.
Но при этом все триггеры, прикрепленные к таблице, меняются в соответствии с ее новым именем, и я должен:
- скопировать определение одного триггера
- удалить этот триггер
- изменить имя прикрепленной таблицы в определении триггера
- воссоздать триггер
- сделать то же самое для всех подключенных триггеров
Есть ли способ изменить имя таблицы, на которую ссылаются триггеры, без необходимости воссоздавать их с нуля?
@Littlefoot
Пример:
SQL> create table test (id number, name varchar2(20));
Table créée.
SQL> create or replace trigger trg_bi_test
2 before insert on test
3 for each row
4 begin
5 :new.id := seq_test.nextval;
6 end;
7 /
Déclencheur créé.
SQL> insert into test (name) values ('Littlefoot');
1 ligne créée.
SQL> alter table test rename to tmp_test;
Table modifiée.
SQL> create table test (id number, name varchar2(10));
Table créée.
SQL> insert into test
2 (select id, substr(name, 10) from tmp_test);
1 ligne créée.
SQL> create or replace TRIGGER trg_bi_test
2 before insert on "TEST"
3 for each row
4 begin
5 :new.id := seq_test.nextval;
6 end;
7 /
create or replace TRIGGER trg_bi_test
*
ERREUR à la ligne 1 :
ORA-04095: déclencheur 'TRG_BI_TEST' existe déjà sur une autre table,
imposs. de le remplacer
`
И тело триггера:
create or replace TRIGGER trg_bi_test
before insert on "TMP_TEST"
for each row
begin
:new.id := seq_test.nextval;
end;
Как видите, триггер привязан к таблице TMP_TEST, и из-за этого я не могу его "создать или заменить".
Ваш образец верен, если вы согласны изменить имя рабочего стола...