none
Data de atualização linhas modificadas RRS feed

  • Pergunta

  • Boa Tarde

    Alguém sabe me dizer se o SQL Server possui alguma propriedade nas tabelas System que
    possa indicar qual o horário de modificação do registro de cada tabela como uma solução simples ao invés de triggers ? 

    quarta-feira, 12 de novembro de 2014 19:13

Respostas

  • Durval

    Estou com o SQL Express, existe algum outro meio? Inclusive gostaria de evitar triggers.

    Grato,

    Maurício

    Mauricio,

    Encontrei no Fórum Americano um post que tem uma situação semelhante à sua. Faça um teste com o fonte disponibilidado na resposta:

    https://social.msdn.microsoft.com/Forums/sqlserver/en-US/59c8609c-1f84-4595-a292-425f8492caf2/understanding-change-tracking-in-sql-server-2008-express?forum=sqlexpress

    Não funciona da mesma maneira que o CDC (eu nunca utilizei este recurso) mas pela descrição parece que deve servir para esta necessidade.

    Para maiores informações veja:

    http://msdn.microsoft.com/en-us/library/cc280358(v=sql.105).aspx 

    http://msdn.microsoft.com/pt-br/library/cc280519(v=sql.105).aspx


    Se ajudou na sua solução, não esqueça de marcar como resposta !


    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"


    Durval,

    Eu já utilizei o Change Tracking, podemos dizer que ele é o primo pobre do CDC!!!

    Brincadeira é um grande recurso que foi implementado no SQL Server 2008 e que permite rastrear todo processo de manipulação de dados no nível de banco de dados e tabela.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com


    quinta-feira, 13 de novembro de 2014 18:19
  • Cara se for apenas isso realmente por  que vc não  faz com que a coluna date "atualização" receba a função getDate(), 

    exemplo seria bem simples

     atualização = getDate(); 

    Toda vez que o update for executado. 

    Mais informações sobre a função.

    http://msdn.microsoft.com/pt-br/library/ms188383(SQL.105).aspx

    • Marcado como Resposta maumauboy terça-feira, 18 de novembro de 2014 17:00
    segunda-feira, 17 de novembro de 2014 12:02
  • Pessoal

    Muito obrigado pela gama de recursos apresentadas, sem dúvida respostas extremamente úteis, no meu caso preciso atualizar uma coluna datetime chamada atualização para a data atual quando houverem inserções e atualizações se ter que criar triggers, me parece que o tipo rowguid não traz data atual  mesmo convertendo, e o change tracking também não atende neste caso.

    Mas eu posso não estar observando algum ponto, gostaria só de atualizar este campo para a data atual em atualizações e inserções, mas sem triggers.

    Existe tem alguma solução neste caso?

    Grato,

    Maurício

    Mauricio,

    O controle para atualização de uma determinada coluna deve ser "executado" ou "disparado" por algum meio: uma aplicação, uma procedure, um componente,... 

    De qualquer modo, sem uma trigger para esta determinada situação que você está estruturando pode ocorrer o risco de um ou outro processo não estar mapeando à necessidade de atualizar esta coluna específica, causando inconsistência no seu controle de atualização de dados.

    A funcionalidade "Change Tracking" seria o mais próximo de manter este controle sem utilização de uma trigger, porém a coleta de informações é realizada em uma estrutura diferenciada e não em uma determinada coluna que é indicada por você para ser "alimentada".

    Neste caso, uma alternativa mais próxima seria limitar a inclusão/alteração de dados à um determinado usuário deste banco e este usuário ser utilizado apenas em uma procedure que manipula estes dados e atualiza esta coluna, usando a opção "EXECUTE AS".

    Para maiores informações veja:

    http://msdn.microsoft.com/pt-br/library/ms181362.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    • Marcado como Resposta maumauboy terça-feira, 18 de novembro de 2014 17:00
    terça-feira, 18 de novembro de 2014 11:37
    Moderador

Todas as Respostas

  • Creio que esse post irá lhe ajudar bastante, leia até o final:Desvendando estatisticas do sql server


    • Editado Raniel Nogueira quarta-feira, 12 de novembro de 2014 19:19
    • Sugerido como Resposta Raniel Nogueira quarta-feira, 12 de novembro de 2014 19:20
    quarta-feira, 12 de novembro de 2014 19:17
  • Este link mostra count da quantidade de atualizações e a última data, mas preciso saber por registro, no caso gostaria de evitar utilizar uma trigger para atualizar alguma coluna de data de modificação com getdate() a cada atualização que ocorrer. O default getdate() por exemplo não me atendeu.

    E pelo que entendi se a estatísticas não estiverem atualizadas terei uma informação desatualizada.

    quarta-feira, 12 de novembro de 2014 19:26
  • Olá Maumauboy,

    Esta query mostra a ultima atualização de registros na sua tabela através da coluna last_user_update.

    SELECT OBJECT_NAME(OBJECT_ID) AS DBname,

                 last_user_update,*

    FROM sys.dm_db_index_usage_stats

    WHERE database_id = DB_ID( 'SEU_DATABASE')

    AND OBJECT_ID=OBJECT_ID('SUA_TABELA');

    --------------------------------------------------------------

    Se útil classifique!

    Att,


    Keny Maciel da Silva
    DBA SQL-Server ITGROUP
    MCTS SQL Server 2008 Implementation and Maintenance
    Email: kenymaciel@gmail.com

    quarta-feira, 12 de novembro de 2014 19:41
  • Na verdade preciso da ultima atualização por registro a título de data de atualização do registro. Caso eu tenha 1000 linhas quero a data de atualização de cada linha. Sei que a constraint default getdate() não atualiza a coluna em caso de update, só em insert, daí sobrariam triggers, mas gostaria de evita-las. Existe alguma outra opção?

    quarta-feira, 12 de novembro de 2014 20:05
  • Mauricio,

    Acredito que o que você precisa pode ser feito se for habilitado o CDC nesta tabela do SQL Server.

    Para maiores informações veja:

    http://msdn.microsoft.com/pt-br/library/cc645937.aspx

    http://msdn.microsoft.com/pt-br/library/cc627369.aspx

    http://msdn.microsoft.com/pt-br/library/cc645592.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    quarta-feira, 12 de novembro de 2014 21:10
    Moderador
  • Durval

    Estou com o SQL Express, existe algum outro meio? Inclusive gostaria de evitar triggers.

    Grato,

    Maurício

    quinta-feira, 13 de novembro de 2014 12:56
  • Mauricio,

    As vezes para saber sobre a data/hora da ultima atualização do registro de uma determinada tabela sem trigger, eu utilizo os seguintes conceitos:

    - TimeStamp ou RowTimeStamp: http://guilhermeferrera.wordpress.com/2011/04/04/sql-server-timestamp/
    - RowVersion: http://technet.microsoft.com/pt-br/library/ms182776%28v=sql.110%29.aspx

    Outra forma legal de fazer essa espécie de auditoria sem usar a trigger, é através da CLAUSÚLA OUTPUT:
    Veja: http://msdn.microsoft.com/pt-br/library/ms177564.aspxAt

    Att,Rafael.


    **** SER A RESPOSTA FOR UTIL, NÃO ESQUEÇA DE MARCA-LÁ =P ****

    quinta-feira, 13 de novembro de 2014 13:38
  • Mauricio,

    Concordo com a sugestão do Durval em indicar o CDC Change Data Capture, inclusive é um recurso que foi introduzido a partir do SQL Server 2008 e possui a finalidade de capturer e cataloger as informações sobre alterações de dados no SQL Server.

    Eu escrevi um artigo sobre isso na Revista SQL Magazine, já faz um tempo, mas vou compartilhar com você um código de exemplo:

    -- Habilitando o CDC para o Banco de Dados --
    Use SQLMagazine
    Go
    
    Exec sys.sp_cdc_enable_db
    Go
    
    -- Desabilitando o CDC para o Banco de Dados --
    Use SQLMagazine
    Go
    
    Exec sys.sp_cdc_disable_db
    Go
    
    -- Criando a Tabela de Exemplo --
    Create Table Produtos
     (Codigo Int Identity(1,1),
       Descricao VarChar(20))
    Go
    
    -- Adicionando a Chave Primaria --
    Alter Table Produtos
        Add Constraint [PK_Codigo_Produtos] Primary Key (Codigo)
    Go
    
    -- Inserindo a Massa de Registros para Teste --   
    Declare @ContadorRegistros Int
    Set @ContadorRegistros=1
    
    While @ContadorRegistros <=1000
     Begin
     
      If @ContadorRegistros =1
       Insert Into Produtos Values ('Produto Nº: 1')
      Else
       Insert Into Produtos Values ('Produto Nº: '+Convert(VarChar(4),@@Identity+1))
       
       Set @ContadorRegistros += 1;
     End
     
    -- Visualizando os Dados --   
    Select * from Produtos
          
    -- Habilitando o Change Data Capture para trabalhar sobre a table Produtos --
    EXECUTE sys.sp_cdc_enable_table
        @source_schema = N'dbo',
        @source_name = N'Produtos',
        @role_name = N'cdc_Admin';
    GO
    
    -- Retornando todas as linhas capturadas pelo CDC --
    DECLARE @from_lsn binary(10), 
                      @to_lsn binary(10)
    
    SET @from_lsn = sys.fn_cdc_get_min_lsn('dbo_Produtos')
    SET @to_lsn   = sys.fn_cdc_get_max_lsn()
    
    SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_Produtos
      (@from_lsn, @to_lsn, N'all')
    Go
    
    -- Inserindo novos dados --
    Insert Into Produtos Values ('Produto Nº: '+Convert(VarChar(4),@@Identity+1))
    Go
    
    -- Atualizando dados já existentes --
    Update Produtos
    Set Descricao= Descricao+' - Upd'
    Where Codigo Between 11 And 21
    Go
    
    -- Retornando todas as linhas capturadas pelo CDC com Net Changes--
    DECLARE @from_lsn binary(10), 
                      @to_lsn binary(20)
    
    SET @from_lsn = sys.fn_cdc_get_min_lsn('dbo_Produtos')
    SET @to_lsn   = sys.fn_cdc_get_max_lsn()
    
    SELECT * FROM cdc.fn_cdc_get_net_changes_dbo_Produtos
                                  (@from_lsn, @to_lsn, N'all')
    GO
    
    -- Retornando as colunas utilizadas pelo CDC para Captura --
    Execute sys.sp_cdc_get_captured_columns 
                             @capture_instance = N'dbo_Produtos';
    Go
    
    -- Retornando informações de configuração da captura de dados de alteração de uma tabela específica --
    Execute sys.sp_cdc_help_change_data_capture 
                              @source_schema = N'dbo', 
                              @source_name = N'Produtos';
    Go
    
    -- Retornando informações de configuração da captura de dados de alteração de todas as tabelas --
    EXECUTE sys.sp_cdc_help_change_data_capture;


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    quinta-feira, 13 de novembro de 2014 14:52
  • Durval

    Estou com o SQL Express, existe algum outro meio? Inclusive gostaria de evitar triggers.

    Grato,

    Maurício

    Mauricio,

    Encontrei no Fórum Americano um post que tem uma situação semelhante à sua. Faça um teste com o fonte disponibilidado na resposta:

    https://social.msdn.microsoft.com/Forums/sqlserver/en-US/59c8609c-1f84-4595-a292-425f8492caf2/understanding-change-tracking-in-sql-server-2008-express?forum=sqlexpress

    Não funciona da mesma maneira que o CDC (eu nunca utilizei este recurso) mas pela descrição parece que deve servir para esta necessidade.

    Para maiores informações veja:

    http://msdn.microsoft.com/en-us/library/cc280358(v=sql.105).aspx 

    http://msdn.microsoft.com/pt-br/library/cc280519(v=sql.105).aspx


    Se ajudou na sua solução, não esqueça de marcar como resposta !


    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    quinta-feira, 13 de novembro de 2014 15:53
    Moderador
  • Durval

    Estou com o SQL Express, existe algum outro meio? Inclusive gostaria de evitar triggers.

    Grato,

    Maurício

    Mauricio,

    Encontrei no Fórum Americano um post que tem uma situação semelhante à sua. Faça um teste com o fonte disponibilidado na resposta:

    https://social.msdn.microsoft.com/Forums/sqlserver/en-US/59c8609c-1f84-4595-a292-425f8492caf2/understanding-change-tracking-in-sql-server-2008-express?forum=sqlexpress

    Não funciona da mesma maneira que o CDC (eu nunca utilizei este recurso) mas pela descrição parece que deve servir para esta necessidade.

    Para maiores informações veja:

    http://msdn.microsoft.com/en-us/library/cc280358(v=sql.105).aspx 

    http://msdn.microsoft.com/pt-br/library/cc280519(v=sql.105).aspx


    Se ajudou na sua solução, não esqueça de marcar como resposta !


    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"


    Durval,

    Eu já utilizei o Change Tracking, podemos dizer que ele é o primo pobre do CDC!!!

    Brincadeira é um grande recurso que foi implementado no SQL Server 2008 e que permite rastrear todo processo de manipulação de dados no nível de banco de dados e tabela.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com


    quinta-feira, 13 de novembro de 2014 18:19
  • Pessoal

    Muito obrigado pela gama de recursos apresentadas, sem dúvida respostas extremamente úteis, no meu caso preciso atualizar uma coluna datetime chamada atualização para a data atual quando houverem inserções e atualizações se ter que criar triggers, me parece que o tipo rowguid não traz data atual  mesmo convertendo, e o change tracking também não atende neste caso.

    Mas eu posso não estar observando algum ponto, gostaria só de atualizar este campo para a data atual em atualizações e inserções, mas sem triggers.

    Existe tem alguma solução neste caso?

    Grato,

    Maurício

    sexta-feira, 14 de novembro de 2014 17:56
  • Cara se for apenas isso realmente por  que vc não  faz com que a coluna date "atualização" receba a função getDate(), 

    exemplo seria bem simples

     atualização = getDate(); 

    Toda vez que o update for executado. 

    Mais informações sobre a função.

    http://msdn.microsoft.com/pt-br/library/ms188383(SQL.105).aspx

    • Marcado como Resposta maumauboy terça-feira, 18 de novembro de 2014 17:00
    segunda-feira, 17 de novembro de 2014 12:02
  • Pessoal

    Muito obrigado pela gama de recursos apresentadas, sem dúvida respostas extremamente úteis, no meu caso preciso atualizar uma coluna datetime chamada atualização para a data atual quando houverem inserções e atualizações se ter que criar triggers, me parece que o tipo rowguid não traz data atual  mesmo convertendo, e o change tracking também não atende neste caso.

    Mas eu posso não estar observando algum ponto, gostaria só de atualizar este campo para a data atual em atualizações e inserções, mas sem triggers.

    Existe tem alguma solução neste caso?

    Grato,

    Maurício

    Mauricio,

    O controle para atualização de uma determinada coluna deve ser "executado" ou "disparado" por algum meio: uma aplicação, uma procedure, um componente,... 

    De qualquer modo, sem uma trigger para esta determinada situação que você está estruturando pode ocorrer o risco de um ou outro processo não estar mapeando à necessidade de atualizar esta coluna específica, causando inconsistência no seu controle de atualização de dados.

    A funcionalidade "Change Tracking" seria o mais próximo de manter este controle sem utilização de uma trigger, porém a coleta de informações é realizada em uma estrutura diferenciada e não em uma determinada coluna que é indicada por você para ser "alimentada".

    Neste caso, uma alternativa mais próxima seria limitar a inclusão/alteração de dados à um determinado usuário deste banco e este usuário ser utilizado apenas em uma procedure que manipula estes dados e atualiza esta coluna, usando a opção "EXECUTE AS".

    Para maiores informações veja:

    http://msdn.microsoft.com/pt-br/library/ms181362.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    • Marcado como Resposta maumauboy terça-feira, 18 de novembro de 2014 17:00
    terça-feira, 18 de novembro de 2014 11:37
    Moderador
  • Mais uma vez muito obrigado a todos!

    terça-feira, 18 de novembro de 2014 17:00