当我想插入一列到一个现有的表(或减少一个字段的大小)在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表,我不能“创建或替换”就因为这个原因。
如果你接受改变工作表的名称你的样品是正确的?
如何做一个列级?
例如:
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如何回应?