如何在 Oracle 中重命名序列?
How to rename a sequence in Oracle?
我需要重命名表格的序列。有很多表,它们很复杂,不希望丢弃任何东西。有没有办法重命名它们?
我试过了:
ALTER SEQUENCE ISEQ$$_149698 RENAME TO NEW_SEQUENCE;
RENAME ISEQ$$_149698 to NEW_SEQUENCE;
第一个选项抛出以下错误:
SQL Error [2286] [42000]: ORA-02286: no options specified for ALTER SEQUENCE
第二个:
SQL Error [32799] [99999]: ORA-32799: cannot rename a system-generated sequence
rename old_seq to new_sequence;
您不能重命名为标识列生成的序列。 (正如其他用户所指出的,并且正如错误消息所暗示的那样。)因此,我建议您使用序列默认值而不是标识列。
例如:
--Create the sequence and a table to use it.
create sequence my_sequence;
create table my_table(a number default my_sequence.nextval, b number);
--Rename the sequence to whatever you want.
rename my_sequence to my_sequence2;
但是,默认方法有一些缺点:
- 此功能在 12.1 之前不可用。 (尽管标识列也是一项新功能。)
- 您必须自己创建序列(显然)。
- 您还需要记住将序列授予将向 table:
插入行的任何用户
grant insert, select on my_table to test_user;
grant select on my_sequence to test_user;
- 如果重命名默认序列,您还必须修改默认值以指向新序列。
--Afate a sequence rename, this INSERT fails with: ORA-02289: sequence does not exist
insert into my_table(b) values(1);
--You must first modify the table:
alter table my_table modify a number default my_sequence2.nextval;
--Now this will run:
insert into my_table(b) values(1);
尽管使用序列默认值有缺点,但我仍然更喜欢这种方法而不是标识列,因为我希望我的所有对象在每个环境中都具有完全相同的名称。
我需要重命名表格的序列。有很多表,它们很复杂,不希望丢弃任何东西。有没有办法重命名它们?
我试过了:
ALTER SEQUENCE ISEQ$$_149698 RENAME TO NEW_SEQUENCE;
RENAME ISEQ$$_149698 to NEW_SEQUENCE;
第一个选项抛出以下错误:
SQL Error [2286] [42000]: ORA-02286: no options specified for ALTER SEQUENCE
第二个:
SQL Error [32799] [99999]: ORA-32799: cannot rename a system-generated sequence
rename old_seq to new_sequence;
您不能重命名为标识列生成的序列。 (正如其他用户所指出的,并且正如错误消息所暗示的那样。)因此,我建议您使用序列默认值而不是标识列。
例如:
--Create the sequence and a table to use it.
create sequence my_sequence;
create table my_table(a number default my_sequence.nextval, b number);
--Rename the sequence to whatever you want.
rename my_sequence to my_sequence2;
但是,默认方法有一些缺点:
- 此功能在 12.1 之前不可用。 (尽管标识列也是一项新功能。)
- 您必须自己创建序列(显然)。
- 您还需要记住将序列授予将向 table: 插入行的任何用户
grant insert, select on my_table to test_user;
grant select on my_sequence to test_user;
- 如果重命名默认序列,您还必须修改默认值以指向新序列。
--Afate a sequence rename, this INSERT fails with: ORA-02289: sequence does not exist
insert into my_table(b) values(1);
--You must first modify the table:
alter table my_table modify a number default my_sequence2.nextval;
--Now this will run:
insert into my_table(b) values(1);
尽管使用序列默认值有缺点,但我仍然更喜欢这种方法而不是标识列,因为我希望我的所有对象在每个环境中都具有完全相同的名称。