web-dev-qa-db-ja.com

同じターゲットデータベースに対して同時操作が発生すると、SSISパッケージが「ユーザーのログインに失敗しました」にヒットする

簡単な要約

SSISパッケージのライブラリを、物理Windows Server 2003でホストされているSQL Server 2008から仮想Windows Server 2012でホストされているSQL Server 2012に移行する作業を行っています。プロジェクトの展開を使用して、Integration Services Catalogに展開する新しいパッケージ。パッケージは、別のサーバー/インスタンス上の別のSQL Server 2012データベースにデータをインポートします。

パッケージが同じSQL Server 2012ターゲットデータベースに対して複数の同時SQL操作を実行しようとすると、「ログイン失敗」エラーが発生するようです。

環境の簡単な比較

[〜#〜] old [〜#〜](機能する場所)

  • ターゲットデータベースは、物理Windows Server 2003上のSQL Server 2008です。
  • Windows Server 2003のファイルシステムから実行されたSSIS 2008パッケージ。マシン環境変数からパラメーターを受け取ります。

[〜#〜] new [〜#〜](エラーが発生する場合があります)

  • ターゲットデータベースは、仮想Windows Server 2012上のSQL Server 2012です。
  • 別のサーバー上のSQL 2012 Integration Services Catalogから実行されたSSIS 2012パッケージ:仮想Windows Server 2012。

エラー

新しい環境の一部のパッケージで異常なエラーが発生しています。

DTS_E_OLEDBERROR
An OLEDB error has occurred
Error code: 0x80040E4D
An OLEDB record is available.
Source: "Microsoft SQL Server Native Client 11.0"
HResult: 0x80040E4D
Description: "Login failed for user 'MyUser'"

ターゲットデータベースのSQLログには、次のエントリがあります。

Source: Logon, Message: Login failed for user 'MyUser'. Reason: Password did not match that for the login provided. [CLIENT: {IP addr. for SSIS DB server}]

これは切り取られて乾燥しているように見えますが、全体の話にはなりません。

私たちが知っていること

まず、SSISパッケージでデータベース接続文字列を再確認を上書きします。パッケージには、データベース接続マネージャーがあり、その接続プロパティはプロジェクトパラメーターにバインドされています。プロジェクトパラメーターは、Integration Servicesカタログの環境変数にバインドされています。

パッケージが正しい環境を使用して実行されるであることを確認しました。

さらに、同じ接続マネージャーを使用したSQL操作fineがエラーにつながる!

すべてのエラーの共通要因は、同じデータベース接続マネージャーを使用して複数の同時SQL操作が発生すると、この「ログイン失敗」エラーが発生するようです。

パッケージの失敗した部分をリファクタリングして、データベース操作を同時にではなく一度に1つずつ実行すると、エラーはなくなります。

しかし、それは私たちの古い環境で機能しました...

これらのパッケージは、物理的なWindows Server 2003サーバーで実行されているSQL Server 2008データベースを対象としたSSIS 2008で正常に機能しました。

...そして、Visual Studio 2012からパッケージを実行しても機能します

Visual Studioから同じターゲットデータベース(仮想Windows Server 2012上のSQL 2012)に対して新しいSSIS 2012パッケージを実行しても、エラーは発生しません。

これは、それらがIntegration Services Catalogでどのように展開および実行されるかと関係があると私たちを導きますが、何が問題なのか理解できません。ここで、いくつかの助けを借りることができます。

3
Zach Blocker

問題は、失敗したログインがSQL Serverログインであったことです。これは、新旧の開発者環境用にSQL接続マネージャーのプロパティを構成する方法です。

  • ServerName-MyServer
  • InitialCatalog-MyDB
  • UserName-MyUser
  • Password-***********
  • ConnectionString-Data Source=MyServer;User Id=MyUser;Initial Catalog=MyDB;Provider=SQLNCLI11;Persist Security Info=True;Auto Translate=False;

これは、古いSQL 2008環境では完全に機能し、Visual Studioでは問題ありませんでしたが、SQL 2012 Integration Services Catalogからの同時データベース操作中に失敗しましたが、追加したときに機能し始めましたPassword=******を接続文字列に。

  • ConnectionString-Data Source=MyServer;User Id=MyUser;Password=********;Initial Catalog=MyDB;Provider=SQLNCLI11;Persist Security Info=True;Auto Translate=False;

SQL 2012 Integration Services Catalog実行環境で2番目の同時接続が開かれている場合、Passwordまたはその他の構成プロパティではなく、(初期接続の?)接続文字列のみが調べられるようです。接続マネージャ。したがって、Passwordが接続文字列に含まれている必要があります。

4
Zach Blocker

確かに機能しましたが、Persist Security Info = Trueを使用してもパスワードを保存できないため、1度しか機能しませんでした。結局、Windowsユーザーアカウントを使用して接続し、パッケージのセキュリティをSQL Serverの役割に依存に切り替えて、うまくいきました。

1
Boris

ProtectionLevelを "EncryptSensitiveWithPassword"に設定し、パッケージプロパティ(F4キー)の "PackagePassword"セクションでパスワードを設定してみてください。これにより、Visual Studioを使用してdtsxパッケージを実行すると、ログインエラーが発生しました。

0
Santa