Tenho um banco de dados com três esquemas principais;
- Global
- Permissões
- Nome do esquema exclusivo com base no número de identificação do cliente (1, 2, 3, 4, ect...)
Cada cliente tem objetos em todos os três esquemas, com os nomes dos objetos do esquema Global e Permissions, contendo o número de ID do cliente seguido por um _
Exemplo;
[1].[Test]
[Global].[1_Test]
[Permissions].[1_Test]
Até agora, escrevi o script abaixo que faz isso, mas mantém apenas os dados de um cliente, não vários;
DECLARE @TenantId NVARCHAR(10)
DECLARE @Commands NVARCHAR(MAX)
DECLARE @Statements TABLE
(
Commands NVARCHAR(500)
)
SET @TenantId = '686'
INSERT INTO @Statements
EXECUTE (
'SELECT ''DROP TABLE'' + '' '' + ''['' + s.[name] + '']'' + ''.'' + ''['' + t.[name] + '']'' AS ''Commands''
FROM sys.schemas s
JOIN sys.tables t on s.schema_id = t.schema_id
WHERE s.name <> '''+ @TenantId +'''
AND s.name <> ''dbo''
AND t.name NOT LIKE '''+ @TenantId +'_%''
AND t.name NOT IN (''DatabaseVersion'', ''PermissionTypes'')
ORDER BY s.name, t.name' )
SELECT * FROM @Statements
--SET @Commands =(
--SELECT STRING_AGG (CAST([Commands] AS NVARCHAR(MAX)), ' ') FROM @Statements )
--SELECT (@Commands)
Como posso converter isso para que leve em consideração vários IDs, exceto apenas um? Sinto que preciso usar um cursor aqui, mas não tenho certeza de como isso seria estruturado.
Desde já, obrigado.
Eu quebrei! Pensei em compartilhar caso mais alguém estivesse interessado também.
Encontrei esta postagem: Solte todas as tabelas do comando de banco de dados, exceto algumas nomeadas
Ele incluía um Cursor que, com algumas modificações, consegui trabalhar para minhas necessidades.