No SQL Server 2017, tenho uma exibição, "ParentView", que é referenciada por outras exibições "ChildView1", "ChildView2", etc. Essas exibições são referenciadas por outras exibições "GrandChildView1", "GrandChildView2", etc. e assim por diante e assim por diante adiante. Certifico-me de configurar todas as minhas visualizações para ter "COM SCHEMABINDING". Quando quero fazer uma alteração em "ParentView", sou obrigado a descartar e criar todas as visualizações dependentes. Isso, é claro, faz todo o sentido porque eu tenho "COM SCHEMABINDING" ativado e poderia estar fazendo uma alteração que poderia quebrar uma das visualizações dependentes. No entanto, fazer tudo isso é tedioso através da interface do usuário, então eu queria saber ...
Como posso obter um script que recebe uma exibição ou qualquer objeto como entrada e cria uma instrução drop/create com base em dependências?
Por exemplo:
DROP VIEW [dbo].[GrandChild]
GO
DROP VIEW [dbo].[Child]
GO
ALTER VIEW [dbo].[Parent]
...
GO
CREATE VIEW [dbo].[Child]
...
GO
CREATE VIEW [dbo].[GrandChild]
...
GO
Notas
- Isso não precisa ser específico para visualizações. Eu também tenho funções dependentes e procedimentos armazenados também.
- Nenhuma das minhas visualizações são visualizações indexadas.
Eu encontrei uma maneira de fazer isso usando alguns scripts diferentes.
Primeiro, eu precisava configurar o procedimento armazenado "PrintString" de Greg M. Lucas para imprimir todas as minhas instruções sem que elas fossem truncadas.
Segundo, criei uma tabela temporária para armazenar todas as entidades dependentes para que eu possa usá-la posteriormente para imprimir meu script. Incluída na tabela temporária está uma coluna "Order" para fazer a ordem decrescente nas instruções drop e a ordem crescente nas instruções create.
Terceiro, preencho minha tabela temporária usando um CTE recursivo. Neste exemplo, minha visualização pai é chamada de 'dbo.Project_Expanded'.
Quarto, eu crio minhas instruções drop e, em seguida, minhas instruções create usando minha tabela temporária e copio os resultados. Observe que minha versão lida apenas com funções, procedimentos e exibições com valor de tabela embutidos. Você precisará atualizá-lo se precisar manipular mais tipos de objeto.
Por fim, limpo a tabela temporária e descarto o procedimento "PrintString":