杀死oracle用户所有进程,如何杀掉一个用户下的所有进程并drop掉这个用户

如何杀掉一个用户下的所有进程并drop掉这个用户

发布时间:2020-08-09 07:13:09

来源:ITPUB博客

阅读:108

作者:dbasdk

如何杀掉一个用户下的所有进程并drop掉这个用户

Copy the sample code below into a file named kill_drop_user.sql.

Open SQL*Plus and connect as user SYS to your database

SQL> CONNECT sys/change_on_install@orcl AS SYSDBA

Create a user called TEST with password TEST

SQL> GRANT connect, resource TO test IDENTIFIED BY test;

Create the procedure kill_drop_user

SQL> @"C:\scripts\kill_drop_user.sql"

Open three (3) SQL*Plus sessions and connect as user TEST.

Execute the PL/SQL script

SQL> SET serveroutput ON size 1000000 SQL> SET timing ON SQL> EXEC kill_drop_user('TEST');

CAUTION

This sample code is provided for educational purposes only, and is not supported by Oracle Support. It has been tested internally, however, we do not guarantee that it will work for you. Ensure that you run it in your test environment before using.

SAMPLE CODE

CREATE OR REPLACE PROCEDURE kill_drop_user (in_username IN VARCHAR2,

sleep_interval IN NUMBER DEFAULT 10)

AS

PRAGMA AUTONOMOUS_TRANSACTION;

cannot_drop_user EXCEPTION;

PRAGMA EXCEPTION_INIT(cannot_drop_user, -1940);

user_count    NUMBER := -1;

BEGIN

SELECT count(*) INTO user_count FROM dba_users WHERE username = in_username;

IF user_count = 0 THEN

DBMS_OUTPUT.PUT_LINE('User ' || in_username || ' does not exist.');

RETURN;

END IF;

FOR i IN (SELECT sid, serial# FROM v$session WHERE username = in_username) LOOP

EXECUTE IMMEDIATE 'alter system kill session ' || '''' || i.sid || ',' || i.serial# || ''' immediate';

DBMS_OUTPUT.PUT_LINE('Killing user ' || i.sid || ', ' || i.serial#);

END LOOP;

LOOP

BEGIN

DBMS_OUTPUT.PUT_LINE('Attempting to drop user ' || in_username || '...');

EXECUTE IMMEDIATE 'DROP USER ' || in_username || ' CASCADE';

EXIT WHEN SQLCODE <> -1940;

EXCEPTION

WHEN cannot_drop_user THEN

--DBMS_OUTPUT.PUT_LINE(SQLERRM);

DBMS_OUTPUT.PUT_LINE('Waiting ' || sleep_interval || ' seconds for resource clean-up...');

DBMS_LOCK.SLEEP(sleep_interval);

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE('Inner: ' || SQLERRM);

END;

END LOOP;

DBMS_OUTPUT.PUT_LINE('Exiting loop with SQLCODE: ' || SQLCODE);

DBMS_OUTPUT.PUT_LINE('User ' || in_username || ' has been dropped.');

EXCEPTION

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE('Outer: ' || SQLERRM);

END;

/

SAMPLE OUTPUT

SQL*Plus: Release 10.1.0.4.0 - Production on Tue Sep 6 15:34:47 2005

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.1.0.4.0 - Production

With the Partitioning, OLAP and Data Mining options

SQL> CONNECT sys/change_on_install@orcl AS SYSDBA

Connected.

SQL> GRANT connect, resource TO test IDENTIFIED BY test;

Grant succeeded.

SQL> @"C:\scripts\kill_drop_user.sql"

Procedure created.

SQL> SET serveroutput ON size 1000000

SQL> SET timing ON

SQL> EXEC kill_drop_user('TEST');

Killing user 152, 6915

Killing user 153, 326

Killing user 154, 156

Attempting to drop user TEST...

Waiting 10 seconds for resource clean-up...

Attempting to drop user TEST...

Exiting loop with SQLCODE: 0

User TEST has been dropped.

PL/SQL procedure successfully completed.

Elapsed: 00:00:10.71

SQL> -- verify user has been dropped

SQL> CONNECT test/test@orcl

ERROR:

ORA-01017: invalid username/password; logon denied

Warning: You are no longer connected to ORACLE.

SQL>

转自MOS

如何杀掉一个用户下的所有进程并drop掉这个用户

Copy the sample code below into a file named kill_drop_user.sql.

Open SQL*Plus and connect as user SYS to your database

SQL> CONNECT sys/change_on_install@orcl AS SYSDBA

Create a user called TEST with password TEST

SQL> GRANT connect, resource TO test IDENTIFIED BY test;

Create the procedure kill_drop_user

SQL> @"C:\scripts\kill_drop_user.sql"

Open three (3) SQL*Plus sessions and connect as user TEST.

Execute the PL/SQL script

SQL> SET serveroutput ON size 1000000 SQL> SET timing ON SQL> EXEC kill_drop_user('TEST');

CAUTION

This sample code is provided for educational purposes only, and is not supported by Oracle Support. It has been tested internally, however, we do not guarantee that it will work for you. Ensure that you run it in your test environment before using.

SAMPLE CODE

CREATE OR REPLACE PROCEDURE kill_drop_user (in_username IN VARCHAR2,

sleep_interval IN NUMBER DEFAULT 10)

AS

PRAGMA AUTONOMOUS_TRANSACTION;

cannot_drop_user EXCEPTION;

PRAGMA EXCEPTION_INIT(cannot_drop_user, -1940);

user_count    NUMBER := -1;

BEGIN

SELECT count(*) INTO user_count FROM dba_users WHERE username = in_username;

IF user_count = 0 THEN

DBMS_OUTPUT.PUT_LINE('User ' || in_username || ' does not exist.');

RETURN;

END IF;

FOR i IN (SELECT sid, serial# FROM v$session WHERE username = in_username) LOOP

EXECUTE IMMEDIATE 'alter system kill session ' || '''' || i.sid || ',' || i.serial# || ''' immediate';

DBMS_OUTPUT.PUT_LINE('Killing user ' || i.sid || ', ' || i.serial#);

END LOOP;

LOOP

BEGIN

DBMS_OUTPUT.PUT_LINE('Attempting to drop user ' || in_username || '...');

EXECUTE IMMEDIATE 'DROP USER ' || in_username || ' CASCADE';

EXIT WHEN SQLCODE <> -1940;

EXCEPTION

WHEN cannot_drop_user THEN

--DBMS_OUTPUT.PUT_LINE(SQLERRM);

DBMS_OUTPUT.PUT_LINE('Waiting ' || sleep_interval || ' seconds for resource clean-up...');

DBMS_LOCK.SLEEP(sleep_interval);

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE('Inner: ' || SQLERRM);

END;

END LOOP;

DBMS_OUTPUT.PUT_LINE('Exiting loop with SQLCODE: ' || SQLCODE);

DBMS_OUTPUT.PUT_LINE('User ' || in_username || ' has been dropped.');

EXCEPTION

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE('Outer: ' || SQLERRM);

END;

/

SAMPLE OUTPUT

SQL*Plus: Release 10.1.0.4.0 - Production on Tue Sep 6 15:34:47 2005

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.1.0.4.0 - Production

With the Partitioning, OLAP and Data Mining options

SQL> CONNECT sys/change_on_install@orcl AS SYSDBA

Connected.

SQL> GRANT connect, resource TO test IDENTIFIED BY test;

Grant succeeded.

SQL> @"C:\scripts\kill_drop_user.sql"

Procedure created.

SQL> SET serveroutput ON size 1000000

SQL> SET timing ON

SQL> EXEC kill_drop_user('TEST');

Killing user 152, 6915

Killing user 153, 326

Killing user 154, 156

Attempting to drop user TEST...

Waiting 10 seconds for resource clean-up...

Attempting to drop user TEST...

Exiting loop with SQLCODE: 0

User TEST has been dropped.

PL/SQL procedure successfully completed.

Elapsed: 00:00:10.71

SQL> -- verify user has been dropped

SQL> CONNECT test/test@orcl

ERROR:

ORA-01017: invalid username/password; logon denied

Warning: You are no longer connected to ORACLE.

SQL>

转自MOS

Copy the sample code below into a file named kill_drop_user.sql.

Open SQL*Plus and connect as user SYS to your database

SQL> CONNECT sys/change_on_install@orcl AS SYSDBA

Create a user called TEST with password TEST

SQL> GRANT connect, resource TO test IDENTIFIED BY test;

Create the procedure kill_drop_user

SQL> @"C:\scripts\kill_drop_user.sql"

Open three (3) SQL*Plus sessions and connect as user TEST.

Execute the PL/SQL script

SQL> SET serveroutput ON size 1000000 SQL> SET timing ON SQL> EXEC kill_drop_user('TEST');

CAUTION

This sample code is provided for educational purposes only, and is not supported by Oracle Support. It has been tested internally, however, we do not guarantee that it will work for you. Ensure that you run it in your test environment before using.

SAMPLE CODE

CREATE OR REPLACE PROCEDURE kill_drop_user (in_username IN VARCHAR2,

sleep_interval IN NUMBER DEFAULT 10)

AS

PRAGMA AUTONOMOUS_TRANSACTION;

cannot_drop_user EXCEPTION;

PRAGMA EXCEPTION_INIT(cannot_drop_user, -1940);

user_count    NUMBER := -1;

BEGIN

SELECT count(*) INTO user_count FROM dba_users WHERE username = in_username;

IF user_count = 0 THEN

DBMS_OUTPUT.PUT_LINE('User ' || in_username || ' does not exist.');

RETURN;

END IF;

FOR i IN (SELECT sid, serial# FROM v$session WHERE username = in_username) LOOP

EXECUTE IMMEDIATE 'alter system kill session ' || '''' || i.sid || ',' || i.serial# || ''' immediate';

DBMS_OUTPUT.PUT_LINE('Killing user ' || i.sid || ', ' || i.serial#);

END LOOP;

LOOP

BEGIN

DBMS_OUTPUT.PUT_LINE('Attempting to drop user ' || in_username || '...');

EXECUTE IMMEDIATE 'DROP USER ' || in_username || ' CASCADE';

EXIT WHEN SQLCODE <> -1940;

EXCEPTION

WHEN cannot_drop_user THEN

--DBMS_OUTPUT.PUT_LINE(SQLERRM);

DBMS_OUTPUT.PUT_LINE('Waiting ' || sleep_interval || ' seconds for resource clean-up...');

DBMS_LOCK.SLEEP(sleep_interval);

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE('Inner: ' || SQLERRM);

END;

END LOOP;

DBMS_OUTPUT.PUT_LINE('Exiting loop with SQLCODE: ' || SQLCODE);

DBMS_OUTPUT.PUT_LINE('User ' || in_username || ' has been dropped.');

EXCEPTION

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE('Outer: ' || SQLERRM);

END;

/

SAMPLE OUTPUT

SQL*Plus: Release 10.1.0.4.0 - Production on Tue Sep 6 15:34:47 2005

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.1.0.4.0 - Production

With the Partitioning, OLAP and Data Mining options

SQL> CONNECT sys/change_on_install@orcl AS SYSDBA

Connected.

SQL> GRANT connect, resource TO test IDENTIFIED BY test;

Grant succeeded.

SQL> @"C:\scripts\kill_drop_user.sql"

Procedure created.

SQL> SET serveroutput ON size 1000000

SQL> SET timing ON

SQL> EXEC kill_drop_user('TEST');

Killing user 152, 6915

Killing user 153, 326

Killing user 154, 156

Attempting to drop user TEST...

Waiting 10 seconds for resource clean-up...

Attempting to drop user TEST...

Exiting loop with SQLCODE: 0

User TEST has been dropped.

PL/SQL procedure successfully completed.

Elapsed: 00:00:10.71

SQL> -- verify user has been dropped

SQL> CONNECT test/test@orcl

ERROR:

ORA-01017: invalid username/password; logon denied

Warning: You are no longer connected to ORACLE.

SQL>

转自MOS

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值