Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Introdução aos sinônimos no SQL Server


Um sinônimo no SQL Server são objetos de banco de dados que dão um nome alternativo aos objetos de banco de dados existentes localmente ou no servidor remoto. Além disso, eles fornecem uma camada de abstração para proteger o aplicativo de quaisquer alterações no objeto base.

Em scripts T-SQL, usamos nomes de 3 partes para referenciar objetos de banco de dados. O formato é:

[Banco de dados].[Esquema].[Objeto]

Por exemplo, suponha que temos a seguinte infraestrutura de banco de dados:
  • Nome do banco de dados:[Azuredemodatabase]
  • Esquema:[VendasLT]
  • Objeto(nome da tabela):Produto

A instrução SELECT com o nome de 3 partes é a seguinte:
SELECT  [ProductID]
      ,[Name]
      ,[ProductNumber]
      ,[Color]
      ,[StandardCost]
      ,[ListPrice]
      ,[Size]
      ,[Weight]
      ,[ProductCategoryID]
      ,[ProductModelID]
      ,[SellStartDate]
      ,[SellEndDate]
      ,[DiscontinuedDate]
      ,[ThumbNailPhoto]
      ,[ThumbnailPhotoFileName]
      ,[rowguid]
      ,[ModifiedDate]
  FROM [Azuredemodatabase].[SalesLT].[Product]

Da mesma forma, um servidor remoto usa a convenção de nomenclatura de 4 partes. A parte adicional é [nome do servidor remoto]. Assim, o formato será

[Nome do servidor].[Banco de dados].[Esquema].[Objeto].

Vamos imaginar que você precise renomear o [SalesLT].[Product] tabela para [ProductData] .

Essa tabela é referenciada em vários procedimentos armazenados, funções e exibições. Portanto, você precisa modificar todas essas referências em consultas ou aplicativos cliente para usar o nome mais recente da tabela.

Você pode criar um Sinônimo referenciando o objeto de banco de dados e usá-lo em suas consultas SQL. Caso ocorra alguma alteração, você só precisa recriar a definição de Sinônimo. Você não precisará alterar nenhuma referência de objeto nas consultas porque estamos usando Synonym.

Em um caso diferente, criamos um sinônimo que aponta para a tabela [Azuredemodatabase].[SalesLT].[Product]. Em seguida, descartamos a tabela e criamos uma visualização com um nome semelhante. Nesse caso, um Sinônimo fará referência automaticamente à exibição porque a vinculação de objeto ocorre com o nome do objeto.

Se você mover um objeto para um banco de dados diferente, o Sinônimo o ajudará a minimizar os esforços ao fazer alterações. Depois de recriar o Sinônimo, todas as consultas SQL obtêm automaticamente a localização do objeto mais recente.

Você também pode usar Sinônimos para ocultar os nomes dos objetos do banco de dados. Os usuários podem consultar Sinônimos para recuperar resultados em vez de consultar a tabela base.

Você pode definir um sinônimo no SQL Server para os seguintes objetos:
  • Tabela definida pelo usuário
  • Procedimento armazenado
  • Visualizar
  • Funções escalares e com valor de tabela em linha
  • Tabelas temporárias locais e globais
  • procedimento armazenado CLR, funções (valor de tabela, agregado, escalar)

Observação:o nome do sinônimo deve ser exclusivo em um banco de dados.

Onde usar sinônimos no SQL Server


Podemos usar sinônimos na instrução T-SQL, como Selecionar, Atualizar, Executar, Inserir, Excluir e subconsultas.

No entanto, não podemos usar sinônimos em instruções de linguagem de definição de dados (DDL) como Criar e Alterar. Além disso, os sinônimos não são adequados para restrições de verificação, colunas computadas, expressões padrão, expressões de regra, visualizações vinculadas ao esquema e funções.

Criar um sinônimo no SQL Server no servidor local


Para criar Sinônimos no SQL Server, usamos a instrução CREATE SYNONYM. A sintaxe é a seguinte:
CREATE SYNONYM <synonym_name, sysname, sample_synonym>
  FOR <schema_name, sysname, Production>.<object_name, sysname, Product>
GO

Por exemplo, vamos criar o sinônimo [MyProductCatalog] para [Azuredemodatabase].[SalesLT].[Produto] .
CREATE SYNONYM MyProductCatalog FOR [Azuredemodatabase].[SalesLT].[Product]

Uma vez criado, você pode substituir o nome da tabela pelo Sinônimo conforme mostrado abaixo. Ele referencia internamente a tabela base que referenciamos na instrução CREATE SYNONYM.
SELECT  [ProductID]
      ,[Name]
      ,[ProductNumber]
      ,[Color]
      ,[StandardCost]
      ,[ListPrice]
      ,[Size]
      ,[Weight]
      ,[ProductCategoryID]
      ,[ProductModelID]
      ,[SellStartDate]
      ,[SellEndDate]
      ,[DiscontinuedDate]
      ,[ThumbNailPhoto]
      ,[ThumbnailPhotoFileName]
      ,[rowguid]
      ,[ModifiedDate]
  FROM MyProductCatalog

Criar um sinônimo em um banco de dados no servidor remoto


Suponha que o objeto exista em um servidor remoto [ABC]. Você pode criar um Sinônimo para evitar especificar um nome de 4 partes nas consultas. Na consulta abaixo, o objeto base está no [MyRemoteServer]:
EXEC sp_addlinkedserver MyRemoteServer;
GO  
USE tempdb;  
GO  
CREATE SYNONYM MyProductCatalog FOR MyRemoteServer.[Azuredemodatabase].[SalesLT].[Product]
GO

Criando um sinônimo com o SQL Server Management Studio


Para criar Sinônimos, podemos usar a GUI do SQL Server Management Studio.
  • Conecte-se à sua instância SQL, expanda o banco de dados e navegue até a pasta Sinônimos.
  • Clique com o botão direito do mouse e escolha Novo sinônimo.
  • Insira os detalhes necessários para o nome do sinônimo, esquema do sinônimo, nome do banco de dados, esquema do objeto, tipo do objeto e nome.

Em nosso exemplo, criamos um Sinônimo no esquema [HumanResources], o mesmo do esquema da tabela:

Clique em Script para obter um script T-SQL equivalente como abaixo:
USE [AdventureWorks2017]
GO
CREATE SYNONYM [HumanResources].[MyEmpData] FOR 
[AdventureWorks2017].[HumanResources].[Employee]
GO

Sinônimo para funções definidas pelo usuário


Primeiro, crie o UDF dbo.TestSynonym usando o script abaixo:
CREATE FUNCTION dbo.TestSynonyn (@ID int)  
RETURNS int  
AS  
BEGIN  
IF @ID < 0  
BEGIN  
    SET @ID=100
END  
RETURN(@ID);  
END;  
GO

Em seguida, crie um sinônimo para ele com o nome dbo.UDFTest . Você pode chamar a UDF usando o Sinônimo e recuperar os resultados da consulta:
CREATE SYNONYM dbo.UDFTest FOR dbo.TestSynonyn;  
GO  
Declare @ID INT=-10
Select @ID as OrigninalValue, dbo.UDFTest(@ID) as modifiedValue

Atualizar declaração e sinônimo


Suponha que você queira atualizar um valor na tabela SQL. Se você definiu um sinônimo nele, você também pode utilizá-lo. Por exemplo, a instrução de atualização abaixo usa Sinônimo [Perofmancetest] no lugar do nome da tabela SQL:
Update performancetest set [Name]='Updated New value' where ID=1

Eliminando um sinônimo


Você pode usar a instrução DROP SYNONYM para eliminar um sinônimo específico no banco de dados. A consulta abaixo elimina [EmpData ] na AdventureWorks2017 base de dados:
Use AdventureWorks2017
Drop Synonym EmpData

Obtendo a lista de sinônimos de banco de dados no SQL Server


Suponha que você queira conhecer sinônimos existentes em um banco de dados junto com seu objeto base. Você pode consultar o sys.synonyms visualização do catálogo do sistema no respectivo banco de dados:
SELECT 
    name, 
    base_object_name, 
    type
FROM 
    sys.synonyms

Na saída da consulta, você obtém as seguintes informações:
  • Nome do sinônimo
  • O objeto base (nome do objeto de 3 ou 4 partes)
  • Tipo de objeto (SN =Sinônimo)

E se modificarmos o objeto base do sinônimo?


Vamos considerar o impacto de modificar o objeto base de um sinônimo. Temos uma consulta para realizar várias tarefas:
  • Crie um sinônimo (o nome do sinônimo é [dbo].[EmpData] para o objeto base [AdventureWorks2017].[DBO].[Emp] )
  • Solte o objeto base (tabela) [AdventureWorks2017].[DBO].[Emp]
  • Crie uma visualização com o nome [DBO].[Emp] no banco de dados [AdventureWorks2017].
USE [AdventureWorks2017]
GO
CREATE SYNONYM [dbo].[EmpData] FOR [AdventureWorks2017].[DBO].[Emp]
GO
Drop table [AdventureWorks2017].[DBO].[Emp]
Go
Create view [DBO].[Emp]
as 
Select * from dbo.Employee
go

Como mencionado anteriormente, o Sinônimo vincula um objeto usando seu nome. Assim, ele deve apontar para a visão em vez da tabela. Nesse caso, a tabela [dbo].[Emp] não existe.

Conforme mostrado abaixo, é uma visualização no [AdventureWorks2017] base de dados.

Como alternativa, você pode usar OBJECTPROPERTYEX() para verificar o tipo de base do objeto do sinônimo:
SELECT OBJECTPROPERTYEX(OBJECT_ID('Emp'), 'BaseType') AS BaseType;  
GO

Aqui, o tipo Base faz referência à visualização do banco de dados. No caso da tabela SQL, você obtém U na saída.

Os sinônimos afetam negativamente o desempenho da consulta?


Muitos profissionais de banco de dados preferem não usar sinônimos no SQL Server. O ponto deles é que o SQL Server precisa executar uma etapa adicional na resolução da tabela base do Synonym. Assim, pode produzir um efeito negativo.

Vamos testar o desempenho da consulta. Recuperamos registros do nome da tabela e do Sinônimo:
Create table TestTable
(
    ID int,
    [Name] varchar(20)
)
Insert into TestTable values (1, 'Temporary Data')
GO 10000

Create synonym performancetest for TestTable
SET STATISTICS IO ON;
Select * from TestTable 
Go
Select * from performancetest

Primeiro, vamos verificar o plano de execução real. Ambos os lotes de consulta têm o mesmo plano de execução e custos do operador:

Da mesma forma, ambas as consultas têm 41 leituras lógicas e uma contagem de varredura para recuperar a saída desejada.

O SQL Server resolve os nomes de objeto base de sinônimos na fase de ligação da execução da consulta. Isso acontece antes da fase de otimização de consulta. Portanto, você vê um plano de execução semelhante e nenhum impacto no desempenho. Conseqüentemente, você pode usar sinônimos para evitar nomes longos de 3 ou 4 partes para objetos acessados ​​com frequência. Não afeta o desempenho da consulta.

Isso não significa que você cria um Sinônimo para cada objeto, como uma tabela, procedimento armazenado, funções, visualizações. Você pode usá-los para objetos acessados ​​com mais frequência para fazer referência rápida a eles em consultas.

Conclusão


Sinônimos no SQL Server podem ser benéficos. Eles simplificam os nomes dos objetos do banco de dados evitando nomes longos de 3 ou 4 partes. Você pode usá-los para referenciar objetos locais e remotos. Não produz quaisquer problemas de desempenho. Portanto, você pode explorar o uso deles para flexibilidade ao escrever consultas. No entanto, o melhor de tudo é definir sinônimos apenas para os objetos usados ​​com frequência em scripts SQL.