Tenho um cenário em que um usuário deseja fazer o seguinte por meio de um servidor vinculado:
SELECT *
FROM [DBTEST].[AdventureWorks].sys.objects
WHERE object_id = OBJECT_ID(N'dbo.DatabaseLog');
O servidor vinculado está configurado para uso Be made using this security context
e o login do servidor vinculado tem acesso de leitura no banco de [DBTEST].[AdventureWorks]
dados.
A consulta acima não retorna nenhuma linha quando executada por meio do servidor vinculado. No entanto, quando eu faço login diretamente DBTEST
usando o login do servidor vinculado e faço o seguinte, ele retorna uma linha:
SELECT *
FROM [AdventureWorks].sys.objects
WHERE object_id = OBJECT_ID(N'dbo.DatabaseLog')
Estou confuso por que não está funcionando no servidor vinculado e o que preciso fazer para corrigi-lo.
Mais uma coisa estranha é que, mesmo que eu conceda sa
direitos ao login do servidor vinculado, ele ainda não retorna nenhuma linha quando executado por meio do servidor vinculado.
Ambos os servidores são SQL Server 2008 Enterprise Edition.
O problema não é relacionado à segurança :-).
Em sua consulta, você está selecionando de uma tabela em um sistema remoto, mas a condição WHERE está usando a
OBJECT_ID()
função, que só pode ver a instância local e não está sendo executada no escopo da conexão do Linked Server.Por que você não tenta:
E essa consulta faz mais sentido de qualquer maneira, já que você já tinha o nome, então não faz sentido consultar para obter o ID do nome apenas para usar o ID em uma segunda consulta ;-).
Se você quiser / precisar também filtrar o nome do esquema, precisará adicionar o JOIN à
[DBTEST].[AdventureWorks].sys.schemas
tabela, poisOBJECT_SCHEMA_NAME
também é apenas escopo local.@srutzky está correto - isso não é relacionado à segurança. Como ele disse, a
OBJECT_ID()
função está operando na instância local do SQL Server, não na instância remota.Se você quiser executar a instrução inalterada no servidor remoto, precisará executá-la por meio do T-SQL dinâmico, usando o seguinte:
Isso executará todo o conteúdo
@sql
no servidor remoto.