/*Процедура предназначена для быстрого удаления всех таблиц и других объектов из TABLESPACE
'USERS' всех пользователей .
Это бывает нужно для полной дефрагментации базы, переориентации её использования и т.д.
Из практики: возможно прийдётся запустить процедуру несколько раз */
DECLARE
CURSOR user_tbl IS SELECT table_name FROM dba_tables WHERE tablespace_name='USERS';
row_user_tbl user_tbl%rowtype;
CURSOR user_obj IS SELECT object_type, object_name FROM DBA_OBJECTS
WHERE owner IN ('ASSETS','UBTC','SALARY','TOAD')
AND object_type IN ('FUNCTION','PROCEDURE','SEQUENCE','VIEW','PACKAGE','PACKAGE BODY');
v_cursor number;
-- Уничтожаем все пользовательские таблицы
BEGIN
v_cursor:=DBMS_SQL.open_cursor;
FOR row_user_tbl IN user_tbl LOOP
begin
DBMS_SQL.parse(v_cursor,'DROP TABLE '||row_user_tbl.table_name||'
CASCADE CONSTRAINTS',dbms_sql.v7);
COMMIT;
EXCEPTION WHEN others
THEN DBMS_OUTPUT.PUT_LINE( 'Не удалилась таблица '||row_user_tbl.table_name);
end;
END LOOP;
-- Уничтожаем все остальные пользовательские объекты
FOR row_user_obj IN user_obj LOOP
begin
DBMS_SQL.parse(v_cursor,'DROP '||row_user_obj.object_type||' '||row_user_obj.object_name, dbms_sql.v7);
DBMS_OUTPUT.PUT_LINE( 'Удален - '||row_user_obj.object_type||' '||row_user_obj.object_name);
EXCEPTION WHEN others
THEN DBMS_OUTPUT.PUT_LINE( 'Не удалился - '||row_user_obj.object_type||' '||row_user_obj.object_name);
end;
END LOOP;
DBMS_SQL.CLOSE_CURSOR(v_cursor);
END;
spool del_users.lst
set serveroutput on
DECLARE
/* Процедура предназначена для удаления всех пользователей со всеми их объектами.
Нужно запустить от SYS.
*/
CURSOR user_cur IS SELECT * FROM all_users WHERE username <>'SYS' and username <>'SYSTEM';
row_user user_cur%rowtype;
v_cursor number;
BEGIN
v_cursor:=DBMS_SQL.open_cursor;
FOR row_user IN user_cur LOOP
begin
DBMS_SQL.parse(v_cursor,'DROP USER '||row_user.username ||' CASCADE',dbms_sql.v7);
COMMIT;
EXCEPTION WHEN others
THEN DBMS_OUTPUT.PUT_LINE( 'ups..'||row_user.username);
END;
END LOOP;
DBMS_SQL.CLOSE_CURSOR(v_cursor);
end;
/
.
exit;