programing

이름이 특정 문자열로 시작하는 모든 테이블을 삭제합니다.

telebox 2023. 4. 7. 21:07
반응형

이름이 특정 문자열로 시작하는 모든 테이블을 삭제합니다.

이름이 지정된 문자열로 시작하는 테이블을 모두 드롭하려면 어떻게 해야 합니까?

이 작업은 동적 SQL을 사용하여 수행할 수 있습니다.INFORMATION_SCHEMA를 참조할 수 있습니다.

데이터베이스에 소유자가 둘 이상 있는 경우 소유자를 포함하도록 쿼리를 수정해야 할 수 있습니다.

DECLARE @cmd varchar(4000)
DECLARE cmds CURSOR FOR
SELECT 'drop table [' + Table_Name + ']'
FROM INFORMATION_SCHEMA.TABLES
WHERE Table_Name LIKE 'prefix%'

OPEN cmds
WHILE 1 = 1
BEGIN
    FETCH cmds INTO @cmd
    IF @@fetch_status != 0 BREAK
    EXEC(@cmd)
END
CLOSE cmds;
DEALLOCATE cmds

이는 스크립트 생성 + 실행의 2단계 접근방식을 사용하는 것보다 깔끔합니다.그러나 스크립트 세대의 장점 중 하나는 실제로 실행되기 전에 실행 대상 전체를 검토할 수 있다는 것입니다.

프로덕션 데이터베이스에 대해 이 작업을 수행할 경우 최대한 주의를 기울일 것입니다.

Edit Code 샘플 수정.

SELECT 'DROP TABLE "' + TABLE_NAME + '"' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%'

스크립트가 생성됩니다.

삭제하기 전에 테이블의 존재를 확인하기 위한 절 추가:

SELECT 'IF OBJECT_ID(''' +TABLE_NAME + ''') IS NOT NULL BEGIN DROP TABLE [' + TABLE_NAME + '] END;' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%'

이렇게 하면 테이블이 외부 키 순서로 표시되며 SQL Server에 의해 작성된 테이블 중 일부가 삭제되는 것을 방지할 수 있습니다.t.Ordinalvalue는 테이블을 종속 계층으로 슬라이스합니다.

WITH TablesCTE(SchemaName, TableName, TableID, Ordinal) AS
(
    SELECT OBJECT_SCHEMA_NAME(so.object_id) AS SchemaName,
        OBJECT_NAME(so.object_id) AS TableName,
        so.object_id AS TableID,
        0 AS Ordinal
    FROM sys.objects AS so
    WHERE so.type = 'U'
        AND so.is_ms_Shipped = 0
        AND OBJECT_NAME(so.object_id)
        LIKE 'MyPrefix%'

    UNION ALL
    SELECT OBJECT_SCHEMA_NAME(so.object_id) AS SchemaName,
        OBJECT_NAME(so.object_id) AS TableName,
        so.object_id AS TableID,
        tt.Ordinal + 1 AS Ordinal
    FROM sys.objects AS so
        INNER JOIN sys.foreign_keys AS f
            ON f.parent_object_id = so.object_id
                AND f.parent_object_id != f.referenced_object_id
        INNER JOIN TablesCTE AS tt
            ON f.referenced_object_id = tt.TableID
    WHERE so.type = 'U'
        AND so.is_ms_Shipped = 0
        AND OBJECT_NAME(so.object_id)
        LIKE 'MyPrefix%'
)
SELECT DISTINCT t.Ordinal, t.SchemaName, t.TableName, t.TableID
FROM TablesCTE AS t
    INNER JOIN
    (
        SELECT
            itt.SchemaName AS SchemaName,
            itt.TableName AS TableName,
            itt.TableID AS TableID,
            Max(itt.Ordinal) AS Ordinal
        FROM TablesCTE AS itt
        GROUP BY itt.SchemaName, itt.TableName, itt.TableID
    ) AS tt
        ON t.TableID = tt.TableID
            AND t.Ordinal = tt.Ordinal
ORDER BY t.Ordinal DESC, t.TableName ASC

Oracle XE에서는 다음과 같이 동작합니다.

SELECT 'DROP TABLE "' || TABLE_NAME || '";'
FROM USER_TABLES
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%'

또는 구속조건을 해제하고 공간을 확보하려면 다음을 사용하십시오.

SELECT 'DROP TABLE "' || TABLE_NAME || '" cascade constraints PURGE;'
FROM USER_TABLES
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%'

그 결과 많은 양의 데이터가 생성될 것입니다.DROP TABLE cascade constraints PURGE스테이트먼트...

위해서VIEWS사용방법:

SELECT 'DROP VIEW "' || VIEW_NAME || '";'
FROM USER_VIEWS
WHERE VIEW_NAME LIKE 'YOURVIEWPREFIX%'
EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?'

편집:

sp_MSforeachable은 문서화되어 있지 않기 때문에 동작은 MS_SQL 버전에 따라 다를 수 있습니다.

저의 솔루션은 다음과 같습니다.

SELECT CONCAT('DROP TABLE `', TABLE_NAME,'`;') 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'TABLE_PREFIX_GOES_HERE%';

그리고 물론, 이 시스템을TABLE_PREFIX_GOES_HERE를 입력합니다.

@Xenph Yan에 기반한 모든 WordPress 테이블을 드롭하기 위한 mysql 문을 찾던 중 이 게시물을 보았습니다.

SELECT CONCAT(  'DROP TABLE `', TABLE_NAME,  '`;' ) AS query
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE  'wp_%'

그러면 wp_로 시작하는 모든 테이블에 대한 드롭 쿼리 세트가 제공됩니다.

CREATE PROCEDURE usp_GenerateDROP
    @Pattern AS varchar(255)
    ,@PrintQuery AS bit
    ,@ExecQuery AS bit
AS
BEGIN
    DECLARE @sql AS varchar(max)

    SELECT @sql = COALESCE(@sql, '') + 'DROP TABLE [' + TABLE_NAME + ']' + CHAR(13) + CHAR(10)
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME LIKE @Pattern

    IF @PrintQuery = 1 PRINT @sql
    IF @ExecQuery = 1 EXEC (@sql)
END

Xenph Yan의 대답은 내 대답보다 훨씬 깨끗했지만 여기 내 답변이 있다.

DECLARE @startStr AS Varchar (20)
SET @startStr = 'tableName'

DECLARE @startStrLen AS int
SELECT @startStrLen = LEN(@startStr)

SELECT 'DROP TABLE ' + name FROM sysobjects
WHERE type = 'U' AND LEFT(name, @startStrLen) = @startStr

그냥 바꿔요tableName검색 대상 문자에 대해 설명합니다.

이건 나한테 효과가 있었어.

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += '
DROP TABLE ' 
    + QUOTENAME(s.name)
    + '.' + QUOTENAME(t.name) + ';'
    FROM sys.tables AS t
    INNER JOIN sys.schemas AS s
    ON t.[schema_id] = s.[schema_id] 
    WHERE t.name LIKE 'something%';

PRINT @sql;
-- EXEC sp_executesql @sql;
select 'DROP TABLE ' + name from sysobjects
where type = 'U' and sysobjects.name like '%test%'

-- Test는 테이블 이름입니다.

SELECT 'if object_id(''' + TABLE_NAME + ''') is not null begin drop table "' + TABLE_NAME + '" end;' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%'

디폴트 스키마에 없는 테이블이 있었기 때문에 Xenph Yan의 답변에 대해 약간의 도출을 해야 했습니다.

SELECT 'DROP TABLE Databasename.schema.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'strmatch%'

임시 테이블인 경우 다음을 시도해 보는 것이 좋습니다.

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'

특정 일수보다 오래된 와일드카드(예: "table_20210114")를 기반으로 DROP(드롭 명령 생성 및 선택뿐 아니라) 모든 테이블에 대한 제안서를 게시합니다.

DECLARE 
    @drop_command NVARCHAR(MAX) = '',
    @system_time date,
    @table_date nvarchar(8),
    @older_than int = 7
    
Set @system_time = (select getdate() - @older_than)
Set @table_date = (SELECT CONVERT(char(8), @system_time, 112))

SELECT @drop_command += N'DROP TABLE ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME([Name]) + ';'
FROM <your_database_name>.sys.tables
WHERE [Name] LIKE 'table_%' AND RIGHT([Name],8) < @table_date

SELECT @drop_command
 
EXEC sp_executesql @drop_command

쿼리에서 두 개 이상의 행이 반환되는 경우 결과를 수집하여 쿼리에 병합할 수 있습니다.

declare @Tables as nvarchar(max) = '[schemaName].['
select @Tables =@Tables + TABLE_NAME +'],[schemaName].['
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_SCHEMA = 'schemaName'
AND TABLE_NAME like '%whateverYourQueryIs%'

select @Tables =  Left(@Tables,LEN(@Tables)-13) --trying to remove last ",[schemaName].[" part, so you need to change this 13 with actual lenght 

--print @Tables

declare @Query as nvarchar(max) = 'Drop table ' +@Tables 

--print @Query


exec sp_executeSQL @Query

다음 코드를 사용해 보십시오.

declare @TableLst table(TblNames nvarchar(500))
insert into @TableLst (TblNames)
SELECT 'DROP TABLE [' + Table_Name + ']'
FROM INFORMATION_SCHEMA.TABLES
WHERE Table_Name LIKE 'yourFilter%'
WHILE ((select COUNT(*) as CntTables from @TableLst) > 0)
BEGIN
    declare @ForExecCms nvarchar(500) = (select top(1) TblNames from @TableLst)
    EXEC(@ForExecCms)
    delete from @TableLst where TblNames = @ForExecCms
END

이 SQL 스크립트는 커서를 사용하지 않고 실행됩니다.

외부 키로 링크된 테이블을 갑자기 삭제해야 하는 경우.

USE [CentralIntake]
GO

DECLARE @name VARCHAR(200);
DECLARE @DropForeignKeyProcedure varchar(4000); 
DECLARE @DropTableProcedure varchar(4000); 

/*TEST*/ SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE Table_Name LIKE '%_unused'

DECLARE tb_cursor CURSOR FOR 
SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES WHERE Table_Name LIKE '%_unused';

OPEN tb_cursor  
FETCH NEXT FROM tb_cursor INTO @name 

WHILE @@FETCH_STATUS = 0  
BEGIN  

/*TEST*/ SELECT 'ALTER TABLE [' +  OBJECT_SCHEMA_NAME(parent_object_id) + '].[' + OBJECT_NAME(parent_object_id) + '] DROP CONSTRAINT [' + name + ']'    FROM sys.foreign_keys WHERE referenced_object_id = object_id(@name)

    DECLARE fk_cursor CURSOR FOR
    (SELECT 'ALTER TABLE [' +  OBJECT_SCHEMA_NAME(parent_object_id) + '].[' + OBJECT_NAME(parent_object_id) + '] DROP CONSTRAINT [' + name + ']'
    FROM sys.foreign_keys
    WHERE referenced_object_id = object_id(@name));

    OPEN fk_cursor
    FETCH NEXT FROM fk_cursor INTO @DropForeignKeyProcedure
    WHILE @@FETCH_STATUS = 0  
        BEGIN   
            EXEC (@DropForeignKeyProcedure);
            FETCH NEXT FROM fk_cursor INTO @DropForeignKeyProcedure
        END
    CLOSE fk_cursor  
    DEALLOCATE fk_cursor

    SET @DropTableProcedure = (SELECT 'DROP TABLE [' +  TABLE_CATALOG  + '].[' + TABLE_SCHEMA + '].[' + @name + ']'
    FROM INFORMATION_SCHEMA.TABLES
    where TABLE_NAME = @name)

    EXEC(@DropTableProcedure)

    FETCH NEXT FROM tb_cursor INTO @name 
END 

CLOSE tb_cursor  
DEALLOCATE tb_cursor

언급URL : https://stackoverflow.com/questions/4393/drop-all-tables-whose-names-begin-with-a-certain-string

반응형