Usuário com melhor resposta
Atualizacao de Views em dois BDs

Pergunta
-
Tenho o seguinte problema:
- Um banco de dados do sistema ERP da empresa;
- Um segundo banco contendo Views, Stored Procedures, que buscam informacoes do primeiro banco.As views no segundo banco acessam as tabelas do primeiro do tipo:
Select * from PrimeiroBanco.dbo.NomeDaTabela
Acontece que quando um novo campo é adicionado em qualquer tabela no primeiro banco, não é refletido automaticamente no segundo. Quando eu entro na View do segundo banco e a gravo novamente, o campo adicionado na tabela do primeiro banco aparece. Se essa mesma View for colocada no primeiro banco, as informações são atualizadas automaticamente.
Como faço para não ser necessário realizar a gravação das Views novamente, caso haja alteração de estrutura nas tabelas do primeiro?
Obrigado.
Respostas
-
Bom dia Marcelo, baseado no modelo que você postou criei uma nova utilização ainda mais otimizada, sem o uso de cursor. Dá uma olhada.
Declare @Views_Sistema Table (Registro int identity(1,1),Nome sysname)
Insert into @Views_Sistema Select Name from SysObjects Where Xtype='V'Declare @Reg_Atual int,
@Registros int,
@Nome_View sysnameSelect @Reg_Atual = 1
Select @Registros = Count(*) From @Views_SistemaWhile @Reg_Atual <= @Registros
Begin
Select @Nome_View=Nome From @Views_Sistema Where Registro=@Reg_AtualExec sp_refreshview @Nome_View
PRINT @Nome_View+' foi atualizada com sucesso.'Set @Reg_Atual = @Reg_Atual + 1
EndEspero ter ajudado
Todas as Respostas
-
Marcelo,
O SQL Server possui funções para atualizar uma view, sem precisar realizar alguma alteração, mas esta função tem como finalidade atualizar o conjunto de informações existente na view, e não seus estrutura.
Mas dependendo dos comandos que estão especificados na view, acredito que possa te ajudar.
Procure mais informações no Books On-Line do SQL Server sobre: View.
-
-
Bom dia Marcelo.
Creio que uma boa alternativa seria você criar no Banco de Dados que contém as views uma tabela que contenha a "estrutura" das suas views (nome da view,nome dos campos e ordem de exibição) algo semelhante a sys.columns, criar uma DDL Trigger no Banco 1 que verifique as alterações efetuadas nas tabelas e que gere as atualizações no banco 2. Não conheço o seu cenário, mas como creio que as atualizações das tabelas não são tão constantes considero isso uma boa alternativa.
Espero ter ajudado
-
-
-
-
-
Olha pessoal, um outro colega me respondeu em outro forum para eu utilizar o comando:
sp_refreshview
Funcionou perfeitamente. Aí pesquisando na internet sobre esta Procedure, acabei encontrando um script para atualizar todas as views do banco, de uma só vez. Segue abaixo o procedimento armazenado:CREATE PROCEDURE SP_ATUALIZATODASVIEWS
AS
DECLARE @View sysname, @Error intDECLARE ResetView CURSOR FOR
select TABLE_NAME from INFORMATION_SCHEMA.TABLES
where TABLE_TYPE = 'VIEW'OPEN ResetView
FETCH NEXT FROM ResetView
INTO @ViewWHILE @@FETCH_STATUS = 0
BEGIN
exec sp_refreshview @View
PRINT @View+' foi atualizada'set @Error = @@ERROR
IF @Error <>0
BEGIN
PRINT 'Ocorreu um erro'
ENDFETCH NEXT FROM ResetView
INTO @View
ENDCLOSE ResetView
DEALLOCATE ResetView
GO -
Bom dia Marcelo, baseado no modelo que você postou criei uma nova utilização ainda mais otimizada, sem o uso de cursor. Dá uma olhada.
Declare @Views_Sistema Table (Registro int identity(1,1),Nome sysname)
Insert into @Views_Sistema Select Name from SysObjects Where Xtype='V'Declare @Reg_Atual int,
@Registros int,
@Nome_View sysnameSelect @Reg_Atual = 1
Select @Registros = Count(*) From @Views_SistemaWhile @Reg_Atual <= @Registros
Begin
Select @Nome_View=Nome From @Views_Sistema Where Registro=@Reg_AtualExec sp_refreshview @Nome_View
PRINT @Nome_View+' foi atualizada com sucesso.'Set @Reg_Atual = @Reg_Atual + 1
EndEspero ter ajudado
-
-
-