天天看点

rename表后, 同义词synonym失效问题

今日,因为生产线上要迁移大表,做历史表。在做rename表后,程序报错。rename之后,不仅synonym失效,grant的授权也会失效。下面看测试步骤和结论:

SQL> create user test2 identified by "test2";

User created.

SQL> grant create session ,resource to test2;

Grant succeeded.

SQL> create public synonym t1 for test1.t1;

Synonym created.

SQL> grant select on test1.t1 to test2;

Grant succeeded.

SQL> conn test2/test2
Connected.

SQL> select * from t1;

ID
----------
test




SQL> create table test1.t1_new as select * from test1.t1;

Table created.

SQL> select * from test1.t1_new;

ID
----------
test

SQL> alter table test1.t1 rename to t1_hist;

Table altered.

SQL> select table_name,owner from dba_tables where table_name='T1_HIST';

TABLE_NAME                     OWNER
------------------------------ ------------------------------
T1_HIST                        TEST1

SQL> alter table test1.t1_new rename to t1;

Table altered.

SQL> select table_name,owner from dba_tables where table_name='T1';

TABLE_NAME                     OWNER
------------------------------ ------------------------------
T1                             TEST1

SQL> conn test2/test2
Connected.
SQL> select * from t1;
select * from t1
              *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> alter table test1.t1 rename to t1_new;

Table altered.

SQL> alter table test1.t1_hist rename to t1;

Table altered.

SQL> conn test2/test2    
Connected.
SQL>  select * from test1.t1;

ID
----------
test

SQL> select * FROM T1;

ID
----------
test



trigger测试:

SQL> 
SQL> create or replace trigger test1.after_insert_t1
  2  after insert on test1.t1 for each row
  3  declare
  4  begin 
  5  insert into test1.t2 (id) values(:new.id);
  6  end;
  7  /

Trigger created.

SQL> 
SQL> 
SQL> insert into test1.t1(id) values('tr1');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from test1.t2;

ID
----------
test
tr1

SQL> alter table test1.t1 rename to t1_hist;

Table altered.

SQL> alter table test1.t1_new rename to t1;

Table altered.

SQL> insert into test1.t1(id) values('tr2');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from test1.t1;

ID
----------
test
tr2