/*================================================================================== Curso: SQL SERVER 2019 https://www.udemy.com/course/draft/3957796/?referralCode=FB10D369E786D9FE8A48 Instrutor: Sandro Servino https://www.linkedin.com/in/sandroservino/?originalSubdomain=pt https://filiado.wixsite.com/sandroservino ==================================================================================*/ /*================================================================================== ATIVIDADES ROTINEIRAS BÁSICAS DO DBA Linked Server e OpenQuery - Linked Server é uma funcionalidade do SQL que possibilita o estabelececimento de conexöes entre dois ou mais servidores, possibilitando inclusao, alterecao, joins, consulta, delecao e execucao de stored procedures. Pode ser realizado entre instancias sql server e outras fontes OLE DB, como Excel, Access, Oracle, Mysql, Sybase, ... https://docs.microsoft.com/en-us/sql/relational-databases/linked-servers/linked-servers-database-engine?view=sql-server-ver15 - Deve ser configurado com os devidos cuidados devido segurança. Para aumentar o nivel de segurança sempre tente configurar um linked server por banco de dados e defina explicitamente cada usuário para mapear para um usuário autenticado SQL criado especificamente que só tem acesso a um único banco de dados com as permissões corretas. O que pode ter neste sentido um aumento da gestáo porque tera varios linked servers, cada um para um banco de dados especifico mapeando o usuario de banco de dados especifico. Nao utilize o remote user sa ou algum remote user com privilegio de sysdamin no linked server porque localmente poderá fazer qualquer operacao em qualquer base de dados no servidor remoto, entao se um servidor local for atacado, podera realizar qualquer operacao em outro servidor destino. - Deve ser evitar trafego de um grande volume de dados porque não tem uma excelente performance. Se for executar trabalho de importacao de uma grande qt de dados, melhor usar pacotes de SSIS com opacao Fast Bulk Load. - Por padrão, quando você executa uma consulta distribuída usando um LINKED SERVER, a consulta é processada localmente. Isso pode ou não ser eficiente, dependendo de quantos dados devem ser enviados do servidor remoto para o servidor local para processamento. - Mesmo que você tenha uma cláusula WHERE em sua consulta distribuída para filtrar os resultados, o SQL Server pode apenas enviar a SELECT * e, em seguida, localmente filtrará os dados necessários. Por outro lado, usando OPENQUERY, envia a consulta completa para o servidor remoto e o os recursos do servidor remoto são gastos no processamento da consulta, na geração de um plano e na filtragem das linhas. Em seguida, o conjunto de resultados filtrado é enviado de volta ao servidor de origem e os resultados são exibidos. -- FORMAS DE SELECIONAR DADOS -- tabela local SELECT * FROM [Database_Name].[Schema_Name].[Table_Name] -- tabela remota, acessando o linked server com a forma padrao, menos performatica. SELECT * FROM [Linked_Server_Name].[Database_Name].[Schema_Name].[Table_Name] -- tabela remota, acessando o linked server via OPENQUERY, maisnperformatica. SELECT * FROM OPENQUERY(linkedservername,'SELECT * FROM [Database_Name].[Schema_Name].[Table_Name]') SELECT * FROM OPENQUERY(linkedservername,'SELECT * FROM [Database_Name].[Schema_Name].[Table_Name] WHERE table_name.name = ''NewTitle''') ==================================================================================*/ -- VAMOS AO LABORATORIO -- Criar linked server pelo SSMS na instancia DBSRV1\FILIAL, conectando a instancia DBSRV1 -- Executar querie local na instancia DBSRV1\FILIAL set statistics io on set statistics time on DBCC DROPCLEANBUFFERS -- limpar os dados do cach DBCC FREESYSTEMCACHE ( 'ALL' ) select * from DBSRV1.BASETESTEALERTS.dbo.TBDADOSALERTS go DBCC DROPCLEANBUFFERS -- limpar os dados do cach DBCC FREESYSTEMCACHE ( 'ALL' ) select * from DBSRV1.BASETESTEALERTS.dbo.TBDADOSALERTS where descricao like 'REGISTRO> 101%' GO -- agora vamos rodar operacoes com OPENQUERY e ver o tempo em ms DBCC DROPCLEANBUFFERS -- limpar os dados do cach DBCC FREESYSTEMCACHE ( 'ALL' ) select * from OPENQUERY (DBSRV1, 'select * from BASETESTEALERTS.dbo.TBDADOSALERTS') go DBCC DROPCLEANBUFFERS -- limpar os dados do cach DBCC FREESYSTEMCACHE ( 'ALL' ) -- agora vaos rodar operacoes com OPENQUERY select * from OPENQUERY (DBSRV1, 'select * from BASETESTEALERTS.dbo.TBDADOSALERTS where descricao like ''REGISTRO> 101%''') -- Vamor inserir alguns dados na tabela insert into DBSRV1.BASETESTEALERTS.dbo.TBDADOSALERTS (descricao) values ('teste') go insert OPENQUERY (DBSRV1, 'SELECT descricao FROM TBDADOSALERTS') values('TESTE2'); -- para ver outros exemplo inclusive com oracle https://docs.microsoft.com/en-us/sql/t-sql/functions/openquery-transact-sql?view=sql-server-ver15 -- ver outra fonte interessante https://sqlsolutionsgroup.com/linked-server-security/