2011-02-01 13 views
18

ओरेकल में, जैसेएसक्यूएल सर्वर: ड्रॉप टेबल कैस्केड बराबर?

DROP TABLE myTable CASCADE CONSTRAINTS PURGE; 

सभी तालिकाओं और बाधाओं आप कुछ टाइप करेंगे ड्रॉप करने और यह पूरी तरह से मेज और उनकी निर्भरता को नष्ट करेगा। एसक्यूएल सर्वर समतुल्य क्या है ??

+0

ने उत्तर दिया: http://stackoverflow.com/questions/2247268/t-sql-drop-table-cascade-constraints-equivalent – rizzle

उत्तर

22

मुझे विश्वास नहीं है कि एसक्यूएल का एक समान सुरुचिपूर्ण समाधान है। तालिका छोड़ने से पहले आपको किसी भी संबंधित बाधाओं को छोड़ना होगा।

सौभाग्य से, यह सब जानकारी स्कीमा में संग्रहीत है और आप अपनी सनकी सूची प्राप्त करने के लिए उस तक पहुंच सकते हैं। http://weblogs.asp.net/jgalloway/archive/2006/04/12/442616.aspx

-- t-sql scriptlet to drop all constraints on a table 
DECLARE @database nvarchar(50) 
DECLARE @table nvarchar(50) 

set @database = 'DatabaseName' 
set @table = 'TableName' 

DECLARE @sql nvarchar(255) 
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table) 
BEGIN 
    select @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + CONSTRAINT_NAME 
    from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where constraint_catalog = @database and 
      table_name = @table 
    exec sp_executesql @sql 
END 
29

एसक्यूएल सर्वर प्रबंधन स्टूडियो में, विकल्प/एसक्यूएल सर्वर ऑब्जेक्ट एक्सप्लोरर/पटकथा पर जाएँ, और 'निर्भर के लिए स्क्रिप्ट उत्पन्न सक्षम:

इस ब्लॉग पोस्ट आपको क्या चाहिए आप प्राप्त करने में सक्षम होना चाहिए वस्तुओं '। फिर तालिका, स्क्रिप्ट> ड्रॉप>> नई क्वेरी विंडो पर राइट क्लिक करें और यह आपके लिए इसे उत्पन्न करेगा।

+0

डीबी में सभी ऑब्जेक्ट्स को छोड़ने के लिए भी काम करता है। एसएसएमएस की भयानक शक्ति का एक और उदाहरण। मुझे sys.objects से खुद को पटकथा बचाया !! –

+1

ओपी के लिए इतना अच्छा समाधान नहीं है, अब मैं समझता हूं कि यह डिफ़ॉल्ट रूप से क्यों अक्षम है।किसी भी तरह से सभी टेबल 'ContactInfo' तालिका पर "निर्भर" हैं ... ugh ... –

5

यह एक भयानक समाधान हो सकता है, लेकिन मुझे लगता है कि यह तेज़ है। यह विनी के उत्तर के समान है, लेकिन SQL कथन का उत्पाद SQL कथन की एक और श्रृंखला है जो सभी बाधाओं और तालिकाओं को हटा देगा।

(
select 
    'ALTER TABLE ' + tc.table_name + ' DROP CONSTRAINT ' + tc.constraint_name + ';' 
from 
    INFORMATION_SCHEMA.TABLES t 
    ,INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
where 
    t.table_name = tc.table_name 
    and tc.constraint_name not like '%_pk' 
    and tc.constraint_name not like 'pk_%' 
    and t.table_catalog='<schema>' 
) UNION (
select 
    'DROP TABLE ' + t.table_name + ';' 
from 
    INFORMATION_SCHEMA.TABLES t 
where 
    t.table_catalog='<schema>' 
) 
1

आखिरकार हम अपनी मेज हटा रहे हैं। तो हम बस आदेश के बाद 2 चला सकते हैं:

ALTER तालिका ... ड्रॉप बाधा ...

ड्रॉप तालिका ...

1> परिवर्तन तालिका PRJ_DETAILS ड्रॉप बाधा FK_PRJ_TYPE;

- टेबल नाम और बाधा नाम पैरामीटर

2> ड्रॉप टेबल रहे हैं।

इसके साथ जुड़े नाम के साथ पहली ड्रॉप बाधा दूसरा आप तालिका छोड़ सकते हैं।

यह मेरे लिए और इसके आसान भी काम करता है।

1

यह

तब मैं कोड इसलिए की तरह प्रदान की बदल चाहिए कुछ तालिका अपनी मेज का संदर्भ जब तक सब मज़ा और खेल है ...:

CREATE PROCEDURE _cascadeConstraints @database nvarchar(30) = NULL, @table nvarchar(60) = NULL 
as 
DECLARE @sql nvarchar(255) 
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table) 
BEGIN 
    select @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + CONSTRAINT_NAME 
    from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where constraint_catalog = @database and 
      table_name = @table 
    select @sql = 'ALTER TABLE ' + tc.TABLE_NAME + ' DROP CONSTRAINT ' + tc.CONSTRAINT_NAME 
     from INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc join 
        INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc on 
        (rc.CONSTRAINT_CATALOG = tc.CONSTRAINT_CATALOG and 
        rc.CONSTRAINT_NAME = tc.CONSTRAINT_NAME) join 
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc_pk on 
        (tc_pk.CONSTRAINT_CATALOG = rc.CONSTRAINT_CATALOG and 
        tc_pk.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME) 
    where tc.constraint_catalog = @database 
     and tc_pk.TABLE_NAME = @table 
    exec sp_executesql @sql 
END 
go 
0

मैं सिर्फ विदेशी कुंजी हटाने की जरूरत है

DECLARE @database nvarchar(50) 
DECLARE @TABLE_NAME nvarchar(250) 
DECLARE @CONSTRAINT_NAME nvarchar(250) 
DECLARE @sql nvarchar(350) 
set @database = 'XXX' 


DECLARE db_cursor CURSOR FOR 
select TABLE_NAME, CONSTRAINT_NAME from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and CONSTRAINT_TYPE='FOREIGN KEY' 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @TABLE_NAME, @CONSTRAINT_NAME 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    select @sql = 'ALTER TABLE ' + @TABLE_NAME + ' DROP CONSTRAINT ' + @CONSTRAINT_NAME 
    from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where constraint_catalog = @database and 
      table_name = @TABLE_NAME 
    exec sp_executesql @sql 

     FETCH NEXT FROM db_cursor INTO @TABLE_NAME, @CONSTRAINT_NAME 
END 

CLOSE db_cursor 
DEALLOCATE db_cursor