我正在嘗試使用Oracle刪除連接的用戶。由於Oracle是一款出色的軟件產品,因此這個問題已被問及7億次以上。但是,我發現所有的答案都需要用戶輸入,並且不能在發佈時自動執行。典型的答案在此陳述如下:https://stackoverflow.com/a/15665694/177293Oracle:自動刪除並重新創建連接的用戶
我想在沒有人介入的腳本中這樣做。所以,我想是這樣的:
BEGIN
FOR i IN (
SELECT sid, serial# from v$session where username = 'MYUSER'
) LOOP
EXECUTE IMMEDIATE 'alter system kill session ''' || i.sid || ',' || i.serial# || ''';';
END LOOP;
END;
其中,歡快,在在sqlplus結果:
BEGIN
*
ERROR at line 1:
ORA-00911: invalid character
ORA-06512: at line 5
嘗試一個稍微不同的策略:
BEGIN
FOR i IN (
SELECT
'alter system kill session ''' || sid || ',' || serial# || ''';'
from v$session where username = 'MYUSER'
) LOOP
EXECUTE IMMEDIATE ''|| i ||'';
END LOOP;
END;
結果:
EXECUTE IMMEDIATE ''|| i ||'';
*
ERROR at line 7:
ORA-06550: line 7, column 21:
PLS-00306: wrong number or types of arguments in call to '||'
ORA-06550: line 7, column 3:
PL/SQL: Statement ignored
我希望有af如下所示:
#!/bin/sh
sqlplus system/manager <<EOT
BEGIN
FOR i IN (
SELECT sid, serial# FROM v$session WHERE username = 'MYUSER'
) LOOP
EXECUTE IMMEDIATE 'alter system kill session ''' || i.sid || ',' || i.serial# || ''';';
END LOOP;
END;
DROP USER MYUSER CASCADE;
DROP TABLESPACE MYUSER INCLUDING CONTENTS AND DATAFILES;
CREATE USER MYUSER IDENTIFIED BY password;
ALTER USER MYUSER IDENTIFIED BY password;
GRANT connect, resource TO MYUSER;
exit;
EOT
上面出現了什麼問題?
我不明白爲什麼你認爲應該很容易將活動用戶放在活動系統中,而活動系統中的對象實際上可能正在被應用程序使用。看起來像是一件應該很難的事情。 – 2014-10-01 02:34:27
既然你的意圖是放棄整個架構,也許首先撤銷用戶對象上的所有授權將會很有幫助。然後,您無法在其他帳戶中鎖定這些對象的新會話。 – 2014-10-01 02:37:02
@DaveCosta我明白了你的觀點,通常很難刪除或刪除正在使用的內容。但問題的一部分是Oracle對什麼是「主動」有模糊的定義,特別是對於臨時表。即使在沒有任何活動事務的情況下,會話也可以阻止事物,這真的很煩人。 – 2014-10-01 03:18:46