programing

SQL Server 2008 특수 스키마에서 모든 테이블 삭제

itmemos 2023. 7. 6. 21:50
반응형

SQL Server 2008 특수 스키마에서 모든 테이블 삭제

안녕하세요. DBO1과 같은 사용자 지정 스키마에서 생성된 데이터베이스의 모든 테이블을 삭제할 수 있는지 알고 싶습니다.하나의 SQL 쿼리 또는 특수 스크립트를 사용합니다.

감사해요.

그러면 사용자에 대한 모든 DROP TABLE 문이 생성되고 SQL 문이 인쇄됩니다.그런 다음 복사 및 실행하기 전에 원하는 값인지 확인할 수 있습니다.100% 확실하게 확인하세요... 먼저 백업을 받으십시오:)

DECLARE @SqlStatement NVARCHAR(MAX)
SELECT @SqlStatement = 
    COALESCE(@SqlStatement, N'') + N'DROP TABLE [DBO1].' + QUOTENAME(TABLE_NAME) + N';' + CHAR(13)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DBO1' and TABLE_TYPE = 'BASE TABLE'

PRINT @SqlStatement

다소 오래된 스레드를 알고 있지만, 저는 이와 같은 것을 찾고 있었고 원래의 답변이 매우 도움이 된다는 것을 알게 되었습니다.즉, 스크립트는 또한 해당 스키마에 존재할 수 있는 보기를 삭제하려고 시도하고 사용자가 DROP TABLE 문을 실행하여 보기를 삭제하려고 하므로 오류 메시지를 제공합니다.

주어진 스키마에서 모든 테이블, 뷰, 프로시저 및 함수를 삭제해야 했기 때문에 결국 이 글을 쓰게 되었습니다.아마도 이것을 성취하는 가장 우아한 방법은 아닐 것입니다. 하지만 그것은 저에게 효과가 있었고 저는 제가 공유할 것이라고 생각했습니다.

DECLARE @Sql VARCHAR(MAX)
      , @Schema varchar(20)

SET @Schema = 'Integration' --put your schema name between these quotes

--tables
SELECT @Sql = COALESCE(@Sql,'') + 'DROP TABLE %SCHEMA%.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @Schema
    AND TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_NAME


--views
SELECT @Sql = COALESCE(@Sql,'') + 'DROP VIEW %SCHEMA%.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @Schema
    AND TABLE_TYPE = 'VIEW'
ORDER BY TABLE_NAME

--Procedures
SELECT @Sql = COALESCE(@Sql,'') + 'DROP PROCEDURE %SCHEMA%.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = @Schema
    AND ROUTINE_TYPE = 'PROCEDURE'
ORDER BY ROUTINE_NAME

--Functions
SELECT @Sql = COALESCE(@Sql,'') + 'DROP FUNCTION %SCHEMA%.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = @Schema
    AND ROUTINE_TYPE = 'FUNCTION'
ORDER BY ROUTINE_NAME


SELECT @Sql = COALESCE(REPLACE(@Sql,'%SCHEMA%',@Schema), '')

PRINT @Sql

, 은 문서화되지 ▁the▁but▁i▁using▁undo다▁by생합니각▁the▁thinkmented▁to▁is▁icu▁is오▁way▁this▁easiest▁an▁do▁thread▁old고▁this▁know래라방가를 사용하는 것이라고 생각합니다.sp_MSforeachtable저장 프로시저:

EXEC sp_MSforeachtable
  @command1 = 'DROP TABLE ?'
, @whereand = 'AND SCHEMA_NAME(schema_id) = ''your_schema_name'' '

이 저장 프로시저에 대한 자세한 보고서는 여기에서 확인할 수 있지만 링크가 비활성화되는 경우 다음과 같은 주요 내용이 있습니다.

각 테이블의 sp_MS는 T-SQL 명령을 현재 데이터베이스에 있는 모든 테이블에 반복적으로 적용하는 데 주로 사용되는 저장 프로시저입니다.
[...]
하는 데 표 을 깨달았습니다.

@command1, @command2, @command3
저장 에 대해 sp_MS는 하나 할 수 .sp_MS는 테이블 저장 프로시저마다 하나 이상의 명령을 실행해야 하지만(@command1) 최대 3개의 명령을 실행할 수 있습니다.각 테이블에 대해 먼저 @command1 실행을 시작한 다음 마지막으로 @command2 및 @command3 실행을 시작합니다.

@precommand.
이 매개 변수를 사용하여 @command1 이전에 실행할 명령을 제공합니다.변수 환경을 설정하거나 모든 종류의 초기화를 수행하는 데 유용합니다.

@postcommand 포명령트
이 매개 변수를 사용하여 모든 명령이 성공적으로 실행된 후 실행할 명령을 제공합니다.제어 및 정리 프로세스에 유용합니다.

@차를 교체합니다.
기본적으로 테이블은 물음표(?) 문자로 표시됩니다.이 매개 변수를 사용하여 이 문자를 변경할 수 있습니다.

@어디서나
기본적으로 각 테이블의 sp_MS는 데이터베이스의 모든 사용자 테이블에 적용됩니다.이 매개 변수를 사용하여 작업할 테이블을 필터링합니다.다음 섹션에서는 테이블을 필터링하는 방법을 설명하겠습니다.

다른 답변을 바탕으로 저장 프로시저가 있습니다.spDropSchema스키마 및 스키마 자체의 모든 개체를 삭제합니다.

이 절차는 시퀀스 개체도 삭제하려고 하므로 SQL Server 2012 이상에서만 작동합니다.

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'spDropSchema')
    BEGIN
        DROP  PROCEDURE  spDropSchema
    END
GO

CREATE PROCEDURE spDropSchema(@Schema nvarchar(200))
AS

DECLARE @Sql NVARCHAR(MAX) = '';

--constraints
SELECT @Sql = @Sql + 'ALTER TABLE '+ QUOTENAME(@Schema) + '.' + QUOTENAME(t.name) + ' DROP CONSTRAINT ' + QUOTENAME(f.name)  + ';' + CHAR(13)
FROM sys.tables t 
    inner join sys.foreign_keys f on f.parent_object_id = t.object_id 
    inner join sys.schemas s on t.schema_id = s.schema_id
WHERE s.name = @Schema
ORDER BY t.name;

--tables
SELECT @Sql = @Sql + 'DROP TABLE '+ QUOTENAME(@Schema) +'.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @Schema AND TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_NAME

--views
SELECT @Sql = @Sql + 'DROP VIEW '+ QUOTENAME(@Schema) +'.' + QUOTENAME(TABLE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @Schema AND TABLE_TYPE = 'VIEW'
ORDER BY TABLE_NAME

--procedures
SELECT @Sql = @Sql + 'DROP PROCEDURE '+ QUOTENAME(@Schema) +'.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = @Schema AND ROUTINE_TYPE = 'PROCEDURE'
ORDER BY ROUTINE_NAME

--functions
SELECT @Sql = @Sql + 'DROP FUNCTION '+ QUOTENAME(@Schema) +'.' + QUOTENAME(ROUTINE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = @Schema AND ROUTINE_TYPE = 'FUNCTION'
ORDER BY ROUTINE_NAME

--sequences
SELECT @Sql = @Sql + 'DROP SEQUENCE '+ QUOTENAME(@Schema) +'.' + QUOTENAME(SEQUENCE_NAME) + ';' + CHAR(13)
FROM INFORMATION_SCHEMA.SEQUENCES
WHERE SEQUENCE_SCHEMA = @Schema
ORDER BY SEQUENCE_NAME

--types
SELECT @Sql = @Sql + 'DROP TYPE ' + QUOTENAME(@Schema) + '.' + QUOTENAME(t.name) + ';' + CHAR(13)
FROM sys.types t
    INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
WHERE t.is_user_defined = 1 AND
    s.name  = @Schema
ORDER BY s.name

SELECT @Sql = @Sql + 'DROP SCHEMA '+ QUOTENAME(@Schema) + ';' + CHAR(13)

EXECUTE sp_executesql @Sql

GO

@Kevo의 답변을 바탕으로 테이블을 삭제하기 전에 모든 외부 키 제약 조건을 삭제하기 위해 다음을 추가했습니다.SQL 2008 R2에서만 테스트했습니다.

select @Sql = COALESCE(@Sql,'') + 'ALTER TABLE %SCHEMA%.' + t.name + ' drop constraint ' + 
OBJECT_NAME(d.constraint_object_id)  + ';' + CHAR(13)
from sys.tables t 
    join sys.foreign_key_columns d on d.parent_object_id = t.object_id 
    inner join sys.schemas s on t.schema_id = s.schema_id
where s.name = @Schema
ORDER BY t.name;

또한 @Kevo의 답변을 바탕으로 TSQL Print 문의 문제를 루프하면서 다음과 같이 추가했습니다.메시지 문자열의 길이는 최대 8,000자입니다.8,000자를 초과하면 인쇄 문이 나머지 문자를 잘라냅니다.

DECLARE @SqlLength int
      , @SqlPosition int = 1
      , @printMaxLength int = 8000

SET @SqlLength = LEN(@Sql)

WHILE (@SqlLength) > @printMaxLength
BEGIN
    PRINT SUBSTRING(@Sql, @SqlPosition, @printMaxLength)
    SET @SqlLength = @SqlLength - @printMaxLength
    SET @SqlPosition = @SqlPosition + @printMaxLength
END
IF (@SqlLength) < @printMaxLength AND (@SqlLength) > 0
BEGIN
    PRINT SUBSTRING(@Sql, @SqlPosition, @printMaxLength)
END

@raider33과 @Kevo의 답변을 하나의 직접 실행 솔루션에 결합했습니다.

DECLARE @SqlStatement NVARCHAR(MAX)
DECLARE @schema varchar(30) = 'SCHEMA_NAME';

select @SqlStatement = COALESCE(@SqlStatement,'') + 'ALTER TABLE '+@schema+'.' + t.name + ' drop constraint ' + 
OBJECT_NAME(d.constraint_object_id)  + ';' + CHAR(13) + CHAR(10)
from sys.tables t 
    join sys.foreign_key_columns d on d.parent_object_id = t.object_id 
    inner join sys.schemas s on t.schema_id = s.schema_id
where s.name = @schema
ORDER BY t.name;

SELECT @SqlStatement += 
    COALESCE(@SqlStatement, '') + 'DROP TABLE ' + @schema +'.'+ QUOTENAME(TABLE_NAME) + ';'  + CHAR(13) + CHAR(10)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @schema

EXECUTE sp_executesql @SqlStatement

누군가에게 도움이 될까봐 마스터 데이터베이스에 저장 프로시저로 추가하여 어떤 db/schema에서도 편리하게 사용할 수 있도록 하였습니다.

다음과 같이 부를 수 있습니다.

EXEC master.dbo.dropTablesInSchema 'my_db', 'dbo

저장 프로시저 생성 스크립트:

CREATE PROC [master].[dbo].[dropTablesInSchema]
    @db nvarchar(max),
    @schema nvarchar(max)
AS
BEGIN
    DECLARE @Tables TABLE (name nvarchar(max))
    INSERT INTO @Tables
    EXEC ('SELECT TABLE_NAME FROM [' + @db + '].INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ''' + @schema + ''' and TABLE_TYPE =''BASE TABLE''')

    DECLARE @SqlStatement NVARCHAR(MAX)
    SELECT @SqlStatement = 
        COALESCE(@SqlStatement, N'') + N'DROP TABLE [' + @db + '].[' + @schema + '].' + QUOTENAME(NAME) + N';' + CHAR(13)
    FROM @Tables

    EXEC(@SqlStatement)

END

크리스 LB의 대답을 바탕으로, 나는 덧붙였습니다.

GROUP BY d.constraint_object_id, t.name

쿼리에서 중복된 제약 조건 삭제를 보았기 때문입니다. constraint_object_id는 FK 제약 조건 ID입니다(https://msdn.microsoft.com/en-us/library/ms186306.aspx 참조).

DECLARE @SqlStatement NVARCHAR(MAX),
        @Schema NVARCHAR(20)

SET @Schema = 'aa'

SELECT @SqlStatement = 
    COALESCE(@SqlStatement,'') + 'ALTER TABLE '+@Schema+'.' + t.name + ' DROP CONSTRAINT ' + 
    OBJECT_NAME(d.constraint_object_id)  + ';' + CHAR(13) + CHAR(10)
FROM sys.tables t
    JOIN sys.foreign_key_columns d on t.object_id = d.parent_object_id 
    INNER JOIN sys.schemas s on t.schema_id = s.schema_id
WHERE s.name = @Schema
GROUP BY d.constraint_object_id, t.name
ORDER BY t.name;
select 'DROP TABLE [TABSCHEMA].' + QUOTENAME(TABLE_NAME) + N';' from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TABSCHEMA' and TABLE_TYPE = 'BASE TABLE'

그러면 모든 DROP TABLE 및 DROP VIEW가 생성되며 확인란이 존재합니다.

DECLARE @SqlStatement NVARCHAR(MAX)

SELECT @SqlStatement = 
COALESCE(@SqlStatement, N'') + N'IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'''+'['+TABLE_SCHEMA+'].' + QUOTENAME(TABLE_NAME) +''' )' + CHAR(13)+
 '  DROP '+ TABLE_TYPE +' ['+TABLE_SCHEMA+'].' + QUOTENAME(TABLE_NAME) + N';' + CHAR(13)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA in ('SCHEMA1','SCHEMA2','SCHEMA13' )
ORDER BY TABLE_SCHEMA   

PRINT  REPLACE(@SqlStatement,'DROP BASE TABLE ','DROP TABLE ') 
GO

스키마의 모든 테이블을 삭제합니다. 테이블의 하위 집합을 반환하도록 수정할 수 있습니다.

declare @schema varchar(10) = 'temp' 
declare @max_number_of_tables int = 1000
declare @sql nvarchar(max)
declare @index int = 0


while (
select count(*)
from
    sys.objects obj
    join sys.schemas s
        on (s.schema_id=obj.schema_id)
where
    s.name= @schema 
    and obj.type = 'U'
    AND obj.is_ms_shipped = 0x0) > 0 and @index < @max_number_of_tables
begin
  set @index = @index+1

  select top 1
    @sql = N'DROP TABLE [' + @schema + '].[' + obj.name + ']'
  from
    sys.objects obj
    join sys.schemas s
        on (s.schema_id=obj.schema_id)
  where
    s.name = @schema
    and obj.type = 'U'
    AND obj.is_ms_shipped = 0x0
  order by obj.name

  print @sql

  execute(@sql)
end

복사 붙여넣기만 하면 작동하는 승인된 답변의 수정.

바꾸다db데이터베이스 및 세트에@dbSchema스키마로 이동합니다.

USE db -- CHANGE TO YOUR DB
GO

DECLARE @dbSchema NVARCHAR(200);
SET @dbSchema = 'dbo'  -- CHANGE TO YOUR SCHEMA

DECLARE @SqlStatement NVARCHAR(MAX)
SELECT @SqlStatement =
    COALESCE(@SqlStatement, N'') + N'DROP TABLE ' +'[' + @dbSchema +']' + '.' + QUOTENAME(TABLE_NAME) + N';' + CHAR(13)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @dbSchema and TABLE_TYPE = 'BASE TABLE'

EXEC sp_executesql @SqlStatement

언급URL : https://stackoverflow.com/questions/8933976/sql-server-2008-delete-all-tables-under-special-schema

반응형