none
Listar todas as bases do SQL Server

    Question

  • Pessoal,

     

    Estou documentando um ambiente e em meio aos processos surgiu a necessidade de listar todos os bancos do servidor SQL server. Queria fazer isto, obtendo a informação do último dia em que a database foi acesada. Como posso fazer isto?

     

    Grato.

    Thursday, January 08, 2009 12:16 PM

Answers

  • Olá,

     

    No SQL 2000 faça assim:

    Code Snippet
    select * from master..sysdatabases

     

     

     

    Um abraço,

    Raul Santos Neto

     

    Thursday, January 08, 2009 1:05 PM

All replies

  • acho que a tabela sys.databases pode te ajudar

    Code Snippet

    Select * From sys.databases


    Thursday, January 08, 2009 12:34 PM
  • Anderson,

     

    Eu também pensei na sys.sysdatabases, mas ela não retorna a data de último acesso!!!

    Thursday, January 08, 2009 12:41 PM
  •  Anderson E. A. Rodrigues wrote:
    acho que a tabela sys.databases pode te ajudar

    Code Snippet

    Select * From sys.databases


     

    Em cima de qual database devo executar esta query?

     

    Executei em cima do Master e deu este erro aqui.

    Msg 208, Level 16, State 1, Line 1

    Invalid object name 'sys.databases'.

    Thursday, January 08, 2009 12:46 PM
  • Artur,

     

    Esta system table fica armazenada dentro do banco Master.

     

    Qual é a versão do seu SQL Server?

    Thursday, January 08, 2009 12:48 PM
  • Versão 2000. 8.0.2050

    Thursday, January 08, 2009 12:53 PM
  • Artur,

     

         Neste caso a procedure sp_databases não resolveria o problema?

      

         http://msdn.microsoft.com/en-us/library/aa259636(SQL.80).aspx

     

     

        [ ]'s

     

        Laércio.


    Ajude a melhorar o nosso Fórum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

     

     

    Thursday, January 08, 2009 1:04 PM
  • Olá,

     

    No SQL 2000 faça assim:

    Code Snippet
    select * from master..sysdatabases

     

     

     

    Um abraço,

    Raul Santos Neto

     

    Thursday, January 08, 2009 1:05 PM
  • cara, dá uma olhada nesse tópico, pode ser que te ajude...

    Thursday, January 08, 2009 1:15 PM
  • Olá Artur,

     

    O SQL Server 2000 guarda a relação de todos os bancos de dados em uma tabela chamada sysdatabases no banco de dados MASTER conforme foi falado. No SQL Server 2005 há uma View chamada sys.databases que também tem essa lista e pode ser acessada de qualquer banco.

     

    É possível acessar também com a sp_databases, mas é preciso uma certa cautela, pois, o conteúdo dessa sp pode variar e para ver a lista completa é preciso ter alguns privilégios (que eu acredito que você tenha, pois, deve estar com privilégios de sysadmin). Se você não for sysadmin ou dbcreator e utilizar a sp_databases poderá obter uma lista restrita às bases que você tem acesso.

     

    Os mecanismos de consulta já foram citados. Não há como (de forma confiável) efetuar uma consulta e saber a data do último acesso ao banco de dados. O SQL Server 2000 não loga essa informação e embora existam caminhos alternativos via query, nenhum deles é 100% confiável. Isso só poderá ser obtido de forma certa com o uso do Profiler, auditoria C2, ou ferramentas de terceiros.

     

    [ ]s,

     

    Gustavo

    http://gustavomaiaaguiar.spaces.live.com

    Thursday, January 08, 2009 1:21 PM
  • Gustavo, existe uma forma de conseguir isso via query? mesmo que não seja confiável, você tem como nos mostrar? é bastante interessante.
    Thursday, January 08, 2009 1:27 PM
  • Oi Anderson,

     

    É possível, mas é um pouco trabalhoso. Não tenho o script em mãos, mas descreverei o caminho das pedras (até o fim da semana posto uma thread completa sobre isso).

     

    O SQL Server 2000 e demais possui uma procedure chamada sp_autostats. Essa sp demonstra o comportamento de estatísticas de uma tabela e também a data da última atualização de estatísticas. Se executarmos essa procedure contra cada tabela do banco de dados, saberemos quando foi a última atualização de cada estatística de cada índice da tabela.

     

    À medida que novos dados são manipulados, as estatísticas são atualizadas e o retorno da procedure vai sendo alterado. Como normalmente os bancos de dados tem as opções auto_create_statistics on e auto_update_statistics on também, podemos dizer que manipulações de dados irão provocar uma atualização de estatísticas nas tabelas e nos índices.

     

    Se a sp_auto_stats é capaz de nos mostrar a data de atualização da estatística de cada índice de cada tabela, podemos afirmar que o índice que foi atualizado por último representará a última atualização de estatística realizada no banco de dados. Se a estatística é atualizada conforme manipulações de dados, há uma certa relação entra a última data em que uma estatística foi atualizada e o momento da último acesso ao banco.

     

    Quando digo que não é confiável, é porque o processo de atualização de estatísticas é assíncrono e "semi-automático". O fato de um INSERT ter sido executado não irá provocar uma atualização de estatística imediata e talvez sequer faça diferença nas estatísticas. Mesmo que hajam muitas modificações no banco, leva um tempo entre essas modificações e a atualização das estatísticas e por isso, teríamos condições de obter uma data próxima, mas não a data exata do último acesso. Outro ponto que deixa essa métrica a desejar é que operações de reindexação também irão atualizar as estatísticas (isso se não for executado um UPDATE STATISTICS) e aí não saberemos se o último acesso foi de negócio ou de rotinas de administração.

     

    Se der tempo, farei um script para demonstrar e retorno a Thread. Por hora tente executar um sp_autostats contra uma tabela do seu banco, reindexe e veja os resultados.

     

    [ ]s,

     

    Gustavo

    http://gustavomaiaaguiar.spaces.live.com

     

    Thursday, January 08, 2009 1:44 PM
  • Olá amigos, em se tratando do SQL Server 2000, não possuimos muitos recursos para esse caso.

     

    Bem, como alternativa eu criaria um job para iniciar um profile(sp_trace_create) que armazenaria em "TABELA" as informações referentes a conexões. 

    Isso facilitaria bastantes, uma vez que poderiamos estar logando informações sobre as conexões(database utilizado, login, duração, objeto acessado no ultimo acesso, etc..).

     

    Assim, caso exista a necessidade de alguma auditoria, GOOOOL...estaria tudo lá, ou seja, para efeito de auditar a última conexão de um determinado database estaria lá, isso poderia atender. 

     

    Bom, não sei se isso atende a necessidade do nosso amigo Arthur, pois, caso ele queira obter esse tipo de informação pra retroativamente, ou seja, pra trás, pode ser que a solução do Gustavo dê certo, mas, se a necessidade de seja para criar um mecanismo de forneça tal informação, o profile pode ser útil.

     

     

    Arthur e Anderson, caso vcs queiram mais inforrmações sobre como criar um script de profile para criar uma rotina automatizada, procure aqui no forum que deve ter bastante coisa.

    procure por: script profile, template, sp_trace_create

     

    Qualquer dúvida estamos a disposição....

     

    Grande abraço, 

    Saturday, January 10, 2009 10:50 PM
  • Olá,

     

    Se fosse o SQL 2005 ou principalmente o 2008, isso seria muito fácil. No entanto, acredito que a solução do Emanuel seja uma boa.

     

    Abraços

     

     

    Sunday, January 11, 2009 1:17 PM
  • Bom Dia,

     

    A sugestão do Emanuel é boa e certamente confere mais precisão do que a sp_autostats. Só existem duas coisas a serem consideradas. A primeira é que gerar um trace interno poderá provocar impactos no desempenho e a segunda é escolher a localização do arquivo de trace. O ponto é analisar se o custo da informação realmente vale a pena.

     

    O livro Inside SQL Server 2005 - Query Tuning and Optimization tem um capítulo dedicado à traces. Embora seja um livro de 2005, as considerações são válidas. Nele é demonstrado como criar traces em backupground sem depender do SQL Server Profiler.

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

     

    Sunday, January 11, 2009 1:35 PM