하나의 SQL 문에서 모든 테이블, 저장 프로 시저, 트리거, 제약 조건 및 모든 종속성을 삭제하십시오.


287

모든 테이블을 삭제하고 하나의 SQL 문에서 저장 프로 시저, 트리거, 제약 조건 및 모든 종속성을 삭제하여 SQl Server 2005에서 데이터베이스를 정리할 수있는 방법이 있습니까?

요청 이유 :

새 DB를 생성하는 대신 사용하지 않는 기존 DB를 정리하기위한 DB 스크립트를 갖고 싶습니다. 특히 DB 관리자에게 요청을하고 잠시 기다려야 할 때 특히 그렇습니다!

답변:


604

이 스크립트는 모든 뷰, SPS, 함수 PK, FK 및 테이블을 정리합니다.

/* 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 스키마에없는 테이블이 있으면 어떻게합니까?
StuffHappens

8
이 스크립트는 확실히 다른 스키마 (dbo 이외의)를 고려하지 않습니다. 나는 그것을 테스트하고 영원히 실행됩니다. 이 시나리오에 맞게 조정할 수 있다고 생각합니다.
W3Max

1
이 스크립트는 아주 잘 작동합니다. 몇 가지를 놓치면 어셈블리 및 사용자 정의 유형을 고려해야합니다. 따라서 삭제 프로 시저의 예와 같이 [type] = 'P'OR [type] = 'PC'도 어셈블리를 삭제할 때 assembly_ID desc로 순서를 지정하여 종속성이 올바른 순서로 삭제되도록하십시오.
Brian

1
모든 기본 키를 별도로 삭제할 필요는 없습니다. 테이블을 떨어 뜨려 처리해야합니다
erikkallen

1
@erikkallen 기본 키를 먼저 삭제해야하는 이유는 외래 키 종속성에 대한 걱정없이 테이블을 순서에 관계없이 삭제할 수 있기 때문입니다. 그렇지 않으면 강력한 엔터티 유형보다 먼저 모든 약한 엔터티 유형이 삭제되도록 복잡한 삭제 순서를 사용해야합니다. 그렇지 않으면 참조 무결성 제약 조건 위반으로 스크립트가 실패합니다.
Jeff Puckett

118

Adam Anderson이이 스크립트를 사용하고 있으며 dbo가 아닌 다른 스키마의 객체를 지원하도록 업데이트되었습니다.

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

출처 : Adam Anderson 블로그 게시물


3
거의 완벽하지만 함수를 사용하여 계산 된 열이있는 테이블이 하나 있습니다. 그러나 드롭 기능 부분 만 움직이면 좋습니다.
Akos Lukacs

1
잘 작동하면 Azure PAAS SQL 데이터베이스에 대해이를 실행하면 sys.database_firewall_rules 뷰를 삭제하고 삭제하지만 azure로 인해 삭제되지 않습니다.
Simon

SCHEMA_NAME (schema_id) = 'SYS'! 나는 푸른 SQL 문제를 해결하기 위해 "sys.views에서"다음이 추가
UnionP

당신은 이것을 놓쳤다 : -- 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

가장 좋은 방법은 " 드롭을위한 스크립트 생성 "입니다.

데이터베이스 -> 오른쪽 클릭 -> 작업 -> 스크립트 생성을 선택 하십시오 - 스크립트 생성을 위한 마법사 가 열립니다.

스크립팅 옵션 설정에서 객체를 선택한 후 고급 버튼을 클릭하십시오.

  • -> 'Script to create'옵션을 true로 설정하십시오 (만들기를 원합니다)

  • -> 옵션 ' Script to Drop '을 true 설정하십시오 ( 삭제 하고 싶습니다)

  • -> 체크 박스를 선택하여 스크립트를 생성하려는 객체를 선택하십시오.

  • -> 스크립트를 작성할 선택 사항을 선택하십시오 (파일, 새 창, 클립 보드)

  • 기본적으로 종속 객체가 포함됩니다 (처음에는 제약 조건이 삭제됨).

    스크립트를 실행

이런 식으로 스크립트를 사용자 정의 할 수 있습니다.


이 기능은 어떤 버전으로 제공됩니까? 2012 년에는 보이지 않습니다.
Veverke

1
SQL Studio 2012에 있습니다.
Bernhard Döbler

예, 2012 년에 Script to Drop 을 선택할 때 약간 다른 경우 동일한 드롭 다운에 Script to DropScript to Drop 이 있습니다.
Sk Asraf

2
여기에 시퀀스가 ​​포함됩니까?
Markus Pscheidt

이것은 최고의 옵션입니다, 감사 @JP
Abdul Azeez

49

모든 테이블을 삭제하려면

exec sp_MSforeachtable 'DROP TABLE ?'

물론 이것은 저장 프로 시저를 제외한 모든 제약 조건, 트리거 등을 삭제합니다.

저장 프로 시저의 경우에 저장 된 다른 저장 프로 시저가 필요합니다 master.


sp_MSforeachtable이 여기에서 작동하는지 모르겠습니다. 여전히 FK가있는 테이블을 삭제하려고 시도하면 실패 할 수 있습니다.
Tom H

7
잘 작동합니다. 외래 키가 있으면 몇 번만 실행하면됩니다.
Mathias Lykkegaard Lorenzen

FOREIGN KEY 제약 조건에 의해 참조되므로 'dbo.sometable'개체를 삭제할 수 없습니다.
악마의 옹호자

삭제 등을 위해이 기사를 확인하십시오 stored procedures.
shaijut

참고로 Azure PAAS SQL 데이터베이스에서는 작동하지 않습니다.
Simon

14

나는 두 가지 진술로 그것을 할 것입니다 : DROP DATABASE ???

그리고 CREATE DATABASE ???


6
이러한 권한이없고 실행할 권한이있는 사람에게 스크립트를 제공 할 수없는 경우이 작업을 수행하지 않아야합니다. 개발자가 이러한 권한을 얻지 못하는 이유가 있습니다.
HLGEM

@HLGEM 일부 dba는 권한을 설정하는 방법을 모른다. 내 웹 사이트 호스트에서 내 데이터베이스를 삭제할 수 없습니다. 데이터베이스를 삭제하려면 특별한 높은 권한이 필요하다고 생각합니다. 이로 인해 다른 사용자 데이터베이스를 삭제할 수 있으며 보안 위험이 커질 수 있습니다.
Tony_Henrich 2

1
AWS RDS의 경우 DB를 다시 생성하는 데 최소 15-20 분이 걸리고 DB를 다시 생성하지 않으려는 경우
Kamran Qadir

9

여기에 스크립트 중 일부를 시도했지만 스키마에 테이블이 있기 때문에 작동하지 않았습니다. 그래서 다음을 정리했습니다. 이 스크립트는 스키마 목록을 가져 와서 순서대로 삭제합니다. 스키마에서 완전한 순서를 가지고 있는지 확인해야합니다. 순환 종속성이 있으면 실패합니다.

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 스키마에없는 테이블을 삭제합니다.
David Roussel

내 대답이 작동 할 때 왜 다운 투표를 받았는지 확실하지 않으며 dbo의 응답뿐만 아니라 모든 테이블, 뷰 및 저장 프로 시저를 삭제합니다 (나에게 효과적이지 않은 주요 답변과 달리)
David Roussel

7

완전히 비어있는 데이터베이스를 백업하십시오. 모든 개체를 삭제하는 대신 백업 만 복원하십시오.


3
CREATE DATABASE가 새 데이터베이스의 템플리트를 가져 오는 데이터베이스이므로 데이터베이스를 백업하고 복원하는 데 유용한 데이터베이스 예는 모델 데이터베이스입니다.
David Parvin

7

이것이 내가 시도한 것입니다.

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

출력 결과가 무엇이든, 모두 복사하고 새 쿼리에 붙여 넣고 실행을 누르십시오. 모든 테이블이 삭제됩니다.


3

오늘 밤 내 마스터 데이터베이스에 대해 실수로 db init 스크립트를 실행했습니다. 어쨌든, 나는이 스레드에 빨리 부딪쳤다. exec sp_MSforeachtable 'DROP TABLE?'을 사용했습니다. 응답하지만 오류가 발생하지 않을 때까지 여러 번 실행해야했습니다 (종속성.) 그 후 다른 스레드를 우연히 만져서 모든 저장 프로 시저와 함수를 삭제했습니다.

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

이 시도

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의 답변 외에도 유형을 모두 포함해야합니다.

    /* 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

당신은 모두 해제해야 triggers하고 constraints처음.

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

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

그런 다음 객체를 삭제하기위한 스크립트를 다음과 같이 생성 할 수 있습니다.

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

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

생성 된 명령문을 실행하십시오.


0

나에게는 다소 위험한 기능인 것 같습니다. 이와 같은 것을 구현하면 사고 당 실행할 수없는 방식으로 올바르게 고정해야합니다.

전에 제안했듯이 직접 저장 프로 시저를 만들 수 있습니다. SQL Server 2005에서는이 시스템 테이블을 통해 삭제하려는 개체를 확인하고 찾을 수 있습니다.

select * from sys.objects

0

여기에 모든 sp, 함수 및 트리거를 삭제하는 새로운 쿼리가 있습니다.

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의 답변에 추가하려면 모든 사용자 정의 유형을 삭제해야하므로 스크립트에 이것을 추가했습니다.

/* 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

이 목표를 달성하는 데 사용할 수있는 단일 진술은 없습니다.

당신은 물론 자신을 만들 수 있습니다 stored procedure 이러한 다양한 관리 작업을 수행하는 데 사용할 수 수도 있습니다.

그런 다음이 단일 명령문을 사용하여 프로 시저를 실행할 수 있습니다.

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

오라클의 모든 객체를 제거하려면

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

0

sql2012 이상에서 시도하십시오.

선택한 스키마로 모든 객체를 삭제하는 데 도움이됩니다.

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

다른 대안은 다음과 같습니다.

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;

-1

이 시도....

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.