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

Adicionar um login de servidor vinculado no SQL Server (exemplo T-SQL)


Neste artigo, crio um logon para um servidor vinculado no SQL Server. Nesse caso, uso o Transact-SQL (em vez de usar uma GUI, como o SSMS).

Para criar um login para o servidor vinculado, use o sp_addlinkedsrvlogin procedimento armazenado do sistema.


Sintaxe


A sintaxe fica assim:
sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname'   
     [ , [ @useself = ] { 'TRUE' | 'FALSE' | NULL } ]   
     [ , [ @locallogin = ] 'locallogin' ]   
     [ , [ @rmtuser = ] 'rmtuser' ]   
     [ , [ @rmtpassword = ] 'rmtpassword' ]

O exemplo a seguir demonstra como isso funciona. Para obter uma explicação mais detalhada de cada argumento, consulte a documentação oficial da Microsoft.

Exemplo 1 – Adicionar um login para o servidor vinculado


Aqui está um exemplo de adição de um login do SQL Server chamado Maggie para um servidor vinculado chamado Homer:
EXEC sp_addlinkedsrvlogin 
    @rmtsrvname=N'Homer', 
    @useself=N'FALSE', 
    @locallogin=NULL, 
    @rmtuser=N'Maggie', 
    @rmtpassword=N'BigStrong#Passw0rd';

Execute isso no servidor local depois de criar o servidor vinculado. Você precisará de um login correspondente com as mesmas credenciais no servidor remoto real.

Exemplo 2 – Incluir o servidor vinculado


Por uma questão de completude, aqui está novamente, mas desta vez eu crio o servidor vinculado primeiro:
EXEC sp_addlinkedserver 
    @server=N'Homer', 
    @srvproduct=N'', 
    @provider=N'MSOLEDBSQL', 
    @datasrc=N'172.17.0.2',
    @catalog='Music';

EXEC sp_addlinkedsrvlogin 
    @rmtsrvname=N'Homer', 
    @useself=N'FALSE', 
    @locallogin=NULL, 
    @rmtuser=N'Maggie', 
    @rmtpassword=N'BigStrong#Passw0rd';

Desde que o servidor vinculado real (remoto) tenha um login com as mesmas credenciais, o servidor local poderá efetuar login no servidor vinculado.

Exemplo 3 – Adicionar o Login/Usuário no Servidor Remoto


Como mencionado, você precisará garantir que haja um login correspondente no servidor remoto. Você também precisará garantir que esse login seja mapeado para um usuário de banco de dados com as permissões apropriadas.

Portanto, neste caso, poderíamos criar um login no servidor remoto pulando para o servidor remoto e executando isto:
CREATE LOGIN Maggie
    WITH PASSWORD = 'BigStrong#Passw0rd';

USE Music;
CREATE USER Maggie FOR LOGIN Maggie;

GRANT SELECT ON DATABASE::Music TO Maggie; 

Isso cria um login chamado Maggie e um usuário de banco de dados correspondente chamado Maggie. Ele também concede SELECT permissões para Maggie para o banco de dados Music.

Agora que fiz isso, todas as consultas distribuídas usando esse login serão limitadas ao banco de dados Music.

Uma alternativa ao uso de GRANT SELECT ON DATABASE , é adicionar o usuário ao db_datareader função de banco de dados fixa, ou talvez para uma função personalizada.

Se você criou o servidor vinculado antes de criar os logins e os usuários do banco de dados no servidor remoto, pode ser necessário descartar o servidor vinculado e criá-lo novamente. Se sim, você pode soltá-lo assim:
EXEC sp_dropserver 'Homer', 'droplogins';

Uma vez descartado, você pode criar o servidor vinculado e seu login associado novamente.

Eu realmente preciso de um login de servidor vinculado?


É possível que você nem precise adicionar um login como no exemplo acima.

Quando você cria um servidor vinculado pela primeira vez no SQL Server, um mapeamento padrão entre todos os logons no servidor local e os logons remotos no servidor vinculado é criado automaticamente. O SQL Server usa as credenciais do logon local ao se conectar ao servidor vinculado em nome do logon.

Portanto, se o seu login local tiver um login correspondente no servidor vinculado, com as mesmas credenciais, e tiver as permissões apropriadas, você estará pronto. Não há necessidade de adicionar um login para o servidor vinculado.

Dito isso, você pode ter outros motivos para adicionar um login separado, como adicioná-lo para outros usuários.

Você também pode querer criar um mapeamento de login para um único usuário local, nesse caso você pode usar o @locallogin argumento para especificar o logon local a ser mapeado.

Consulte Como funcionam os logins em servidores vinculados para obter exemplos de vários logins locais tentando acessar um login de servidor vinculado em diferentes cenários.