2017-02-11 77 views
3

下面的查詢將刪除當前用戶A的架構(正常場景)中存在的所有表。刪除架構的所有對象

select 'drop '||object_type||' '|| object_name || ';' 
from user_objects 
where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX'); 

但是如果這個查詢是由SYS或SYSDBA登錄的DBA運行的呢?使用sys/sysdba用戶登錄時,user_objects視圖中存在哪些對象?它是否會刪除數據庫中所有模式的所有表或者查詢是否會引發錯誤?意圖是隻刪除Schema'A'的對象。

+0

準確地說:查詢不掉落任何東西。它返回的語句會丟棄一些東西。這些語句將刪除視圖,包和其他對象,但永遠不會刪除表。 – miracle173

回答

1

user_objects視圖具有當前用戶的對象,因此,如果以SYS身份運行,它會嘗試刪除SYS的對象 - 這是非常糟糕的消息,因爲它會破壞數據庫。您可以閱讀關於tthat視圖in the documentation的三個版本。

對於SYS查看其他用戶的對象,您應該查看dba_objects視圖,而不是根據您感興趣的用戶進行過濾;並且包括在drop語句的目標模式(老闆)太:在雙引號

select 'drop ' || object_type || ' "' || owner || '"."' object_name || '";' 
from dba_objects 
where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX') 
and owner = 'A'; 

我也包括包裝對象名稱(少用地的所有者),萬一有創建的任何對象帶有帶引號的標識符。


如果包含在查詢表想跑你可以從嘗試錯誤的順序下降依賴obects,即它的孩子之前刪除一個父表中得到錯誤的輸出。也有對象類型,但如果您最終想放棄所有內容,那麼放棄並重新創建用戶可能會更簡單 - 也可以捕獲並重新創建其權限。

1

否作爲SYS執行它會破壞您的數據庫。 嘗試this。它會提示3次模式名稱被清除。

當心這個腳本可能會陷入一個死循環,如果你在你的架構有好奇的對象類型(如調度器CHAIN - 例如)

set serveroutput on size unlimited 
declare 
    v_ItemCount integer; 
begin 
    SELECT count(*) 
    INTO v_ItemCount 
    FROM ALL_OBJECTS AO 
    WHERE AO.OWNER = '&USER' 
    AND AO.OBJECT_TYPE NOT IN ('INDEX', 'LOB') 
    AND AO.OBJECT_NAME NOT LIKE 'BIN$%'; 
    while (v_ItemCount > 0) loop 
    for v_Cmd in (SELECT 'drop ' || AO.OBJECT_TYPE || ' ' || '"'||AO.OWNER||'"'|| '.' || '"'||AO.OBJECT_NAME||'"' || 
         DECODE(AO.OBJECT_TYPE, 
           'TABLE', 
           ' CASCADE CONSTRAINTS', 
           '') as DROPCMD, 
           AO.OWNER, 
           AO.OBJECT_TYPE, 
           AO.OBJECT_NAME 
        FROM ALL_OBJECTS AO 
        WHERE AO.OWNER = '&USER' 
        AND AO.OBJECT_TYPE NOT IN ('INDEX', 'LOB') 
        AND AO.OBJECT_NAME NOT LIKE 'BIN$%') 
    loop 
     begin 
     if v_Cmd.OBJECT_TYPE = 'SCHEDULE' then 
      DBMS_SCHEDULER.DROP_SCHEDULE('"'||v_Cmd.OWNER||'"'||'.'||'"'||v_Cmd.OBJECT_NAME||'"', true); 
     ELSIF v_Cmd.OBJECT_TYPE = 'JOB' then 
      DBMS_SCHEDULER.DROP_JOB('"'||v_Cmd.OWNER||'"'||'.'||'"'||v_Cmd.OBJECT_NAME||'"', true); 
     ELSIF v_Cmd.OBJECT_TYPE = 'PROGRAM' then 
      DBMS_SCHEDULER.DROP_PROGRAM('"'||v_Cmd.OWNER||'"'||'.'||'"'||v_Cmd.OBJECT_NAME||'"', true);        
     else 
      execute immediate v_Cmd.dropcmd; 
     end if; 
     dbms_output.put_line(v_Cmd.dropcmd);   
     exception 
     when others then 
      null; -- ignore errors 
     end; 
    end loop; 
    SELECT count(*) 
     INTO v_ItemCount 
     FROM ALL_OBJECTS AO 
    WHERE AO.OWNER = '&USER'  
     AND AO.OBJECT_TYPE NOT IN ('INDEX','LOB') 
     AND AO.OBJECT_NAME NOT LIKE 'BIN$%'; 
    end loop; 
    execute immediate 'purge dba_recyclebin'; 
end;