自动删除架构和表

问题描述 投票:0回答:1

我有一个包含超过 50000 个架构的 SQL Server 数据库。

我需要保留 500 个。
我尝试删除所有不必要的架构,但它很长。
我必须删除一个模式的所有表,然后删除该模式本身。

有可能自动执行此操作吗?

目前我使用类似的方法来删除所有表

DECLARE @sql nvarchar(max) = '';
SELECT @sql = @sql + 'DROP TABLE dbo.' + QUOTENAME(t.name) + ';'
FROM sys.tables t
WHERE t.type = 'U' AND t.schema_id = SCHEMA_ID('dbo');
EXEC sp_executesql @sql;
sql-server plsql schema
1个回答
0
投票

您可以使用此方法来加快您想做的事情,是否应该这样做取决于您管理风险。根据表大小、日志记录级别、磁盘空间等因素,您可以通过删除大量对象来快速填满数据库事务日志。

  1. 首先在副本数据库上进行测试
  2. 数据库备份!
  3. 验证数据库备份是否可以恢复!
  4. 使用要删除的架构名称创建一个工作表。如果您有一个可遵循的命名标准,允许您识别要删除的架构,则可以从 sys.schemas 中选择它们。如果您不小心包含了不应删除的架构,那么这是一项危险的工作。您可能希望以较小的批次进行,而不是开始删除 50,000 个模式。
CREATE TABLE [DropSchemaList](
    [SchemaName] [nvarchar](128) NOT NULL
);

INSERT INTO DropSchemaList
SELECT s.name
FROM sys.schemas s
WHERE s.name like '%somepattern%';
  1. 创建游标并迭代插入到工作表中的架构名称,删除表,最后删除架构。如果除了表格之外还有其他对象,您也需要删除它们。
DECLARE @sql NVARCHAR(MAX);

-- Cursor definition to loop through schemas to drop
DECLARE SchemaCursor CURSOR FAST_FORWARD FOR
SELECT SchemaName
FROM DropSchemaList;

DECLARE @SchemaName NVARCHAR(128);

OPEN SchemaCursor;
FETCH NEXT FROM SchemaCursor INTO @SchemaName;

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sql = N'';
    
    --Create drop statements
    SELECT @sql += 'DROP TABLE [' + s.name + '].[' + t.name + ']; '
    FROM sys.tables AS t
    JOIN sys.schemas AS s ON t.schema_id = s.schema_id
    WHERE s.name = @SchemaName;

    --Run drop statements
    IF (@sql <> '')
    BEGIN
        PRINT 'executing table drop for schema: ' + @SchemaName;
        EXEC sp_executesql @sql;
    END

    -- Drop the schema
    SET @sql = N'DROP SCHEMA [' + @SchemaName + '];';
    PRINT 'executing schema drop for schema: ' + @SchemaName;
    EXEC sp_executesql @sql;

    FETCH NEXT FROM SchemaCursor INTO @SchemaName;
END

CLOSE SchemaCursor;
DEALLOCATE SchemaCursor;
© www.soinside.com 2019 - 2024. All rights reserved.