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

7 fatos sobre os sinônimos do SQL Server que você deve saber


Antes do aparecimento do SQL Server Synonyms, todos desejavam simplificar e aprimorar sua experiência com o banco de dados.

Imagine que você tenha um aplicativo com um banco de dados que faz referência a outro banco de dados do mesmo servidor. Então, uma grande reorganização força sua equipe a transferir o outro banco de dados para outro servidor.

Não há dúvida de que seu aplicativo vai quebrar. Mas o que você vai fazer nesse caso? Vincular os 2 servidores e codificar todas as referências (novamente) para apontar para o novo servidor?

Você pode fazer isso se quiser e esquecer se tiver apenas algumas ou uma dúzia de referências a ele. Mas se ocorrer outra transferência ou renomeação, você terá que repetir o mesmo pesadelo.

No entanto, há uma maneira melhor de lidar com isso.

Apresentando os sinônimos do SQL Server


Antes de nos aprofundarmos no que você pode fazer com os sinônimos do SQL Server, vamos descrever o que eles são.

Um sinônimo em qualquer idioma falado e escrito refere-se a uma palavra ou frase que tem o mesmo significado que outra palavra ou frase. Então, a palavra lindo é o sinônimo de linda e atraente .

Semelhante ao que sabemos sobre sinônimos de palavras e frases, os Sinônimos do SQL Server referem-se a um nome alternativo de um objeto de banco de dados que reside em um servidor local ou remoto. Leia mais aqui.

Como você verá nos fatos a seguir, o SQL Server Synonyms pode facilitar muito a manutenção do seu aplicativo.

Então vamos começar!

1. Os sinônimos do SQL Server podem simplificar seu trabalho quando os objetos base são transferidos ou renomeados


Em primeiro lugar, eles o salvarão do problema de alterações de código quando um banco de dados for movido para outro servidor ou renomeado por qualquer motivo. Vamos nos referir ao cenário que mencionamos na abertura deste post.

Uma grande reorganização força sua equipe a alterar uma referência para todos os objetos em mydatabase2 em prodserver2.mydatabase2.

Então, você consulta sys.sql_modules com todas as ocorrências de mydatabase2 de mydatabase1 .
USE mydatabase1
GO
SELECT
 b.name
,a.definition
,b.type_desc
FROM sys.sql_modules a
INNER JOIN sys.all_objects b on a.object_id = b.object_id
WHERE a.definition like '%mydatabase2%'
GO

Agora, a saída do script acima listará todos os objetos com referências a mydatabase2 . Legal, hein? E isso ajudará a definir o escopo do trabalho que deve ser feito.

Mas isso é só o começo. Você também precisa verificar se há código em seu aplicativo cliente ou qualquer outro código que faça referência ao mesmo fora do banco de dados.

A quantidade de código afetada mostra o tamanho do seu novo problema.

Agora, aqui estão mais alguns detalhes sobre o que está acontecendo nesse script:
  • sys.sql_modules incluem objetos SQL que são módulos definidos por SQL, como exibições, procedimentos armazenados, funções etc.
  • O nome coluna é onde está o nome do objeto.
  • O código SQL do objeto está na definição coluna de sys.sql_modules .
  • sys.all_objects inclua todos os objetos em seu banco de dados, como tabelas, visualizações, etc.
  • Pegamos o type_desc coluna para determinar que tipo de objeto é (visualização, procedimento armazenado, etc.)
  • O onde cláusula filtra a consulta de qualquer código SQL que inclua uma referência a mydatabase2 .
  • Para ter um resultado satisfatório usando o script acima, você precisa ter permissão para todos os objetos. Verifique com seu administrador de banco de dados ou alguém com uma função semelhante para isso. Você também pode verificar isso.

Agora que você sabe como obter o escopo do seu trabalho, é hora de corrigi-lo.

Como corrigir essa confusão de código para que não aconteça novamente


Tudo bem. Eu tenho uma confissão a fazer.

O uso de sinônimos do SQL Server apenas reduzirá seus problemas ao mínimo, mas não os eliminará.

Agora que está fora do caminho, aqui está a boa notícia:se você tem 10 referências a um objeto remoto antes de usar sinônimos, você modifica todas as 10. Mas uma vez que você começa a usar um sinônimo para aquele objeto remoto, em vez de modificar 10 ocorrências, você só muda 1. Nada mais.

Agora, aqui estão as etapas para corrigir isso usando sinônimos:
  1. Crie um sinônimo para cada um dos objetos remotos. Então, em vez de prodserver2.mydatabase2.schema1.object1 você pode se referir a ele usando o sinônimo.
  2. Modifique as referências a cada objeto em seu sinônimo.

Mais tarde, você descobrirá os detalhes de como fazer isso.

A lição:


Sinônimos fornecem uma camada de abstração para proteger referências a objetos base de qualquer parte do seu código, seja dentro do banco de dados, aplicativo cliente ou em qualquer outro lugar. Assim, você pode se alegrar quando ocorrer outra alteração, seja uma transferência de objeto ou uma renomeação.

2. Você pode criar sinônimos do SQL Server para a maioria dos objetos


Em seguida, vamos descobrir quais objetos podem ter sinônimos?
  • Tabelas
  • Visualizações
  • Procedimentos armazenados
  • Funções

Agora que você conhece os tipos de objetos, pode ter uma ideia do que pode fazer com sinônimos. Vamos ser mais específicos.

3. Você pode emitir comandos apropriados para o sinônimo de objeto


Em terceiro lugar, aqui estão alguns comandos específicos para cada tipo de objeto.

Tabelas


Tanto quanto você pode fazer um SELECT, INSERT, UPDATE e DELETE em uma tabela, você pode fazer o mesmo com seu sinônimo.

Assim, em vez de:
SELECT * FROM prodserver2.mydatabase2.schema1.table1

Você pode ter uma versão mais curta que será resistente à próxima mudança:
SELECT * FROM synonym1

Como este é o caso, você também pode fazer isso:
UPDATE synonym1
SET column1 = <value>

E o mesmo vale para INSERT e DELETE.

No entanto, esteja ciente do seguinte:
  • Inserir um novo registro por meio de um sinônimo adicionará um novo registro à tabela base. No nosso caso, prodserver2.mydatabase2.schema1.table1 .
  • Atualizar e excluir terão o mesmo efeito.

Até agora, mostramos apenas comandos DML. Que tal comandos DDL como DROP?

Infelizmente, você não pode realizá-los. Aqui está o motivo:

A eliminação de um sinônimo não eliminará a tabela base. Ele irá descartar o sinônimo. Entrarei em detalhes sobre isso em um momento.

Mas aqui está mais uma coisa que você pode fazer para SQL Server Sinônimos de tabelas:JOINs.

Quão conveniente isso pode ser? Em vez de emitir isso:
SELECT
 a.column1
,b.column1
FROM table3 a
INNER JOIN prodserver2.mydatabase2.schema1.table1 b on a.id = b.id

Você pode realizar isso:
SELECT
 a.column1
,b.column1
FROM table3 a
INNER JOIN synonym1 b on a.id = b.id

Isso é mais simples? Coisa certa!

Procedimentos armazenados


Um comando relevante que você pode fazer com um sinônimo de um procedimento armazenado é EXEC.

Então, em vez de invocar um procedimento remoto como este:
EXEC prodserver2.mydatabase2.schema1.spProcedure1

Você pode criar um sinônimo para o procedimento acima. Vamos chamá-lo de synProcedure1 . E invoque assim:
EXEC synProcedure1

Devemos continuar? Você pode fazer o mesmo com VIEWs e FUNCTIONs. Claro, se você tiver as permissões necessárias. Mas primeiro, vamos discutir como criar sinônimos do SQL Server.

4. Você pode iniciar sua busca com sinônimos do SQL Server com CREATE


Chegamos ao ponto de como você pode criar sinônimos. Veja como podemos fazer isso usando T-SQL para uma tabela:
CREATE SYNONYM synonym1 FOR prodserver2.mydatabase2.schema1.table1

Mas fique atento a esta ressalva:

Verificando a existência e permissão para mydatabase2.schema1.table1 em prodserver2 é adiado até o tempo de execução.

Isso significa que você não saberá se:
  • os 2 servidores (prodserver1 e prodserver2 ) já estão vinculados.
  • o banco de dados mydatabase2 , o esquema esquema1 , e a tabela table1 realmente existem.
  • seu acesso a esses recursos é permitido.

Portanto, depois de criar o sinônimo, teste-o executando os comandos que você espera que funcionem.

E com procedimentos armazenados, exibições e funções, você deve agir da mesma maneira.

Mas isso não é tudo. Se pudermos criar um sinônimo, podemos excluí-lo também usando:
DROP SYNONYM synonym1

E aqui está outra advertência:como você pode descartar sinônimos a qualquer momento, as referências a sinônimos descartados serão verificadas apenas em tempo de execução.

Portanto, antes de descartar um sinônimo, verifique sys.sql_modules para se houver alguma referência a ele.

Usando o SQL Server Management Studio (SSMS) para criar e eliminar sinônimos


Até agora, usamos T-SQL para criar e descartar sinônimos do SQL Server. Você pode preferir usar uma interface gráfica ao fazer o mesmo.

Vamos fazer a bola rolar.

Criando sinônimos


Se você não gosta de digitar os comandos, aqui estão os passos a seguir quando se trata de criar sinônimos:
  1. Execute o SSMS e faça login no SQL Server.
  2. Procure o banco de dados em que deseja criar um sinônimo.
  3. Expandir.
  4. Clique com o botão direito do mouse em Sinônimos pasta e selecione Novo Sinônimo .
  5. Preencha o formulário com as informações necessárias para sinônimos, incluindo nome, esquema etc.
  6. Clique em OK .

Abaixo está uma captura de tela do formulário no SSMS:

Eliminando sinônimos


Falando em preferências, digitar os comandos para criar sinônimos é o meu tipo de coisa. Mas soltá-los à vontade é mais simples do que digitar os comandos. Claro, isso é apenas o meu gosto. De qualquer forma, abaixo estão os passos a seguir ao descartar um sinônimo:
  1. Execute o SSMS e faça login no SQL Server.
  2. Procure o banco de dados onde reside o sinônimo que você deseja eliminar.
  3. Expandir.
  4. Expandir os Sinônimos pasta.
  5. Procure o sinônimo que deseja eliminar.
  6. Clique com o botão direito do mouse no sinônimo que deseja remover e selecione Excluir .
  7. Clique em OK .

Para resumir as etapas acima, basta clicar com o botão direito do mouse no sinônimo a ser descartado e selecionar Excluir e, finalmente, clique em OK .

Abaixo está uma captura de tela da janela que aparecerá antes de confirmar a exclusão:

5. Você pode proteger os sinônimos do SQL Server


Usando GRANT, DENY ou REVOKE, você pode controlar o acesso a um sinônimo.

Para GRANT uma permissão SELECT ao sinônimo synonym1 para um usuário chamado testuser , você faz o seguinte:
GRANT SELECT ON synonym1 to testuser

Outras permissões que você pode adicionar ou remover de um sinônimo são as seguintes:
  • CONTROLE
  • EXECUTAR
  • ATUALIZAÇÃO
  • INSERIR
  • EXCLUIR
  • VER DEFINIÇÃO
  • TOMAR PROPRIEDADE

6. Não consegue encontrar essa tabela, visualização ou procedimento? Pode ser um sinônimo


Um dos problemas que um novato em sua equipe pode enfrentar é uma tabela, visualização, procedimento ou função “ausente”. Claro, se SELECT for emitido em um objeto, pode ser uma tabela ou visualização. Mas ele não consegue encontrá-lo na lista de tabelas ou na lista de visualizações. E se ele não usou Sinônimos do SQL Server antes, isso é um problema adicional.

A falta de orientação, uma lacuna na documentação ou uma lacuna em seus padrões podem ser colocados em ordem. Aqui está um script bacana que o ajudará a apresentar a lista de sinônimos e seu objeto base para seu novo membro da equipe:
SELECT
 a.[name]
,a.[base_object_name]
,OBJECTPROPERTYEX(OBJECT_ID(a.[name]), 'BaseType') as BaseType
,b.type_desc
FROM sys.synonyms a
INNER JOIN (SELECT DISTINCT type, type_desc from sys.all_objects) b on 
           CONVERT(varchar(2),OBJECTPROPERTYEX(OBJECT_ID(a.[name]), 'BaseType')) = b.type

Um objeto “desaparecido”? Não mais se for um sinônimo.

Mas antes que você se empolgue executando este script, aqui estão mais algumas coisas que você deve levar em consideração:
  • sys.synonyms é onde todos os sinônimos do SQL Server são definidos no banco de dados atual.
  • Pegamos os tipos e descrições de tipo (tipo e type_desc respectivamente) em sys.all_objects . Se você tiver uma ideia melhor além de juntá-los com uma subconsulta, avise-me.
  • OBJECTPROPERTYEX é usado para obter o tipo do objeto base se for uma tabela, procedimento armazenado ou outro.
  • Finalmente, se você não tiver a permissão mínima necessária para executar este script e obter a saída desejada, é hora de fazer amizade com seu DBA ou alguém com uma função semelhante:)

Mas você pode estar se perguntando, por que fazer tudo isso se não funcionar bem?

7. Os sinônimos do SQL Server afetarão o desempenho?


Esta é uma preocupação comum. E para detalhar o que está acontecendo nos bastidores, vamos dar uma olhada no resumo do que acontecerá no plano de execução:
  1. Ao executar o código mais simples com um sinônimo (por exemplo, SELECT * do sinônimo1), o SQL Server entrará em uma fase de vinculação em que o objeto base substituirá o sinônimo.
  2. Em seguida, seja qual for o melhor plano de otimização existente para executar um comando para o objeto base, ele será o mesmo.

Aqui estão algumas perguntas e respostas sobre as 2 afirmações acima:
  1. Por quanto tempo o SQL Server faz a fase de vinculação? RESPOSTA:Não demora muito. Geralmente acontece em um piscar de olhos.
  2. Se a próxima etapa usar o mesmo melhor plano de otimização com o objeto base e a consulta ao objeto base for “rápida o suficiente”, ela será mais lenta? RESPOSTA:Não, porque usará o mesmo plano de execução.
  3. E a autenticação do novo servidor? RESPOSTA:Se houver alguns pequenos atrasos causados ​​pela transferência de um banco de dados para um novo servidor, eles não são causados ​​pelo sinônimo. Desempenho de consulta ao chamá-lo usando um sinônimo ou codificar o server.database.schema.object deve ser o mesmo porque o sinônimo é apenas um nome alternativo para o objeto base. Resolva o desempenho lento do objeto base.

Mas não acredite na minha palavra. Você deve verificar por si mesmo com seu plano de execução de consulta e desempenho real.

Conclusão


Em suma, cobrimos praticamente informações sobre sinônimos do SQL Server, então vamos recapitular.

Em primeiro lugar, um sinônimo é simplesmente um nome alternativo que o salvará de alterações e transferências de nomes de objetos. Em segundo lugar, bons candidatos para sinônimos são tabelas, visualizações, procedimentos armazenados e funções. Em seguida, você pode executar comandos apropriados para seu objeto base a partir de um sinônimo. Você também pode protegê-lo. Então, se você precisar ver a lista de sinônimos, terá sys.synonyms para ajudá-lo. Finalmente, o desempenho não deve ser um grande problema se não houver problemas de desempenho com o objeto base.

Então, por que não experimentá-lo hoje?

O que você acha? Deixe-nos saber nos comentários.