2014-09-30 70 views
2

我正在嘗試使用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 

上面出現了什麼問題?

回答

2

上述腳本的主要問題是;不應處於動態SQL中。

但不要讓這個騙過你,這仍然是一個難以置信的難題。不幸的是,Oracle系統很少頻繁丟棄和重新創建用戶。這意味着你會遇到很多奇怪的錯誤。

我已經構建了腳本來做到這一點,但不幸的是無法在這裏分享它們。這裏有一些有趣的事情,你必須期待:

  1. 殺死連接的會話。
  2. 殺死阻塞會話擁有的對象的其他會話。
  3. 截斷臨時表,因爲它們有奇怪的鎖定規則。使用它們查看會話,請參閱如何在臨時表刪除期間診斷ORA-14452(文檔ID 800506.1)。
  4. 在KILL語法中使用INST_ID,用於RAC。
  5. 在應用程序產生鎖定對象的新會話的情況下循環遍歷整個過程幾次。
  6. 如果您使用的是對象關係代碼,請執行dbms_session.reset_package。令人驚訝的是,即使在丟棄並重新創建其所有者後,一些對象仍然可以堅持。

如果它是一個複雜的應用程序,期望編寫大約一百行代碼。預計會花費幾周的時間來測試一些奇怪的錯誤。期待它偶爾會失敗。

是的,這很荒謬。 Oracle在快速創建新數據庫方面花費了大量精力;可移動的表空間,可插拔的數據庫,虛擬化等等。你會認爲這將是一個可靠地刪除和重新創建用戶的好方法!

+0

我不明白爲什麼你認爲應該很容易將活動用戶放在活動系統中,而活動系統中的對象實際上可能正在被應用程序使用。看起來像是一件應該很難的事情。 – 2014-10-01 02:34:27

+0

既然你的意圖是放棄整個架構,也許首先撤銷用戶對象上的所有授權將會很有幫助。然後,您無法在其他帳戶中鎖定這些對象的新會話。 – 2014-10-01 02:37:02

+0

@DaveCosta我明白了你的觀點,通常很難刪除或刪除正在使用的內容。但問題的一部分是Oracle對什麼是「主動」有模糊的定義,特別是對於臨時表。即使在沒有任何活動事務的情況下,會話也可以阻止事物,這真的很煩人。 – 2014-10-01 03:18:46

相關問題