我有一个包含超过 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;
您可以使用此方法来加快您想做的事情,是否应该这样做取决于您管理风险。根据表大小、日志记录级别、磁盘空间等因素,您可以通过删除大量对象来快速填满数据库事务日志。
CREATE TABLE [DropSchemaList](
[SchemaName] [nvarchar](128) NOT NULL
);
INSERT INTO DropSchemaList
SELECT s.name
FROM sys.schemas s
WHERE s.name like '%somepattern%';
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;