none
Login no SQL Server RRS feed

  • Pergunta

  • Bom dia pessoal do fórum....

    pesquisei sobre o assunto mas não obtive muito sucesso....

    seguinte, eu preciso criar um login no sql para um usuário do meu sistema de modo que ele acesse o enterprise mas

    não consiga executar nenhum comando de alterção (insert, update...), ele poderá efetuar apenas consultas. Será que alguém de vocês

    já passou por situação semelhante? Se alguém puder me ajudar ficarei muito grato.

     

    Grande abraço a todos!

    • Movido Gustavo Maia Aguiar segunda-feira, 11 de abril de 2011 16:56 (De:SQL Server - Desenvolvimento Geral)
    segunda-feira, 11 de abril de 2011 16:25

Respostas

  • Anderson,

    Crie o login através da guia Security da instância. Depois em Security da base, cadastre um novo usuário amarrando o logon referente ao login criado e a marque a opção de DB_DATAREADER. Vc conseguirá apenas realizar consultas.


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    segunda-feira, 11 de abril de 2011 16:42
  • Anderson,

    Seu ambiente é bem parecido com o meu. Aqui temos a necessidade de voltar backups diários de clientes para acessos e testes das aplicações.

    Porém temos logins especificos que a aplicação seja precisa para ser acessada, assim como tabelas de segurança de nossos sistemas.

    Quando voltamos tais backups sempre temos a necessidade de executar um script que cria tais logins e usuários para que a aplicação "libere" o acesso.

    Acredito que no seu caso seja isso tb. A cada restauração vc rodar o script que cria tais logins. Isso para vc não ter que fazer manualmente, conforme descrito nos outros posts.

    Att.,


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    • Marcado como Resposta andersonbtr terça-feira, 12 de abril de 2011 16:21
    segunda-feira, 11 de abril de 2011 18:45
  • Anderson,

    Seria algo + ou - assim:

    IF NOT EXISTS(SELECT * FROM MASTER.DBO.SYSLOGINS WHERE NAME = 'anderson')
       CREATE LOGIN anderson WITH PASSWORD = '123456',CHECK_POLICY=OFF
    GO
     
    sp_adduser anderson,anderson
    GO

    EXEC sp_addrolemember N'db_datareader', N'anderson'
    go


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    • Marcado como Resposta andersonbtr terça-feira, 12 de abril de 2011 16:20
    terça-feira, 12 de abril de 2011 13:24
  • Sim. Toda vez que vc for rodar, selecione a base desejada.

    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    • Marcado como Resposta andersonbtr terça-feira, 12 de abril de 2011 16:20
    terça-feira, 12 de abril de 2011 15:35

Todas as Respostas

  • Anderson,

    Crie o login através da guia Security da instância. Depois em Security da base, cadastre um novo usuário amarrando o logon referente ao login criado e a marque a opção de DB_DATAREADER. Vc conseguirá apenas realizar consultas.


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    segunda-feira, 11 de abril de 2011 16:42
  • Marco, obrigado pela resposta....

    fui realizar um teste nesse procedimento que você me explicou e já na criação do login o sql acusa uma a mensagem de erro:

    "An exception occurred while executing a Transact-SQL statement or batch." Vou dar uma pesquisada e ver o que consigo, mas de qualquer forma

    agradeço pela colaboração, assim que der certo a criação do login vou dar proseguimento as suas orientações. Mais uma vez obrigado.

     

    Grande abraço.

    segunda-feira, 11 de abril de 2011 16:59
  • Fiz mais alguns testes aqui marco, consegui resolver aquele problema que citei agora há pouco pra você, e fiz o que vc me explicou, deu tudo certinho, conforme eu estava precisando mesmo, mais uma vez meu muito obrigado...abração.
    segunda-feira, 11 de abril de 2011 17:05
  • Marco, sem querer aproveitar da sua boa vontade, mas me surgiu uma outra situação....

    E caso eu queira permitir que esse usuário faça suas consultas em qualquer base de dados, como eu faria?

    Obrigado.

    segunda-feira, 11 de abril de 2011 17:19
  • Vc pode associar o usuário indo base a base e fazer manualmente.

    Ou então ir no login criado na instância / propriedades, ir na guia de mapeamento de login e associar para as bases desejadas.


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    segunda-feira, 11 de abril de 2011 17:34
  • entendi, mas tem um problema marco...seguinte

    aqui onde trabalho, mensalmente o sistema realiza um bkp da base de dados principal, e em seguida dá um atach nela para que ela fique no enterprise, disponível, caso houver a necessidade de uma consulta. Dessa forma, como fizemos a criação do login e do usuário mapeando as bases, o SQL não irá permitir que eu acesse essas bases de dados que forem criadas posteriormente a criação do login/usuário, nem mesmo pra consulta.

    Existe alguma forma de consultar qualquer base do sql, mesmo que seja criada após a criação o usuário? Já revirei o  Sql e não consegui criar isso de nenhuma forma.

    Obrigado pela ajuda!

    segunda-feira, 11 de abril de 2011 18:35
  • Anderson,

    Seu ambiente é bem parecido com o meu. Aqui temos a necessidade de voltar backups diários de clientes para acessos e testes das aplicações.

    Porém temos logins especificos que a aplicação seja precisa para ser acessada, assim como tabelas de segurança de nossos sistemas.

    Quando voltamos tais backups sempre temos a necessidade de executar um script que cria tais logins e usuários para que a aplicação "libere" o acesso.

    Acredito que no seu caso seja isso tb. A cada restauração vc rodar o script que cria tais logins. Isso para vc não ter que fazer manualmente, conforme descrito nos outros posts.

    Att.,


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    • Marcado como Resposta andersonbtr terça-feira, 12 de abril de 2011 16:21
    segunda-feira, 11 de abril de 2011 18:45
  • marco, muito obrigado pela ajuda até aqui...

    eu tive pensando em uma possível solução...talvez se tivesse como criar uma DLL de conexão, onde eu colocaria nessa DLL a conexão e o tipo da conexão, no caso apenas uma conexão para leitura...assim, quando o usuário for acessar minha base de dados,  ao invés de acessar com uma conexão padrão setando o login que eu criar (conforme você me explicou acima), ele acesse através de uma aplicação que utilize essa DLL como forma de conexão no SQL. Só que não sei se isso é possível, ou se é possível, não tenho nem idéia de como criar uma DLL com informações SQL.

    Será que isso seria viável Marco?

     

    segunda-feira, 11 de abril de 2011 19:10
  • Mas aí entrariamos no mesmo problema. Qual usuário da base vc usaria para entrar no SQL?

    O caso da DLL vai ser o mesmo caso que citei no ultimo post. Uma aplicação tentando acessando a uma base. Porém quais permissões?

    O que fazemos aqui, (se vc quiser fazer o controle pelo sistema), é criar um usuário padrão com permissão de dbo e dentro da aplicação vc faz o controle de segurança de inserção/deleção/alteração. Porque daí o controle seria por botão no sistema.

    Mas se ele tentar entrar direto no SQL vai ter permissão para alterações.

    Então acredito que vc ter um script padrão seria mais interessante. Até porque qdo hoiver a necessidade de voltar backups o tempo de execução deste script é quase que instantaneo.


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    segunda-feira, 11 de abril de 2011 19:25
  • Bom dia marco,

    realmente, não tinha olhado por esse lado, aliás, eu pensei que poderia especificar na conexão um usuário dbo, mas que poderia haver uma forma de definir, na string de conexão que seria usada na DLL, o tipo daquela conexão. Eu trabalho com visual basic, e pra acesso aos dados da minha base de dados eu utilizo ADO, ou seja, crio uma variavel do tipo ADODB.Recordset, então carrego as informações da consulta que fiz, todas na variavél que defini, olhe o exemplo de uma consulta para leitura:

    "Global Cnn      As New ADODB.Connection" defino a conexão

    "Dim Usuario    As New ADODB.Recordset" 'defino a var

    "Cnn.Open = "String de conexão""

    "Usuario.Open "Select * From Usuario Where cod_usuario = 3 ", Conn, adOpenForwardOnly, adLockReadOnly"

    ... onde "adOpenForwardOnly, adLockReadOnly" são parâmetros definidos para informar que seria uma consulta de apenas leitura. Foi mais ou menos criar uma situação semelhante a essa direto na conexão que eu imaginei. Mas provavelmente não exista uma opção assim direto na conexão.

    Bom de qualquer forma, não imagino como elaborar esse script marco, será que poderia me ajudar a montar esse script?

    Desde já agradeço a atenção e ajuda que tem me prestado até aqui, abraços.

     

    terça-feira, 12 de abril de 2011 11:54
  • Neste caso a primeira coisa a saber é qual a versão do seu SQL?

    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    terça-feira, 12 de abril de 2011 12:26
  • SQL Server 2008 R2
    terça-feira, 12 de abril de 2011 12:56
  • Anderson,

    Seria algo + ou - assim:

    IF NOT EXISTS(SELECT * FROM MASTER.DBO.SYSLOGINS WHERE NAME = 'anderson')
       CREATE LOGIN anderson WITH PASSWORD = '123456',CHECK_POLICY=OFF
    GO
     
    sp_adduser anderson,anderson
    GO

    EXEC sp_addrolemember N'db_datareader', N'anderson'
    go


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    • Marcado como Resposta andersonbtr terça-feira, 12 de abril de 2011 16:20
    terça-feira, 12 de abril de 2011 13:24
  • show kra, muito bom...só mais uma dúvida, eu não preciso setar o banco de dados ao qual eu estou atribuindo a esse login esse parâmetro 'db_datareader' a cada vez que eu rodar o script?

     

    terça-feira, 12 de abril de 2011 14:31
  • Sim. Toda vez que vc for rodar, selecione a base desejada.

    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    • Marcado como Resposta andersonbtr terça-feira, 12 de abril de 2011 16:20
    terça-feira, 12 de abril de 2011 15:35
  • Marco, muito obrigado pela ajuda.

    Grande abraço, Deus abençoe vc.

    terça-feira, 12 de abril de 2011 16:22
  • bom dia marco/pessoal do fórum...

    marco, fiz o script que você me passou, dentro do código fonte do meu projeto, funcionou perfeitamente, ou seja, moral com o chefe...hehe

    seguinte, me apareceu uma outra situação, será que seria possível restringir o acesso a algumas tabelas? Digo, mesmo com o usuário criado tendo permissão para apenas realizar leituras, ainda assim restringir essas leituras a algumas tabelas, visando a proteção da estrutura da base de dados aqui da empresa?

    Obrigado, abraços!

    sexta-feira, 15 de abril de 2011 13:40
  • Anderson,

    Tem sim. Neste cas vc terá que aplicar os comando de DENY/REVOKE negando determinadas prmissões.

    A sintaxe seria assim:

    DENY

    DELETE ON [tabela] TO [login/user]

     


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    sábado, 16 de abril de 2011 17:40