Làm thế nào để bỏ tất cả các bảng người dùng?


Câu trả lời:


294
BEGIN
   FOR cur_rec IN (SELECT object_name, object_type
                   FROM user_objects
                   WHERE object_type IN
                             ('TABLE',
                              'VIEW',
                              'MATERIALIZED VIEW',
                              'PACKAGE',
                              'PROCEDURE',
                              'FUNCTION',
                              'SEQUENCE',
                              'SYNONYM',
                              'PACKAGE BODY'
                             ))
   LOOP
      BEGIN
         IF cur_rec.object_type = 'TABLE'
         THEN
            EXECUTE IMMEDIATE 'DROP '
                              || cur_rec.object_type
                              || ' "'
                              || cur_rec.object_name
                              || '" CASCADE CONSTRAINTS';
         ELSE
            EXECUTE IMMEDIATE 'DROP '
                              || cur_rec.object_type
                              || ' "'
                              || cur_rec.object_name
                              || '"';
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            DBMS_OUTPUT.put_line ('FAILED: DROP '
                                  || cur_rec.object_type
                                  || ' "'
                                  || cur_rec.object_name
                                  || '"'
                                 );
      END;
   END LOOP;
   FOR cur_rec IN (SELECT * 
                   FROM all_synonyms 
                   WHERE table_owner IN (SELECT USER FROM dual))
   LOOP
      BEGIN
         EXECUTE IMMEDIATE 'DROP PUBLIC SYNONYM ' || cur_rec.synonym_name;
      END;
   END LOOP;
END;
/

1
nó phụ thuộc vào những gì bạn định làm. bạn cũng có thể sử dụng tầng người dùng thả nhưng bạn cần tạo lại người dùng.
Henry Gao

1
Điều này hoạt động rất tốt và nó không yêu cầu tôi có quyền trên máy chủ Oracle để xóa và thêm lại người dùng của mình. Bravo. Câu trả lời chính xác.
djangofan

Tôi nhận java.lang.IllegalArgumentException: Không có SQL nào được chọn để thực thi .. Ý tưởng của tôi là cur_rec không được khai báo. Làm thế nào để khai báo nó vì đây là một số bao gồm bject_name, object_type?
đập lijep

3
Tôi nghĩ kịch bản có thể nguy hiểm. Nếu bạn được kết nối dưới dạng SYSDBA thì nó sẽ xóa TẤT CẢ các bảng của TẤT CẢ người dùng và TẤT CẢ các bảng hệ thống. Trong thực tế, bạn xóa toàn bộ DB. Hãy cẩn thận!
Zardo

Điều này hữu ích cho người dùng có quyền đối với một lược đồ nhất định nhưng không có quyền dba trong môi trường phát triển.
Henry Gao

201

Nếu bạn chỉ muốn một cách thực sự đơn giản để làm điều này .. Đây là một kịch bản tôi đã sử dụng trong quá khứ

select 'drop table '||table_name||' cascade constraints;' from user_tables;

Điều này sẽ in ra một loạt các lệnh thả cho tất cả các bảng trong lược đồ. Spool kết quả của truy vấn này và thực hiện nó.

Nguồn: https://forums.oracle.com/forums/thread.jspa?threadID=614090

Tương tự như vậy nếu bạn muốn xóa nhiều hơn các bảng, bạn có thể chỉnh sửa các mục sau cho phù hợp với nhu cầu của mình

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

46

Một câu trả lời khác phù hợp với tôi là (ghi có vào http://snipt.net/Fotinakis/drop-all-tables-and-constraint-within-an-oracle-schema/ )

BEGIN

FOR c IN (SELECT table_name FROM user_tables) LOOP
EXECUTE IMMEDIATE ('DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS');
END LOOP;

FOR s IN (SELECT sequence_name FROM user_sequences) LOOP
EXECUTE IMMEDIATE ('DROP SEQUENCE ' || s.sequence_name);
END LOOP;

END;

Lưu ý rằng điều này hoạt động ngay lập tức sau khi bạn chạy nó. Nó KHÔNG tạo ra một tập lệnh mà bạn cần dán ở đâu đó (như các câu trả lời khác ở đây). Nó chạy trực tiếp trên DB.


1
Điều này làm việc cho tôi nhưng tôi đã phải trích dẫn tên bảng bằng cách viết 'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS'. Điều này là cần thiết, nếu tên bảng là chữ thường.
ceving

@ceving rất vui khi biết điều này! Tôi chỉ sử dụng bảng chữ hoa nên tôi chưa bao giờ gặp phải điều này.
kazanaki

+1 @ceving cũng cần trong trường hợp tên bảng của bạn là một từ dành riêng. Ngoài ra, tôi sẽ thêm PURGEvào cuối DROPtuyên bố.
Грозный

Đã sửa các trích dẫn như ceving đề xuất.
kazanaki

ORA-24005: Các tiện ích không phù hợp được sử dụng để thực hiện DDL trên bảng AQ
Skylar Saveland

21
begin
  for i in (select 'drop table '||table_name||' cascade constraints' tbl from user_tables) 
  loop
     execute immediate i.tbl;
  end loop;
end;

12

Cách đơn giản nhất là thả người dùng sở hữu các đối tượng bằng lệnh ghép tầng.

DROP USER username CASCADE

5
Đây không phải là phương pháp đúng. Đây là phương pháp xóa người dùng khi người dùng đã tạo đối tượng, yêu cầu sử dụng CASCADE để xóa bảng người dùng ngay trước khi người dùng bị xóa. Xóa người dùng không phải là câu hỏi mà anh ta hỏi.
djangofan

3
Nó thực hiện mục tiêu rất hiệu quả đặc biệt nếu lược đồ lớn. Có vẻ như trong trường hợp của bạn, việc tránh mọi giao tiếp với DBA của bạn là ưu tiên cao. Tôi thích các giải pháp thúc đẩy mối quan hệ với DBA của bạn - đặc biệt nếu bạn không có đặc quyền DBA.
Brian

2
@Brian bạn giả sử sai. Đôi khi không có một DBA nào cả, hoặc anh ta ở một công ty khác. Hoặc trường hợp thông thường nhất - anh ấy sẽ không cấp cho bạn quyền truy cập để làm những gì bạn cần.
kazanaki

Là người mới đối với Oracle và tôi quen thuộc hơn với MySQL; thiết lập lại một DB có vẻ khó khăn. Ở MySQL a USERlà riêng biệt với a DATABASE. DROP USER username CASCADEđã làm cho tôi. Nhưng trong MySQL, tất cả những gì tôi phải làm là DROP DATABASEtạo ra một cái mới
gawpertron

1
Điều này có hiệu quả để loại bỏ toàn bộ cơ sở dữ liệu bao gồm các bảng nếu bạn có 1) tập lệnh 'TẠO NGƯỜI DÙNG' với tất cả các quyền chính xác để tạo lại cơ sở dữ liệu; và 2) cho phép chạy tập lệnh đó. Nếu tất cả những gì bạn cần làm là bỏ bảng thì các cách tiếp cận được đề cập khác (@kazanaki) là phù hợp hơn.
Rana Ian

7

Cách dễ nhất là bỏ không gian bảng sau đó xây dựng không gian bảng sao lưu. Nhưng tôi không muốn phải làm điều đó. Điều này tương tự với Henry ngoại trừ việc tôi chỉ sao chép / dán vào tập kết quả trong gui của mình.

SELECT
  'DROP'
  ,object_type
  ,object_name
  ,CASE(object_type)
     WHEN 'TABLE' THEN 'CASCADE CONSTRAINTS;'
     ELSE ';'
   END
 FROM user_objects
 WHERE
   object_type IN ('TABLE','VIEW','PACKAGE','PROCEDURE','FUNCTION','SEQUENCE')

6
SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' 
FROM user_tables;

user_tables là một bảng hệ thống chứa tất cả các bảng của người dùng, mệnh đề SELECT sẽ tạo ra một câu lệnh DROP cho mỗi bảng bạn có thể chạy tập lệnh


đừng quên các trích dẫn, nếu không bạn không thể xóa các bảng có chữ thường
masterxilo

2

Để loại bỏ tất cả các đối tượng trong orory:

1) Năng động

DECLARE
CURSOR IX IS
SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE ='TABLE' 
AND OWNER='SCHEMA_NAME';
 CURSOR IY IS
 SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE 
IN ('SEQUENCE',
'PROCEDURE',
'PACKAGE',
'FUNCTION',
'VIEW') AND  OWNER='SCHEMA_NAME';
 CURSOR IZ IS
 SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('TYPE') AND  OWNER='SCHEMA_NAME';
BEGIN
 FOR X IN IX LOOP
   EXECUTE IMMEDIATE('DROP '||X.OBJECT_TYPE||' SCHEMA_NAME.'||X.OBJECT_NAME|| ' CASCADE CONSTRAINT');
 END LOOP;
 FOR Y IN IY LOOP
   EXECUTE IMMEDIATE('DROP '||Y.OBJECT_TYPE||' SCHEMA_NAME.'||Y.OBJECT_NAME);
 END LOOP;
 FOR Z IN IZ LOOP
   EXECUTE IMMEDIATE('DROP '||Z.OBJECT_TYPE||' SCHEMA_NAME.'||Z.OBJECT_NAME||' FORCE ');
 END LOOP;
END;
/

2) Tĩnh

    SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' FROM user_tables
        union ALL
        select 'drop '||object_type||' '|| object_name || ';' from user_objects 
        where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION')
        union ALL
        SELECT 'drop '
        ||object_type
        ||' '
        || object_name
        || ' force;'
        FROM user_objects
        WHERE object_type IN ('TYPE');

1

Hãy làm theo các bước dưới đây.

begin
  for i in (select 'drop table '||table_name||' cascade constraints' tb from user_tables) 
  loop
     execute immediate i.tb;
  end loop;
  commit;
end;
purge RECYCLEBIN;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.