web-dev-qa-db-ja.com

SQL Server 2012のリンクサーバーとしてMicrosoft.ACE.OLEDB.12.0を使用して更新/削除/挿入する方法

Access 2003データベースをSQL Server 2012から更新する必要がありますMicrosoft.ACE.OLEDB.12.0プロバイダー。管理者として、すべてがうまく機能します。 AccessデータベースでSelect、Insert、Update、およびDeleteステートメントを問題なく実行できますが、非管理者ユーザーを使用すると、Selectクエリしか実行できません挿入、更新、削除のクエリが機能せず、次のエラーメッセージが表示されます。

SQL Serverログインを使用するときのエラーメッセージ:

リンクサーバー "AccessFileTest"のOLE DBプロバイダー "Microsoft.ACE.OLEDB.12.0"に対してクエリ "SELECT * FROM inv_lign"を実行できません。プロバイダーは、UPDATEに必要なインターフェイスをサポートできませんでした/ DELETE/INSERTステートメント。プロバイダーは、他のプロパティまたは要件との競合が発生したことを示しています。

これがクエリです:

_DELETE FROM
OPENQUERY(AccessFileTest,
    'SELECT * FROM inv_lign')
_

私はまた、4つの部分のクエリを試しましたが、成功しませんでした。

_DELETE AccessFileTest...inv_lign;
_

Microsoft.ACE.OLEDB.12.0プロバイダーの構成方法は次のとおりです

  • 動的パラメーター= true
  • インプロセスを許可する= true
  • レジストリにキーDisallowAdHocAccess = 0を追加しました

Linked Server AccessFileTestの構成方法は次のとおりです

  • [セキュリティ]タブで、[このセキュリティコンテキストを使用して作成する]を選択しました
  • リモートログインはパスワードなしの「admin」です

では、Microsoft.ACE.OLEDB.12.0プロバイダーを使用してAccess 2003データベースでInsert/Update/Deleteステートメントを実行するにはどうすればよいですか?

これまでに試したこと:

  • SQL Serverのsysadminではなく、サーバーの管理者であるADユーザーを使用する場合にのみ、それを機能させることができました。ユーザーがサーバーの管理者でない場合、エラーメッセージCannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".が表示されます。次に、このユーザーを追加して、TEMPフォルダーとAccessファイルに対するアクセス許可を取得しようとしましたが、成功しませんでした。だから、私はこれをADユーザーと連携させるためにどんな特別な権利を与えなければならないのか分かりません。

  • SQL Serverログインを使用する場合、前述のようにエラーメッセージが表示されます。

3
Alexandre Jobin

この問題は、Accessファイルが保存されているサーバーでの権限が不十分であることが原因です。使用しているログインタイプに応じてサーバーを設定する方法は次のとおりです。

SQL Serverログインを使用している場合:

  • Accessファイルが存在するフォルダーで、(そのファイルにCRUDを作成するかどうかに応じて)SQL Serverデータベースエンジンサービスアカウントの読み取りおよび書き込み権限を付与します。

Windows認証ログインを使用している場合:

  • this user loginに読み取りと書き込みの権限を付与:
    • accessファイルが存在するフォルダ。
    • sQL Serverデータベースエンジンユーザーアカウントのtemp folderたとえば、SQL Serverデータベースエンジンのサービスアカウントがdomain\sqlEngSvcの場合、読み取り/書き込み権限をC:\ Users\sqlEngSvc\AppData\Local\Tempに設定する必要があります。フォルダ。
1
Alexandre Jobin