oracle怎么删除schema,使用sys用户删除其他schema下的dblink

目标数据库:

SQL> conn mytest/mytest

Connected.

SQL>

SQL> create table emp (id int,name varchar2(20));

Table created.

SQL> insert into emp values (1,'zhangsan');

1 row created.

SQL> insert into emp values (2,'wangwu');

1 row created.

SQL> commit;

Commit complete.

源库,先建立到目标数据库的连接

[oracle@r11g admin]$ vi tnsnames.ora

ecctest =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.24.22.135)(PORT = 1527))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = R6Q)

)

)

~

测试连接的有效性

[oracle@r11g admin]$ tnsping ecctest

TNS Ping Utility for Linux: Version 11.2.0.3.0 - Production on 12-DEC-2013 14:16:03

Copyright (c) 1997, 2011, Oracle.  All rights reserved.

Used parameter files:

Used TNSNAMES adapter to resolve the alias

Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.24.22.135)(PORT = 1527)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = R6Q)))

OK (100 msec)

[oracle@r11g admin]$

在liutya用户下建立测试用的dblink

SQL> conn liutya/liutya

Connected.

SQL>

SQL>

SQL> create database link lecctest connect to mytest identified by mytest using 'ecctest';

create database link lecctest connect to mytest identified by mytest using 'ecctest'

*

ERROR at line 1:

ORA-01031: insufficient privileges

这是缺少相应的权限。

SQL> conn / as sysdba

Connected.

SQL>

SQL> grant create database link to liutya;

Grant succeeded.

SQL> conn liutya/liutya

Connected.

创建DBLINK

SQL>  create database link lecctest connect to mytest identified by mytest using 'ecctest';

Database link created.

SQL> select * from emp@lecctest;

ID NAME

---------- --------------------

1 zhangsan

2 wangwu

下面使用sys做测试删除

SQL> conn / as sysdba

Connected.

SQL>

SQL> show user;

USER is "SYS"

SQL> set linesize 200

SQL> col owner format a20

SQL> col db_link format a20

SQL> col username format a20

SQL>

SQL> col host format a60

SQL>

SQL> select * from dba_db_links;

OWNER                DB_LINK              USERNAME             HOST                                                         CREATED

-------------------- -------------------- -------------------- ------------------------------------------------------------ ---------

LIUTYA               LECCTEST             MYTEST               ecctest                                                      12-DEC-13

SQL> drop database link liutya.lecctest;

drop database link liutya.lecctest

*

ERROR at line 1:

ORA-02024: database link not found

使用drop database link 命令是无法删除其他schema下的dblink的,是否还有其他办法呢?下面是从网上找到的两个方法:

方法一、使用下面的脚本,使用job方式删除dblink

begin

dbms_scheduler.create_job(

job_name=>'&owner..drop_database_link',

job_type=>'PLSQL_BLOCK',

job_action=>'BEGIN execute immediate ''drop database link &db_link'';END;'

);

dbms_scheduler.run_job('&owner..drop_database_link',false);

dbms_lock.sleep(2);

dbms_scheduler.drop_job('&owner..drop_database_link');

end;

/

输入变量需要使用大写。

SQL> begin

2    dbms_scheduler.create_job(

3      job_name=>'&owner..drop_database_link',

4      job_type=>'PLSQL_BLOCK',

5      job_action=>'BEGIN execute immediate ''drop database link &db_link'';END;'

6    );

7    dbms_scheduler.run_job('&owner..drop_database_link',false);

8    dbms_lock.sleep(2);

9    dbms_scheduler.drop_job('&owner..drop_database_link');

10  end;

11  /

Enter value for owner: LIUTYA

old   3:     job_name=>'&owner..drop_database_link',

new   3:     job_name=>'LIUTYA.drop_database_link',

Enter value for db_link: LECCTEST

old   5:     job_action=>'BEGIN execute immediate ''drop database link &db_link'';END;'

new   5:     job_action=>'BEGIN execute immediate ''drop database link LECCTEST'';END;'

Enter value for owner: LIUTYA

old   7:   dbms_scheduler.run_job('&owner..drop_database_link',false);

new   7:   dbms_scheduler.run_job('LIUTYA.drop_database_link',false);

Enter value for owner: LIUTYA

old   9:   dbms_scheduler.drop_job('&owner..drop_database_link');

new   9:   dbms_scheduler.drop_job('LIUTYA.drop_database_link');

PL/SQL procedure successfully completed.

SQL> select * from dba_db_links;

no rows selected

测试成功。

重建测试环境

SQL> conn liutya/liutya

Connected.

SQL>

SQL> create database link lecctest connect to mytest identified by mytest using 'ecctest';

Database link created.

SQL> conn / as sysdba

Connected.

SQL>

SQL> select * from dba_db_links;

OWNER                DB_LINK              USERNAME             HOST                                                         CREATED

-------------------- -------------------- -------------------- ------------------------------------------------------------ ---------

LIUTYA               LECCTEST             MYTEST               ecctest                                                      12-DEC-13

SQL> show user;

USER is "SYS"

方法二、使用下面的存储过程

Create or replace procedure Drop_DbLink(schemaName varchar2, dbLink varchar2 ) is

plsql   varchar2(1000);

cur     number;

uid     number;

rc      number;

begin

select

u.user_id into uid

from    dba_users u

where   u.username = schemaName;

plsql := 'drop database link "'||dbLink||'"';

cur := SYS.DBMS_SYS_SQL.open_cursor;

SYS.DBMS_SYS_SQL.parse_as_user(

c => cur,

statement => plsql,

language_flag => DBMS_SQL.native,

userID => uid

);

rc := SYS.DBMS_SYS_SQL.execute(cur);

SYS.DBMS_SYS_SQL.close_cursor(cur);

end;

/

SQL> Create or replace procedure Drop_DbLink(schemaName varchar2, dbLink varchar2 ) is

2              plsql   varchar2(1000);

3              cur     number;

4              uid     number;

5              rc      number;

6      begin

7              select

8                      u.user_id into uid

9             from    dba_users u

10             where   u.username = schemaName;

11               plsql := 'drop database link "'||dbLink||'"';

12               cur := SYS.DBMS_SYS_SQL.open_cursor;

13               SYS.DBMS_SYS_SQL.parse_as_user(

14                     c => cur,

15                     statement => plsql,

16                     language_flag => DBMS_SQL.native,

17                     userID => uid

18            );

19               rc := SYS.DBMS_SYS_SQL.execute(cur);

20

21               SYS.DBMS_SYS_SQL.close_cursor(cur);

22     end;

23     /

Procedure created.

注意输入参数全部为大写。

SQL> exec drop_dblink('LIUTYA','LECCTEST');

PL/SQL procedure successfully completed.

SQL> select * from dba_db_links;

no rows selected

SQL> drop procedure drop_dblink;

Procedure dropped.

测试同样成功。

参考资料

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11590946/viewspace-1063080/,如需转载,请注明出处,否则将追究法律责任。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值