Pergunta

Como faço para que o ms-access se conecte (por meio de ODBC) a um banco de dados ms-sql como um usuário diferente do ID do Active Directory?

Não quero especificar uma conta na conexão ODBC, quero fazê-lo no lado do ms-access para ocultá-la dos meus usuários.Fazer isso na conexão ODBC me colocaria de volta na situação original que estou tentando evitar.

Sim, isso está relacionado a uma pergunta anterior: http://www.stackoverflow.com/questions/50164/

Foi útil?

Solução

Acho que você pode fazer isso funcionar da maneira que deseja se usar um "Conexão ODBC DSN-LESS"

Se precisar, mantenha seus DSNs ODBC nas máquinas dos usuários usando autenticação do Windows.Dê aos seus usuários acesso somente leitura ao seu banco de dados.(Se eles criarem um novo arquivo mdb e vincularem as tabelas, eles só poderão ler os dados.)

Crie um Login SQL que tenha permissão de leitura/gravação em seu banco de dados.

Escreva uma rotina VBA que faça um loop nas tabelas vinculadas e redefina a conexão para usar seu Login SQL, mas certifique-se de usar a sintaxe "DSN-Less".

"ODBC;Driver={SQL Native Client};" &
       "Server=MyServerName;" & _
       "Database=myDatabaseName;" & _
       "Uid=myUsername;" & _
       "Pwd=myPassword"

Chame essa rotina como parte do seu código de inicialização.

Algumas notas sobre esta abordagem:

  • O Access parece ter um problema com as informações de conexão quando você muda de leitura/gravação para somente leitura e tenta voltar para leitura/gravação sem fechar e reabrir o arquivo do banco de dados (mde/mdb).Se você puder alterar isso uma vez na inicialização para leitura/gravação e não alterá-lo durante a sessão, esta solução deverá funcionar.

  • Ao usar uma conexão DSN - Less, você pode ocultar as credenciais do usuário no código (supondo que você esteja fornecendo a ele um arquivo mde, você deve estar bem).Normalmente codificar cadeias de conexão não é uma boa ideia, mas como você está lidando com um aplicativo interno, você deve concordar com essa abordagem.

Outras dicas

Acho que você teria que iniciar o processo do MS Access na conta que deseja usar para se conectar.Existem várias ferramentas que permitem fazer isso, como CPAU.Esta ferramenta também permitirá criptografar a senha.

Admitimos aqui que você está usando uma conexão ODBC ao seu banco de dados com Segurança Integrada ativada, de modo que você não tem/não deseja escrever um valor de nome de usuário/senha na string de conexão (que para mim é a escolha certa).

Neste caso, felizmente não há como “simular” outro usuário ao se conectar aos dados.Admita comigo que ser capaz de fazer tal coisa seria uma grande ruptura na segurança integrada!

Entendi pela sua postagem anterior que você queria que os usuários pudessem atualizar os dados ou não, dependendo da interface do cliente que usam.Na minha opinião, a ideia seria criar para cada tabela uma visão vinculada 'não atualizável'.Digamos que para cada tabela chamada Table_Blablabla você cria uma visualização (=consulta no Access) chamada View_Table_Blablabla ...).

Ao usar o Access, você pode decidir em tempo de execução se deseja abrir a tabela atualizável ou a visualização somente leitura.Isso pode ser feito, por exemplo, em tempo de execução, no form_Open evento, definindo o formulário recordsource para a tabela ou para a visualização.

@Philippe
Presumo que você esteja usando a palavra Admitem como sendo aproximadamente equivalente a entender ou talvez concordar;em oposição ao oposto de negar.

Entendo as implicações de fazer com que todos os usuários façam login no banco de dados usando um ID e senha (e armazená-los no aplicativo).Isso para mim é um risco menor do que o problema que estou enfrentando agora.
@desligado

Mais algumas informações básicas sobre o problema:Eu tenho conexões ODBC configuradas em cada uma das estações de trabalho dos usuários usando a autenticação Windwos NT.Na maioria das vezes, os usuários se conectam usando uma configuração MDE para usar essa conexão ODBC - nesse caso, eles SEMPRE têm a capacidade de adicionar/atualizar/excluir dados.

O problema é que alguns usuários são informados o suficiente sobre o MS-Access para criar um novo mdb e vinculá-lo ao servidor MS-SQL.Eles podem então editar os dados diretamente nas tabelas, em vez de passar pelo aplicativo, que faz uma certa validação e controle manual.E eles como fazendo isso, mas às vezes bagunça tudo e me causa problemas.

O que eu esperava fazer (que acabei de experimentar) era atualizar os links para o banco de dados algo assim para cada tabela (Nota:Troquei a conexão ODCB para autenticação do SQL Server para este experimento e também adicionei as contas ao SQL Server: somente leitura - que não pode receber nenhuma atualização, e ler escrever - que tem todos os privilégios na mesa).

myTable.Connect = _
                "ODBC;" & _
                "DATABASE=" & "MyTestDB" & ";" & _
                "UID=readonly;" & _
                "PWD=readonly_password;" & _
                "DSN=" & "MyTestDB" & ";"
myTable.RefreshLink

isso os impede de editar, mas não consigo fazer uma leitura e gravação posterior funcionar

myTable.Connect = _
                "ODBC;" & _
                "DATABASE=" & "MyTestDB" & ";" & _
                "UID=readwrite;" & _
                "PWD=readwrite_password;" & _
                "DSN=" & "MyTestDB" & ";"
myTable.RefreshLink

Parece que qualquer permissão com a qual eu me conecte primeiro permanece permanentemente.Se eu iniciei a leitura e gravação e depois fui para somente leitura, a tabela permanece com os privilégios de leitura e gravação

Por que não usar segurança integrada/Windows.Você pode conceder a um grupo do Active Directory os direitos que deseja aos usuários e, em seguida, adicionar as contas dos usuários a esse grupo.Acredito que você também pode usar o recurso de funções do SQL Server além disso para limitar a funcionalidade com base no aplicativo cliente que está sendo usado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top