要更改触发的Oracle数据库中的分配

问题描述 投票:1回答:1

当我想插入一列到一个现有的表(或减少一个字段的大小)在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表,我不能“创建或替换”就因为这个原因。

如果你接受改变工作表的名称你的样品是正确的?

oracle triggers ddl alter
1个回答
0
投票

如何做一个列级?

例如:

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.

降低列名是棘手的。这一件作品;触发还行:

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如何回应?

© www.soinside.com 2019 - 2024. All rights reserved.