AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 57423
Accepted
John
John
Asked: 2014-01-24 12:45:45 +0800 CST2014-01-24 12:45:45 +0800 CST 2014-01-24 12:45:45 +0800 CST

Puxando dados de tabelas idênticas em bancos de dados diferentes

  • 772

Estou lidando com uma situação no SQL Server 2008 em que cada cliente é configurado como seu próprio banco de dados, com cada banco de dados tendo estruturas de tabelas idênticas.

Eu tenho uma consulta que seleciona cerca de 20 tabelas diferentes em um banco de dados e insere os registros em um banco de dados de relatórios. O que gostaríamos de fazer é repetir esse processo para cada banco de dados, de modo que todas as informações de relatórios em todos os bancos de dados de clientes estejam contidas em um banco de dados de relatórios consolidado.

A maneira "fácil" seria apenas copiar/colar o código e localizar/substituir todos os nomes do banco de dados para que o script seja executado em todos os clientes. Existe alguma maneira melhor do que isso?

sql-server
  • 2 2 respostas
  • 1661 Views

2 respostas

  • Voted
  1. Best Answer
    Jon Seigel
    2014-01-24T13:22:23+08:002014-01-24T13:22:23+08:00

    Esta resposta pressupõe que você tenha um banco de dados/tabela mestre de clientes e seus nomes de banco de dados associados, ou alguma maneira de descobrir quais bancos de dados em uma determinada instância do SQL Server têm bancos de dados relevantes que você deseja consultar.

    Como isso é para fins de relatório, convém implementar alguma forma de técnica de instantâneo para garantir que os conjuntos de dados sejam consolidados no mesmo ponto no tempo, pelo menos por cliente. Como um bom efeito colateral, essas técnicas geralmente também aliviam os efeitos de bloqueio/bloqueio da execução desses tipos de consultas diretamente nos dados de produção.

    SQL dinâmico puro
    Usando a lista principal, crie uma instrução SQL que use nomes de 3 partes como você está fazendo agora, mas, em vez disso, injete o nome do banco de dados dinamicamente. Não está claro na pergunta em que formato os dados vão acabar, mas parece que você quer UNION ALLtudo junto, o que é facilmente realizado.

    Isso pode ser vantajoso para você agora porque exigirá muito pouco trabalho inicial.

    A desvantagem é que essa abordagem não é muito flexível e rapidamente se torna complicada se você precisar executar a consulta quando as revisões individuais do banco de dados forem diferentes (ou seja, a consulta foi vinculada a uma determinada revisão do banco de dados e, quando uma atualização do banco de dados foi implantada, não teve sucesso para todos os clientes). Também pode haver problemas ou complicações dependendo do modelo de segurança que você está usando para esses bancos de dados.

    Objeto(s) Baseado(s) em Banco de Dados + SQL Dinâmico
    Esta solução cria objetos permanentes dentro de cada banco de dados que você pode consultar em um processo externo. Normalmente, isso significa uma exibição, um procedimento armazenado ou uma função com valor de tabela. O SQL dinâmico será usado para injetar os nomes do banco de dados na consulta como acima, mas desta vez tudo o que é necessário é selecionar ou executar o objeto do banco de dados em vez da consulta bruta diretamente.

    Este método oferece todas as vantagens de proteger seu código por trás de uma interface da mesma forma que faria usando exibições, procedimentos armazenados, etc., no código do aplicativo. Isso também resolve os problemas de segurança com muito mais facilidade.

    A desvantagem, é claro, é que isso requer um pouco mais de trabalho e gerenciamento inicial e que o(s) objeto(s) consultado(s) só pode(m) ser implantado(s) em atualizações de banco de dados, em vez de independentemente.


    Minha opinião pessoal é que a última abordagem é uma solução de longo prazo muito melhor, portanto, nesse tipo de cenário, é por essa que eu optaria. Para tipos ad hoc de consultas, usar a abordagem SQL dinâmica pura é bom.

    • 6
  2. Matt
    2014-01-29T05:32:53+08:002014-01-29T05:32:53+08:00

    Sei que já existe uma resposta aceita, mas para referência futura, uma alternativa é:

    Se o seu script não fizer referência ao nome do banco de dados do cliente (ou seja, é apenas qualificado pelo esquema), o script em lote a seguir permitirá (via sqlcmd) executá-lo em uma lista de bancos de dados no host local sem modificar o script.

    Ele solicitará o nome/caminho do arquivo do script SQL a ser executado e o nome/caminho de um arquivo de texto contendo uma lista de bancos de dados a serem executados (por exemplo, um txt simples com um nome de banco de dados em cada linha).

    Ele registrará a saída retornada pelo SQL Server em um arquivo de log no diretório local.

    @echo off
    set /p sql=SQL file:
    set /P databases=Database list:
    
    for /F %%d in (%databases%) do (
    echo Executing script against %%d
    echo ------------------------------------------------------------ >> %sql%.log
    echo %%d >> %sql%.log
    sqlcmd -h -1 -S localhost -d %%d -i %sql% >> %sql%.log
    echo. >> %sql%.log
    )
    
    pause
    

    Notas Adicionais:

    • O script assume a autenticação do Windows, mas você pode adicionar -U e -P à linha sqlcmd para usar a autenticação do SQL
    • Se você tiver um erro de pipes nomeados, poderá adicionar ,1433 após localhost para forçar o uso de TCP/IP
    • Se você precisar executar em um servidor remoto, poderá alternar localhost com o nome/IP do servidor
    • 2

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve