none
Atualizacao de Views em dois BDs RRS feed

  • 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.

    sexta-feira, 16 de março de 2007 23:39

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 sysname

    Select @Reg_Atual = 1
    Select @Registros = Count(*) From @Views_Sistema

    While @Reg_Atual <= @Registros
    Begin
       Select @Nome_View=Nome From @Views_Sistema Where
    Registro=@Reg_Atual

       Exec sp_refreshview @Nome_View
       PRINT @Nome_View+' foi atualizada com sucesso.'

       Set @Reg_Atual = @Reg_Atual + 1
    End

     

     

    Espero ter ajudado

    terça-feira, 20 de março de 2007 12:17

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.

    sexta-feira, 16 de março de 2007 23:58
  •  

    na verdade isso esta correto, e nao e recomendado vc. criar views usando *, sempre passe os campos que vc. precisa somente, mesmo que precise de todos a recomendacao e passar todos os nomes de campos.

     

    Abs;

    sábado, 17 de março de 2007 19:45
  • 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

    segunda-feira, 19 de março de 2007 11:56
  • Anderson,

    Usa idéia é muito boa.

    Anderson e Marcelo, será que se ele utilizar um Linked Server, não seria mais fácil para fazer este processo de atualização?

    segunda-feira, 19 de março de 2007 13:43
  • Bom dia Junior, creio q ele já possua um Linked Server.Acho muito mais prático a utilização de uma DDL Trigger neste caso.

     

     

    Abs

    segunda-feira, 19 de março de 2007 13:54
  • Bom dia!

     

    Marcelo, pq nao eh recomendado criar views usando "*"??

    segunda-feira, 19 de março de 2007 15:24
  • Douglas,

    A função de uma view é retornar um conjunto de dados armazenados a um determinado tempo no banco de dados, para proporcional maior desempenho.

     

    segunda-feira, 19 de março de 2007 17:12
  • 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 int

    DECLARE ResetView CURSOR FOR

    select TABLE_NAME from INFORMATION_SCHEMA.TABLES
    where TABLE_TYPE = 'VIEW'

    OPEN ResetView

    FETCH NEXT FROM ResetView
    INTO @View

    WHILE @@FETCH_STATUS = 0
    BEGIN
    exec sp_refreshview @View
    PRINT @View+' foi atualizada'

    set @Error = @@ERROR
    IF @Error <>0
    BEGIN
    PRINT 'Ocorreu um erro'
    END

    FETCH NEXT FROM ResetView
    INTO @View
    END

    CLOSE ResetView
    DEALLOCATE ResetView
    GO

    segunda-feira, 19 de março de 2007 22:33
  • 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 sysname

    Select @Reg_Atual = 1
    Select @Registros = Count(*) From @Views_Sistema

    While @Reg_Atual <= @Registros
    Begin
       Select @Nome_View=Nome From @Views_Sistema Where
    Registro=@Reg_Atual

       Exec sp_refreshview @Nome_View
       PRINT @Nome_View+' foi atualizada com sucesso.'

       Set @Reg_Atual = @Reg_Atual + 1
    End

     

     

    Espero ter ajudado

    terça-feira, 20 de março de 2007 12:17
  • Anderson,

    Fico muito legal a sua customização, baseando no exemplo fornecido pelo Marcelo.

    Ótimo, isso mostra que o pessoal do fórum realmente tem conhecimento, fico muito contente por a cada dia apredender um pouco mais.

    terça-feira, 20 de março de 2007 12:22
  • Valeu Junior, estamos sempre ai!

     

    Abs

    terça-feira, 20 de março de 2007 12:36
  • Valeu Anderson.

    Melhor que encomenda.
    Muito obrigado.

    quarta-feira, 28 de março de 2007 03:52