Назад | Перейти на главную страницу

Как создать связанный сервер в SQL Server 2005 с базой данных Access 95, защищенной паролем?

Мне нужно создать связанный сервер с SQL Server Management Studio 2005 с базой данных Access 95, которая защищена паролем на уровне базы данных. Безопасность на уровне пользователя не реализована.

Я не могу преобразовать базу данных Access в более новую версию. Он используется сторонним приложением; поэтому его изменение каким-либо образом запрещено.

Я пробовал использовать Jet 4.0 OLE DB Provider и ODBC OLE DB Provider. Стороннее приложение создает системный DSN (с правильным паролем базы данных), но мне не удалось использовать ни один из методов.

Если бы я использовал стандартную строку подключения, я думаю, это выглядело бы примерно так:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\Test.mdb';Jet OLEDB:Database Password=####;

Я почти уверен, что мне нужно как-то включить Jet OLEDB:Database Password в настройку связанного сервера, но не понял, как это сделать.

Я разместил скрипты, которые использую, вместе с соответствующими сообщениями об ошибках ниже. Любая помощь приветствуется. Если нужно, я предоставлю более подробную информацию, просто спросите.

Спасибо!

Метод №1 - Использование поставщика Jet 4.0 Когда я пытаюсь запустить эти операторы для создания связанного сервера:

sp_dropserver 'Test', 'droplogins';
EXEC sp_addlinkedserver @server = N'Test', @provider = N'Microsoft.Jet.OLEDB.4.0',
    @srvproduct = N'Access DB', @datasrc = N'C:\Test.mdb'
GO

EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Test', @useself=N'False',@locallogin=NULL,
    @rmtuser=N'Admin', @rmtpassword='####'
GO

Я получаю эту ошибку при проверке соединения:

TITLE: Microsoft SQL Server Management Studio
------------------------------

"The test connection to the linked server failed."

------------------------------
ADDITIONAL INFORMATION:

An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)

------------------------------

The OLE DB provider "Microsoft.Jet.OLEDB.4.0" for linked server "Test" reported an error. Authentication failed.
Cannot initialize the data source object of OLE DB provider "Microsoft.Jet.OLEDB.4.0" for linked server "Test".
OLE DB provider "Microsoft.Jet.OLEDB.4.0" for linked server "Test" returned message "Cannot start your application. The workgroup information file is missing or opened exclusively by another user.". (Microsoft SQL Server, Error: 7399)

------------------------------

Метод № 2 - Использование поставщика ODBC ...

sp_dropserver 'Test', 'droplogins';
EXEC sp_addlinkedserver @server = N'Test', @provider = N'MSDASQL', 
    @srvproduct = N'ODBC', @datasrc = N'Test:DSN'
GO

EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Test', @useself=N'False',@locallogin=NULL,
    @rmtuser=N'Admin', @rmtpassword='####'
GO

Я получаю такую ​​ошибку:

TITLE: Microsoft SQL Server Management Studio
------------------------------

"The test connection to the linked server failed."

------------------------------
ADDITIONAL INFORMATION:

An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)

------------------------------

Cannot initialize the data source object of OLE DB provider "MSDASQL" for linked server "Test".
OLE DB provider "MSDASQL" for linked server "Test" returned message "[Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed".
OLE DB provider "MSDASQL" for linked server "Test" returned message "[Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed".
OLE DB provider "MSDASQL" for linked server "Test" returned message "[Microsoft][ODBC Microsoft Access Driver] Cannot open database '(unknown)'.  It may not be a database that your application recognizes, or the file may be corrupt.". (Microsoft SQL Server, Error: 7303)

После нескольких часов борьбы с этой проблемой я наконец нашел не одно, а два решения! Я использую SQL Server 2008 и Access 2000, но думаю, решение то же самое.

Решение 1. Используйте OPENDATASOURCE

Используйте этот подход, если вы будете нечасто обращаться к данным на связанном сервере:

select * from 
OPENDATASOURCE('Microsoft.JET.OLEDB.4.0', 'Data Source=C:\MyAccessDB.mdb;User ID=Admin;Password=;Jet OLEDB:Database Password=MyDBPassword;')...MyTable

Чтобы это сработало, вам также необходимо включить Ad Hoc Distributed Queries вариант:

exec sp_configure 'show advanced options', 1;
RECONFIGURE;
exec sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO

Решение 2. Используйте связанный сервер

Как вы уже сказали, связанный сервер, похоже, не работает. Однако есть небольшая ошибка, которая заставляет все работать гладко; вам нужно указать пароль базы данных в строке поставщика, например ;PWD=password.

exec sp_addlinkedserver 
    @server = 'TestLinkServer', 
    @provider = 'Microsoft.Jet.OLEDB.4.0', 
    @srvproduct = 'Access',
    @datasrc = 'C:\MyAccessDB.mdb', 
    @provstr = ';PWD=MyDBPassword'

exec sp_addlinkedsrvlogin 
    @rmtsrvname = 'TestLinkServer',
    @useself = 'FALSE',
    @locallogin = null, 
    @rmtuser = 'Admin', 
    @rmtpassword = null

ИДТИ

Теперь вы можете запросить свою базу данных Access как связанный сервер:

select * from TestLinkServer...MyTable

Похоже, вы не различаете пароль базы данных (впервые представленный в Jet 3.0, версия Jet в A95) и имя пользователя / пароль безопасности уровня пользователя Jet. Все ваши примеры относятся к последнему, но вы упоминаете пароль базы данных в своем вопросе. Только OLEDB поддерживает это (ODBC нет), поэтому вам нужно проверить http://www.connectionstrings.com/access для строки подключения OLEDB с паролем базы данных.