Чтобы изменить назначение триггера в базе данных Oracle - PullRequest
0 голосов
/ 11 февраля 2019

Когда я хочу вставить столбец в существующую таблицу (или уменьшить размер поля) в базе данных Oracle, я переименовываю его, воссоздаю другую таблицу (со старым именем) и копирую данные из старой в новую таблицу.

Но в то же время все триггеры, прикрепленные к таблице, меняются в соответствии с ее новым именем, и мне приходится:

  1. копировать определение одного триггера
  2. удалить этот триггер
  3. изменить имя прикрепленной таблицы в определении триггера
  4. пересоздать триггер
  5. сделать то же самое для всех подключенных триггеров

Есть ли способ изменить имя таблицы, к которой относятся триггеры, без необходимости воссоздавать их с нуля?

@ 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 , и я не могу« создать или заменить »это из-за этого.

Ваш образец соответствуетесли вы согласитесь изменить имя рабочего стола ...

1 Ответ

0 голосов
/ 11 февраля 2019

Как насчет того, чтобы сделать это на уровне столбца?

Например:

SQL> create table test (id number, name varchar2(20));

Table created.

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  /

Trigger created.

SQL> insert into test (name) values ('Littlefoot');

1 row created.

SQL> select * from test;

        ID NAME
---------- --------------------
        21 Littlefoot

SQL>

Добавить новый столбец легко:

SQL> alter table test add (address varchar2(20));

Table altered.

Уменьшить имя столбца 1010 * хитрый *.Этот работает;триггер все еще в порядке:

SQL> alter table test modify name varchar2(15);

Table altered.

SQL> select status from user_triggers where trigger_name = 'TRG_BI_TEST';

STATUS
--------
ENABLED

Это не так просто, но - существует обходной путь:

SQL> alter table test modify id number(4);
alter table test modify id number(4)
                        *
ERROR at line 1:
ORA-01440: column to be modified must be empty to decrease precision or scale


SQL> -- OK; it failed, so - let's add a new column, put old values in there, 
SQL> -- drop the old column, rename the new column:
SQL> alter table test add id_new number(4);

Table altered.

SQL> update test set id_new = id;

1 row updated.

SQL> alter table test drop column id;

Table altered.

SQL> alter table test rename column id_new to id;

Table altered.

SQL> select status from user_triggers where trigger_name = 'TRG_BI_TEST';

STATUS
--------
ENABLED

SQL> insert into test (name) values ('Bigfoot');

1 row created.

SQL> select * from test;

NAME            ADDRESS                      ID
--------------- -------------------- ----------
Littlefoot                                   21
Bigfoot                                      22

SQL>

ОК, давайте переименуем таблицу:

SQL> rename test to test_new;

Table renamed.

SQL> insert into test_new (name) values ('Testing');

1 row created.

SQL> select * from test_new;

NAME            ADDRESS                      ID
--------------- -------------------- ----------
Littlefoot                                   21
Testing                                      23
Bigfoot                                      22

SQL>

Как видите, мне вообще не нужно было нажимать на курок, что бы я ни делал.

Если у вас все еще есть проблемы, не могли бы вы отредактировать ваше сообщение и продемонстрировать, что вы сделали и как отреагировал Oracle?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...