كيفية إسقاط جميع جداول المستخدمين؟
-
18-09-2019 - |
سؤال
كيف يمكنني إسقاط جميع جداول المستخدمين في أوراكل؟
لدي مشكلة مع القيود. عندما تعطيل كل ما لا يزال غير ممكن.
المحلول
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;
END;
/
نصائح أخرى
إذا كنت تريد فقط طريقة بسيطة حقا للقيام بذلك .. هيريس نصي استخدمته في الماضي
select 'drop table '||table_name||' cascade constraints;' from user_tables;
سيؤدي ذلك إلى طباعة سلسلة من أوامر إسقاط لجميع الجداول في المخطط. التخزين المؤقت نتيجة هذا الاستعلام وتنفيذه.
مصدر: https://forums.oracle.com/forums/thread.jspa؟threadid=614090.
وبالمثل إذا كنت ترغب في مسح أكثر من الجداول، يمكنك تعديل ما يلي لتناسب احتياجاتك
select 'drop '||object_type||' '|| object_name || ';' from user_objects where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX')
إجابة أخرى تعمل بالنسبة لي هي (الائتمان ل http://snipt.net/fotinakis/drop-all-tables-and-constraints-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;
لاحظ أن هذا يعمل فورا بعد تشغيله. نعم هو كذلك ليس إنتاج برنامج نصي تحتاج إلى لصق مكان ما (مثل الإجابات الأخرى هنا). يعمل مباشرة على DB.
begin
for i in (select 'drop table '||table_name||' cascade constraints' tbl from user_tables)
loop
execute immediate i.tbl;
end loop;
end;
أبسط طريقة هي إسقاط المستخدم الذي يمتلك الكائنات مع أمر Cascade.
DROP USER username CASCADE
ستكون أسهل طريقة لإسقاط مساحة الفريق، ثم قم ببناء علامة التبعية احتياطيا. لكنني أفضل أن أفعل ذلك. هذا يشبه هنري باستثناء أنني فقط أقوم بالنسخة / لصق النتائج في واجهة المستخدم الرسومية.
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')
SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;'
FROM user_tables;
user_tables
هو جدول النظام الذي يحتوي على جميع جداول المستخدم، سيقوم جملة المختطف بإنشاء عبارة إسقاط لكل جدول يمكنك تشغيل البرنامج النصي
لإزالة جميع الكائنات في Oracle:
1) ديناميكية
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||' '||X.OBJECT_NAME|| ' CASCADE CONSTRAINT');
END LOOP;
FOR Y IN IY LOOP
EXECUTE IMMEDIATE('DROP '||Y.OBJECT_TYPE||' '||Y.OBJECT_NAME);
END LOOP;
FOR Z IN IZ LOOP
EXECUTE IMMEDIATE('DROP '||Z.OBJECT_TYPE||' '||Z.OBJECT_NAME||' FORCE ');
END LOOP;
END;
/
2) ثابت
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');