Tüm tabloları, saklı yordamları, tetikleyicileri, kısıtlamaları ve tüm bağımlılıkları tek bir sql deyiminde bırakın


287

SQl Server 2005'te tüm tabloları bırakarak ve saklı yordamları, tetikleyicileri, kısıtlamaları ve tüm bağımlılıkları tek bir SQL deyiminde silerek temizleyebileceğim bir yol var mı?

İSTEK NEDENİ:

Özellikle DB yöneticinize bir istek koymak ve bunu yapmak için bir süre beklemek zorundayken, yenilerini oluşturmak yerine kullanımda olmayan mevcut bir DB temizlemek için bir DB komut dosyası istiyorum!

Yanıtlar:


604

Bu komut dosyası tüm görünümleri, SPS'yi, işlev PK'larını, FK'leri ve tabloları temizler.

/* Drop all non-system stored procs */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 ORDER BY [name])

WHILE @name is not null
BEGIN
    SELECT @SQL = 'DROP PROCEDURE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Procedure: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all views */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP VIEW [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped View: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all functions */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP FUNCTION [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Function: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all Foreign Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)

WHILE @name is not null
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint IS NOT NULL
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']'
        EXEC (@SQL)
        PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all Primary Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)

WHILE @name IS NOT NULL
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint is not null
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']'
        EXEC (@SQL)
        PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all tables */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Table: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

14
Dbo şemasında olmayan bazı tablolarım varsa ne olur?
StuffHappens

8
Bu komut dosyası kesin olarak diğer şemaları (dbo dışında) dikkate almaz. Test ettim ve sonsuza dek sürecek. Bu senaryo için ayarlanabileceğini hayal ediyorum.
W3Max

1
Bu komut dosyası oldukça iyi çalışıyor. Birkaç şey eksik, montajları ve Kullanıcı Tanımlı Türleri hesaba katmanız gerekir. Bu nedenle, Bırakma Prosedürünüzde bir örnek olarak [type] = 'P' VEYA [type] = 'PC' de montajı bıraktığınızda derlemelerini doğru sırayla silmek için assembly_ID desc ile bir sipariş yapın.
Brian

1
Tüm birincil anahtarları ayrı ayrı bırakmak gereksiz görünüyor; tabloları bırakarak
bununla

1
@erikkallen Birincil Anahtarların ilk önce düşürülmesinin nedeni, tabloların Yabancı Anahtar bağımlılıkları için endişe duymadan herhangi bir sırada bırakılabilmesidir. Bu olmadan, tüm zayıf varlık türlerinin güçlü varlık türlerinden önce düşmesini sağlamak için karmaşık bir bırakma sırasının kullanılması gerekir, aksi takdirde komut dosyası başvuru bütünlüğü kısıtlama ihlallerinde başarısız olur.
Jeff Puckett

118

Ben dbo dışında diğer şemalarda nesneleri desteklemek için güncellenen Adam Anderson tarafından bu komut dosyası kullanıyorum.

declare @n char(1)
set @n = char(10)

declare @stmt nvarchar(max)

-- procedures
select @stmt = isnull( @stmt + @n, '' ) +
    'drop procedure [' + schema_name(schema_id) + '].[' + name + ']'
from sys.procedures


-- check constraints
select @stmt = isnull( @stmt + @n, '' ) +
'alter table [' + schema_name(schema_id) + '].[' + object_name( parent_object_id ) + ']    drop constraint [' + name + ']'
from sys.check_constraints

-- functions
select @stmt = isnull( @stmt + @n, '' ) +
    'drop function [' + schema_name(schema_id) + '].[' + name + ']'
from sys.objects
where type in ( 'FN', 'IF', 'TF' )

-- views
select @stmt = isnull( @stmt + @n, '' ) +
    'drop view [' + schema_name(schema_id) + '].[' + name + ']'
from sys.views

-- foreign keys
select @stmt = isnull( @stmt + @n, '' ) +
    'alter table [' + schema_name(schema_id) + '].[' + object_name( parent_object_id ) + '] drop constraint [' + name + ']'
from sys.foreign_keys

-- tables
select @stmt = isnull( @stmt + @n, '' ) +
    'drop table [' + schema_name(schema_id) + '].[' + name + ']'
from sys.tables

-- user defined types
select @stmt = isnull( @stmt + @n, '' ) +
    'drop type [' + schema_name(schema_id) + '].[' + name + ']'
from sys.types
where is_user_defined = 1


exec sp_executesql @stmt

Kaynak: bir Adam Anderson blog yazısı


3
neredeyse mükemmel, ancak bir çılgın / aptal kenar durumu var: bir işlevi kullanarak hesaplanmış bir sütuna sahip bir tablo. Ama sadece düşme fonksiyonlarını hareket ettirin ve gitmeye hazırsınız!
Akos Lukacs

1
harika çalışıyorsa, bunu bir Azure PAAS SQL Veritabanı'nda çalıştırırsanız, ancak masmaranın düşmesini önlediği için sys.database_firewall_rules görünümünü bırakmaya çalışır.
Simon

Azure SQL sorununu gidermek için bunu "sys.views" den sonra ekledim: WHERE schema_name (schema_id)! = 'Sys'
UnionP

Bunu kaçırdınız: -- system-versioned tables SELECT @stmt = isnull(@stmt + CHAR(10), '') + 'alter table [' + schema_name(schema_id) + '].[' + name + '] SET ( SYSTEM_VERSIONING = OFF)' FROM sys.tables WHERE TEMPORAL_TYPE = 2;
Christopher Shortt

93

Bunu yapmak için en iyi şey " Drop için komut dosyaları oluşturmak "

Seç Veritabanı -> Sağ Tıkla -> Görevler -> kodları oluştur - açılacaktır sihirbaz komut dosyalarını oluşturmak için

Komut Dosyası ayarında nesneleri seçtikten sonra Gelişmiş Düğmesini tıklatın

  • -> 'Oluşturulacak komut dosyası' seçeneğini true olarak ayarlayın (oluşturmak istiyorum)

  • -> ' Script to Drop ' seçeneğini true olarak ayarlayın (bırakmak istiyorum)

  • -> Komut dosyası oluşturmak isteyen nesneleri seçmek için Onay kutusunu seçin

  • -> Komut dosyası yazma seçeneğini seçin (Dosya, Yeni pencere, Pano)

  • Varsayılan olarak bağımlı nesneleri içerir. (Ve ilk başta kısıtlamayı düşürür)

    Komut dosyasını yürüt

Bu şekilde senaryomuzu özelleştirebiliriz.


Bu özellik hangi sürümde mevcut? 2012 yılında görmüyorum.
Veverke

1
SQL Studio 2012'de var.
Bernhard Döbler

evet, 2012 yılında biraz farklı zaman biz orada bırakmak için Script seçtiğinizde Script bırakacak ve Script aynı açılan oluşturmak için.
Sk Asraf

2
Buna sekanslar dahil mi?
Markus Pscheidt

Bu en iyi seçenektir, Teşekkürler @JP
Abdul Azeez

49

Tüm tabloları bırakmak için:

exec sp_MSforeachtable 'DROP TABLE ?'

Bu, elbette, tüm kısıtlamaları, tetikleyicileri vb., Saklı prosedürler hariç her şeyi düşürecektir.

Saklı yordamlar için korkarım saklı başka bir yordam gerekir master.


Sp_MSforeachtable burada çalışacak mı bilmiyorum. Hala FK'si olan bir tablo bırakmaya çalışabilir ve bu başarısız olur.
Tom H

7
Harika çalışıyor evet. Yabancı anahtarlar varsa, sadece birkaç kez yürütmeniz gerekir.
Mathias Lykkegaard Lorenzen

Bir FOREIGN KEY kısıtlaması tarafından başvuruda bulunduğundan 'dbo.sometable' nesnesi bırakılamadı.
Şeytanın Avukatı

kontrol bu silme için makaleye stored proceduresvb
shaijut

sadece referans için, bu Azure PAAS SQL veritabanları için çalışmaz.
Simon

14

Bunu iki ifadeyle yapardım: DROP DATABASE ???

ve sonra CREATE DATABASE ???


6
Bu haklara sahip değilseniz ve senaryoyu çalıştırma haklarına sahip birine veremiyorsanız, bunu yapmayı düşünmemelisiniz. Geliştiricilerin bu hakları alamamasının bir nedeni var.
HLGEM

@HLGEM Bazı dba'lar hakları nasıl kuracaklarını bilmiyorlar. Web sitesi barındırıcım kendi veritabanımı bırakmama izin vermiyor. Veritabanlarını düşürmek için büyük bir hayır ve güvenlik riski olan diğer kullanıcıların veritabanlarını bırakmanıza izin verebilecek özel yükseltilmiş haklara ihtiyacınız olduğunu düşünüyorum.
Tony_Henrich

1
AWS RDS durumunda, db'yi yeniden oluşturmak en az 15-20 dakika sürer ve
db'yi

9

Bazı senaryoları burada denedim, ama şemalarda tablolarım olduğu için benim için çalışmadılar. Bu yüzden aşağıdakileri bir araya getirdim. Bu komut dosyasının bir şema listesi aldığını ve ardından sırayla bırakıldığını unutmayın. Şemalarınızda eksiksiz bir sipariş verdiğinizden emin olmanız gerekir. Dairesel bağımlılıklar varsa, başarısız olur.

PRINT 'Dropping whole database'
GO

------------------------------------------
-- Drop constraints
------------------------------------------
DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR

SET @Cursor = CURSOR FAST_FORWARD FOR
SELECT DISTINCT sql = 'ALTER TABLE ['+tc2.CONSTRAINT_SCHEMA+'].[' + tc2.TABLE_NAME + '] DROP [' + rc1.CONSTRAINT_NAME + ']'
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME =rc1.CONSTRAINT_NAME

OPEN @Cursor FETCH NEXT FROM @Cursor INTO @Sql

WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @Sql
Exec (@Sql)
FETCH NEXT FROM @Cursor INTO @Sql
END

CLOSE @Cursor DEALLOCATE @Cursor
GO


------------------------------------------
-- Drop views
------------------------------------------

DECLARE @sql VARCHAR(MAX) = ''
        , @crlf VARCHAR(2) = CHAR(13) + CHAR(10) ;

SELECT @sql = @sql + 'DROP VIEW ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(v.name) +';' + @crlf
FROM   sys.views v

PRINT @sql;
EXEC(@sql);
GO
------------------------------------------
-- Drop procs
------------------------------------------
PRINT 'Dropping all procs ...'
GO

DECLARE @sql VARCHAR(MAX) = ''
        , @crlf VARCHAR(2) = CHAR(13) + CHAR(10) ;

SELECT @sql = @sql + 'DROP PROC ' + QUOTENAME(SCHEMA_NAME(p.schema_id)) + '.' + QUOTENAME(p.name) +';' + @crlf
FROM   [sys].[procedures] p

PRINT @sql;
EXEC(@sql);
GO

------------------------------------------
-- Drop tables
------------------------------------------
PRINT 'Dropping all tables ...'
GO
EXEC sp_MSForEachTable 'DROP TABLE ?'
GO

------------------------------------------
-- Drop sequences
------------------------------------------

PRINT 'Dropping all sequences ...'
GO
DECLARE @DropSeqSql varchar(1024)
DECLARE DropSeqCursor CURSOR FOR
SELECT DISTINCT 'DROP SEQUENCE ' + s.SEQUENCE_SCHEMA + '.' + s.SEQUENCE_NAME
    FROM INFORMATION_SCHEMA.SEQUENCES s

OPEN DropSeqCursor

FETCH NEXT FROM DropSeqCursor INTO @DropSeqSql

WHILE ( @@FETCH_STATUS <> -1 )
BEGIN
    PRINT @DropSeqSql
    EXECUTE( @DropSeqSql )
    FETCH NEXT FROM DropSeqCursor INTO @DropSeqSql
END

CLOSE DropSeqCursor
DEALLOCATE DropSeqCursor
GO

------------------------------------------
-- Drop Schemas
------------------------------------------


DECLARE @schemas as varchar(1000) = 'StaticData,Ird,DataImport,Collateral,Report,Cds,CommonTrade,MarketData,TypeCode'
DECLARE @schemasXml as xml = cast(('<schema>'+replace(@schemas,',' ,'</schema><schema>')+'</schema>') as xml)

DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR

SET @Cursor = CURSOR FAST_FORWARD FOR
SELECT sql = 'DROP SCHEMA ['+schemaName+']' FROM 
(SELECT CAST(T.schemaName.query('text()') as VARCHAR(200)) as schemaName FROM @schemasXml.nodes('/schema') T(schemaName)) as X
JOIN information_schema.schemata S on S.schema_name = X.schemaName

OPEN @Cursor FETCH NEXT FROM @Cursor INTO @Sql

WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @Sql
Exec (@Sql)
FETCH NEXT FROM @Cursor INTO @Sql
END

CLOSE @Cursor DEALLOCATE @Cursor
GO

@StuffHappens dbo şemasında olmayan tabloları bırakacaktır.
David Roussel

Cevabım işe yaradığında ve sadece dbo'dakiler değil, tüm tabloları, görünümleri ve depolanmış proc'ları düşürdüğümde neden reddedildiğimden emin değilim (benim için işe yaramayan ana cevabın aksine)
David Roussel

7

Tamamen boş bir veritabanını yedekleyin. Tüm nesneleri bırakmak yerine yedeklemeyi geri yükleyin.


3
veritabanınızı yedeklemek ve geri yüklemek için iyi bir örnek veritabanı model veritabanı olacaktır, çünkü CREATE DATABASE yeni veritabanları için şablon alır.
David Parvin

7

Ben denedim budur:

SELECT 'DROP TABLE [' + SCHEMA_NAME(schema_id) + '].[' + name + ']' FROM sys.tables

Çıktı ne olursa olsun, sadece hepsini kopyalayıp yeni sorguya yapıştırın ve yürüt tuşuna basın. Bu işlem tüm tabloları silecektir.


3

Yanlışlıkla bu gece ana veritabanım karşı bir db init betiği koştu. Neyse, çabucak bu konuya girdim. Ben kullandım: exec sp_MSforeachtable 'DROP TABLE?' cevap, ama hata (bağımlılıklar) kadar birkaç kez yürütmek zorunda kaldı. Bundan sonra diğer bazı iş parçacıkları üzerine tökezledi ve tüm saklı yordamlar ve işlevleri bırakmak için bu bir araya.

DECLARE mycur CURSOR FOR select O.type_desc,schema_id,O.name
from 
    sys.objects             O LEFT OUTER JOIN
    sys.extended_properties E ON O.object_id = E.major_id
WHERE
    O.name IS NOT NULL
    AND ISNULL(O.is_ms_shipped, 0) = 0
    AND ISNULL(E.name, '') <> 'microsoft_database_tools_support'
    AND ( O.type_desc = 'SQL_STORED_PROCEDURE' OR O.type_desc = 'SQL_SCALAR_FUNCTION' )
ORDER BY O.type_desc,O.name;

OPEN mycur;

DECLARE @schema_id int;
DECLARE @fname varchar(256);
DECLARE @sname varchar(256);
DECLARE @ftype varchar(256);

FETCH NEXT FROM mycur INTO @ftype, @schema_id, @fname;

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sname = SCHEMA_NAME( @schema_id );
    IF @ftype = 'SQL_STORED_PROCEDURE'
        EXEC( 'DROP PROCEDURE "' + @sname + '"."' + @fname + '"' );
    IF @ftype = 'SQL_SCALAR_FUNCTION'
        EXEC( 'DROP FUNCTION "' + @sname + '"."' + @fname + '"' );

    FETCH NEXT FROM mycur INTO @ftype, @schema_id, @fname;
END

CLOSE mycur
DEALLOCATE mycur

GO

2

Bunu dene

Select 'ALTER TABLE ' + Table_Name  +'  drop constraint ' + Constraint_Name  from Information_Schema.CONSTRAINT_TABLE_USAGE

Select 'drop Procedure ' + specific_name  from Information_Schema.Routines where specific_name not like 'sp%' AND specific_name not like 'fn_%'

Select 'drop View ' + table_name  from Information_Schema.tables where Table_Type = 'VIEW'

SELECT 'DROP TRIGGER ' + name FROM sysobjects WHERE type = 'tr'

Select 'drop table ' + table_name  from Information_Schema.tables where Table_Type = 'BASE TABLE'

2

@ Ivan'ın cevabına ek olarak, türlerin hepsinin dahil edilmesi gerekiyor

    /* Drop all Types */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sys.types where is_user_defined = 1 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP TYPE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Type: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sys.types where is_user_defined = 1 AND [name] > @name ORDER BY [name])
END
GO

1

Önce triggersve hepsini devre dışı bırakmalısınız constraints.

EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

EXEC sp_MSforeachtable @command1="ALTER TABLE ? DISABLE TRIGGER ALL"

Bundan sonra nesneleri silmek için komut dosyaları oluşturabilirsiniz.

SELECT 'Drop Table '+name FROM sys.tables WHERE type='U';

SELECT 'Drop Procedure '+name FROM  sys.procedures WHERE type='P';

Oluşturulan ifadeleri yürütün.


0

Benim için oldukça tehlikeli bir özellik gibi görünüyor. Böyle bir şey uygularsanız, bunu kaza başına çalıştıramayacağınız bir şekilde düzgün bir şekilde güvence altına alırım.

Daha önce de önerildiği gibi, saklı bir prosedürü kendiniz yapabilirsiniz. SQL Server 2005'te, bırakmak istediğiniz nesneleri belirlemek ve bulmak için bu sistem tablosuna bakabilirsiniz.

select * from sys.objects

0

Burada tüm sp, fonksiyonları ve tetikleyicileri silmek için yeni bir sorgu buldum

declare @procName varchar(500)
declare cur cursor 

for select [name] from sys.objects where type = 'p'
open cur
fetch next from cur into @procName
while @@fetch_status = 0
begin
    exec('drop procedure ' + @procName)
    fetch next from cur into @procName
end
close cur
deallocate cur

0

Ivan'ın cevabına eklemek için, kullanıcı tanımlı tüm türleri bırakma ihtiyacım vardı, bu yüzden betiğe ekledim:

/* Drop all user-defined types */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (select TOP 1 [name] from sys.types where is_user_defined = 1)

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP TYPE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Type: ' + @name
    SELECT @name = (select TOP 1 [name] from sys.types where is_user_defined = 1)
END
GO

0

Bu amaca ulaşmak için kullanılabilecek tek bir ifade yoktur.

Elbette stored procedurebu çeşitli idari görevleri yerine getirmek için kullanabileceğiniz bir şey yaratabilirsiniz.

Daha sonra bu tek deyimi kullanarak yordamı yürütebilirsiniz.

Exec sp_CleanDatabases @DatabaseName='DBname'

0
DECLARE @name VARCHAR(255)
DECLARE @type VARCHAR(10)
DECLARE @prefix VARCHAR(255)
DECLARE @sql VARCHAR(255)

DECLARE curs CURSOR FOR
SELECT [name], xtype
FROM sysobjects
WHERE xtype IN ('U', 'P', 'FN', 'IF', 'TF', 'V', 'TR') -- Configuration point 1
ORDER BY name

OPEN curs
FETCH NEXT FROM curs INTO @name, @type

WHILE @@FETCH_STATUS = 0
BEGIN
-- Configuration point 2
SET @prefix = CASE @type
WHEN 'U' THEN 'DROP TABLE'
WHEN 'P' THEN 'DROP PROCEDURE'
WHEN 'FN' THEN 'DROP FUNCTION'
WHEN 'IF' THEN 'DROP FUNCTION'
WHEN 'TF' THEN 'DROP FUNCTION'
WHEN 'V' THEN 'DROP VIEW'
WHEN 'TR' THEN 'DROP TRIGGER'
END

SET @sql = @prefix + ' ' + @name
PRINT @sql
EXEC(@sql)
FETCH NEXT FROM curs INTO @name, @type
END

CLOSE curs
DEALLOCATE curs

0

Oracle'daki tüm nesneleri kaldırmak için:

1) Dinamik

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) Statik

    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');

0

bunu sql2012 veya üstü ile deneyin,

bu, seçilen şema ile tüm nesneleri silmek için yardımcı olacaktır

DECLARE @MySchemaName VARCHAR(50)='dbo', @sql VARCHAR(MAX)='';
DECLARE @SchemaName VARCHAR(255), @ObjectName VARCHAR(255), @ObjectType VARCHAR(255), @ObjectDesc VARCHAR(255), @Category INT;

DECLARE cur CURSOR FOR
    SELECT  (s.name)SchemaName, (o.name)ObjectName, (o.type)ObjectType,(o.type_desc)ObjectDesc,(so.category)Category
    FROM    sys.objects o
    INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
    INNER JOIN sysobjects so ON so.name=o.name
    WHERE s.name = @MySchemaName
    AND so.category=0
    AND o.type IN ('P','PC','U','V','FN','IF','TF','FS','FT','PK','TT')

OPEN cur
FETCH NEXT FROM cur INTO @SchemaName,@ObjectName,@ObjectType,@ObjectDesc,@Category

SET @sql='';
WHILE @@FETCH_STATUS = 0 BEGIN    
    IF @ObjectType IN('FN', 'IF', 'TF', 'FS', 'FT') SET @sql=@sql+'Drop Function '+@MySchemaName+'.'+@ObjectName+CHAR(13)
    IF @ObjectType IN('V') SET @sql=@sql+'Drop View '+@MySchemaName+'.'+@ObjectName+CHAR(13)
    IF @ObjectType IN('P') SET @sql=@sql+'Drop Procedure '+@MySchemaName+'.'+@ObjectName+CHAR(13)
    IF @ObjectType IN('U') SET @sql=@sql+'Drop Table '+@MySchemaName+'.'+@ObjectName+CHAR(13)

    --PRINT @ObjectName + ' | ' + @ObjectType
    FETCH NEXT FROM cur INTO @SchemaName,@ObjectName,@ObjectType,@ObjectDesc,@Category
END
CLOSE cur;    
DEALLOCATE cur;
SET @sql=@sql+CASE WHEN LEN(@sql)>0 THEN 'Drop Schema '+@MySchemaName+CHAR(13) ELSE '' END
PRINT @sql
EXECUTE (@sql)

0

Başka bir alternatif:

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;

-1

bunu dene....

USE DATABASE
GO
DECLARE @tname VARCHAR(150)
DECLARE @strsql VARCHAR(300)

SELECT @tname = (SELECT TOP 1 [name] FROM sys.objects WHERE [type] = 'U' and [name] like N'TableName%' ORDER BY [name])

WHILE @tname IS NOT NULL
BEGIN
    SELECT @strsql = 'DROP TABLE [dbo].[' + RTRIM(@tname) +']'
    EXEC (@strsql)
    PRINT 'Dropped Table : ' + @tname
    SELECT @tname = (SELECT TOP 1 [name] FROM sys.objects WHERE [type] = 'U' AND [name] like N'TableName%'  AND [name] > @tname ORDER BY [name])
END
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.