none
Revoke RRS feed

  • Pergunta

  • Olá Senhores,

    Criei um usuário que será utilizado por um linkedservice, porém, esse usuário só poderá executar insert numa tabela. Ressalto que o usuário não poderá ler, deletar ou atualizar nada. Para isso fiz o seguinte:

    1) usuário com DATABASE ROLE public somente;

    2) GRANT INSERT ON TB_TESTE TO MEU_USUARIO;

    No entanto, quando executo um insert via linkedservice ocorre o erro abaixo:

    Cannot process the object ""DB"."DBO"."TB_TESTE"". The OLE DB provider "SQLNCLI11" for linked server "SERVER" indicates that either the object has no columns or the current user does not have permissions on that object.

    Alguém poderia me ajudar com o referido problema.

    Desde já obrigado.


    terça-feira, 16 de dezembro de 2014 11:53

Todas as Respostas

  • Bom dia,

    Como está sendo o feito o seu insert, você utilizou o comando OpenQuery?

    Qual o código de erro associado a essa mensagem? 


    Att, Bruno Silva.

    terça-feira, 16 de dezembro de 2014 12:12
  • FdSilva6,

    Você deverá habilitar o RPC neste linkedserver "DB". 

    Para isso, abra o SSMS, clique em sua instância SQL, acesse a pasta "Server Objects" -> "Linked Servers". Clique com o botão direito em seu linked server e selecione "Properties". Vai abrir uma janela, então selecione o RPC para true. Veja abaixo:

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    terça-feira, 16 de dezembro de 2014 12:17
  • Estou fazendo o insert da seguinte forma:

    INSERT INTO [SERVER].[DB].DBO.TB_TESTE ([AAAA]) VALUES('SSS')

    Marquei a opção RPC e RPC OUT, conforme sugerido pelo colega e acabei mantendo as permissões (usuário com DATABASE ROLE public somente  e GRANT INSERT ON TB_TESTE TO MEU_USUARIO), no entanto, o insert não funcionou.


    terça-feira, 16 de dezembro de 2014 12:39
  • Estou fazendo o insert da seguinte forma:

    INSERT INTO [SERVER].[DB].DBO.TB_TESTE ([AAAA]) VALUES('SSS')

    Marquei a opção RPC e RPC OUT, conforme sugerido pelo colega e acabei mantendo as permissões (usuário com DATABASE ROLE public somente  e GRANT INSERT ON TB_TESTE TO MEU_USUARIO), no entanto, o insert não funcionou.


    FdSilva6,

    O usuário "MEU_USUARIO" é o mesmo utilizado no contexto do linkedserver?

    Veja o print abaixo:

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    terça-feira, 16 de dezembro de 2014 12:45
  • Sim... o Meu usuário é o mesmo no contexto do linkedserver.

    Ressalto que as únicas permissões que o usuário possui são:  database role public e grant de insert na tabela.


    • Editado fdsilva6 terça-feira, 16 de dezembro de 2014 12:54
    terça-feira, 16 de dezembro de 2014 12:53
  • Senhores,

    quando eu acesso a instancia com o usuário as permissões estão certinhas, ou seja, o usuário só consegue realizar o insert na tabela.

    Agora, quando eu acesso a tabela via linked server, não consigo realizar o insert. Está parecendo que o linked server executa um select antes do insert.

    Ressalto que o usuário do contexto é o usuário correto.

    Alguém tem alguma sugestão??? É valido lembra que preciso que o usuário do linked server consiga inserir um registro, porém, o mesmo não pode executar um select na abela via linked server.



    • Editado fdsilva6 terça-feira, 16 de dezembro de 2014 15:32
    terça-feira, 16 de dezembro de 2014 14:46
  • Galera, fiz uma procedure para gerenciar o processo de inserção e removi todos os privilégios do usuário do linkedservers.
    terça-feira, 16 de dezembro de 2014 16:04
  • Senhores,

    quando eu acesso a instancia com o usuário as permissões estão certinhas, ou seja, o usuário só consegue realizar o insert na tabela.

    Agora, quando eu acesso a tabela via linked server, não consigo realizar o insert.

    Ressalto que o usuário do contexto é o usuário correto.

    Alguém tem alguma sugestão???

    FdSilva,

    Certamente é permissão. Como você já garantiu que a instrução INSERT funciona diretamente no "servidor destino", então é uma permissão no usuário do "servidor origem" ou nos parâmetros de execução da instrução.

    Revise os acessos do usuário na "origem".

    Adicione também antes da execução (no mesmo contexto) o parâmetro FMTONLY. Segue um exemplo abaixo:

    SET FMTONLY ON
    GO
    
    INSERT INTO [SERVER].[DB].DBO.TB_TESTE ([AAAA]) VALUES('SSS')
    GO

    Para maiores informações veja:

    http://msdn.microsoft.com/pt-br/library/ms173839.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    terça-feira, 16 de dezembro de 2014 16:06
  • fdSilva,

    A sugestão do Durval em utilizar a Diretiva Set FMTOnly é valida como mecanismo de teste, ela por padrão retorna apenas metadados ao cliente. Pode ser usado para testar o formato da resposta sem realmente executar a consulta.

    Vale ressaltar que este recurso esta presente no SQL Server 2014, mas a indicação e fazer uso das novas funiconalidades:</sentencetext>


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com


    quinta-feira, 18 de dezembro de 2014 12:22
    Moderador