このコードを実行するこのストアドプロシージャがあります。
このコードは、MERGEステートメントを使用して、SQL ServerのリンクサーバーによってリンクされているAccessデータベースのリモートテーブルからローカルテーブルを更新します。
ただし、SSISパッケージを作成してスケジュールを実行しようとすると、ジョブが失敗します。
これがエラーメッセージです。
コード:0x00000000
ソース:SQLタスクの実行
説明:OLEリンクサーバー "AccessDataSource"のDBプロバイダー "Microsoft.ACE.OLEDB.12.0"がメッセージ "'N:\ Database_Tools\AccessDB\delphi.accdb'を返しました有効なパスではありません。パス名のスペルが正しいこと、およびファイルが存在するサーバーに接続していることを確認してください。エラー:2012-01-17 20:29:33.19
コード:0xC002F210
ソース:SQLタスクの実行SQLタスクの実行
説明:次のエラーでクエリ "EXEC [dbo]。[sp_UPDATE_RECORDS]"の実行に失敗しました: "OLE DBプロバイダー" Microsoft.ACEリンクサーバー "AccessDataSource"の.OLEDB.12.0 "。"。考えられる失敗の理由:クエリの "ResultSet"プロパティに問題が正しく設定されていないパラメータが正しく設定されていないか、接続が正しく確立されていません。終了エラーDTExec:パッケージの実行からDTSER_FAILURE(1)が返されました。
開始:8:29:32 PM終了:8:29:33 PM経過:0.297秒。
パッケージの実行に失敗しました。ステップが失敗しました。、00:00:01,0,0 , 0
私を混乱させるのは、ストアドプロシージャをローカルでエラーなしに実行しても機能するが、JOBで失敗することです。
次に、ストアドプロシージャをジョブタイプとしてTransact-SQLスクリプト(T-SQL)として配置しました。
データベースを選択し、次のコードをコマンドウィンドウに配置します。
EXEC [dbo].[sp_UPDATE_RECORDS];
これは、ストアドプロシージャのコードです。
CREATE PROCEDURE [dbo].[sp_UPDATE_RECORDS]
AS
BEGIN
MERGE dbo.CUSTOMER AS Target
USING (SELECT MEMBER_NBR,FIRST_NAME,LAST_NAME, ADDRESS1, ADDRESS2,
CITY, [STATE], Zip, dbo.FMT_PHONE_NBR(CELL_PHONE) AS CPHONE,
dbo.FMT_PHONE_NBR(HOME_PHONE) AS HPHONE
FROM dbo.ACE_CUSTOMER) AS Source
ON (Target.MEMBER_NBR = Source.MEMBER_NBR)
WHEN MATCHED THEN
UPDATE SET Target.FIRST_NAME = Source.FIRST_NAME,Target.LAST_NAME = Source.LAST_NAME,
Target.ADDRESS1 = Source.ADDRESS1, Target.ADDRESS2 = Source.ADDRESS2,
Target.CITY = Source.CITY, Target.Zip = Source.Zip, Target.CPHONE = Source.CPHONE,
Target.HPHONE = Source.HPHONE
WHEN NOT MATCHED BY TARGET THEN
INSERT (MEMBER_NBR,FIRST_NAME,LAST_NAME, ADDRESS1, ADDRESS2, CITY, [STATE], Zip, CPHONE, HPHONE)
VALUES (Source.MEMBER_NBR, Source.FIRST_NAME, Source.LAST_NAME, Source.ADDRESS1, Source.ADDRESS2,
Source.CITY, Source.[STATE], Source.Zip, Source.CPHONE, Source.HPHONE)
OUTPUT $action AS 'STATUS',INSERTED.*;
END
これは長い問題であることはわかっていますが、誰かが私に骨を投げてくれることを期待しています(アイデア)
みんな、ありがとう!
[〜#〜]編集[〜#〜]
追加の詳細を提供したかっただけです。 Accessデータベースはネットワークドライブにあります。また、最初にSQL Serverエージェントのみを使用してストアドプロシージャを実行しました。つまり、BIDを使用せず、ジョブが失敗しました。
許可とネットワークドライブについて触れたので、これが問題だと思います。ただし、SQL Server内からネットワークドライブ上のAccess DBを使用してストアドプロシージャを手動で実行できる理由について、まだ混乱していますか?
この提案をどのように適用したかについて、詳細を教えていただけますか?
この場合は、ドライブ文字N:を変更して、代わりに完全なネットワークパス\\ servername\Database_Tools\AccessDB\delphi.accdbを使用してみて、それが機能するかどうかを確認してください。
最後に、この提案をどのように適用できますか? SQL Serverのどこでこの機能を構成するかを意味します。
sQLエージェントサービスアカウントの権限を変更して、ターゲットの場所へのアクセスを許可するか、パッケージを実行する前に、アカウントがアクセスできる場所(ローカルディスクの可能性があります)にアクセスデータベースをコピーします。
追加の詳細を提供したかっただけです。 Accessデータベースはネットワークドライブにあります。また、最初にSQL Serverエージェントのみを使用してストアドプロシージャを実行しました。つまり、BIDを使用せず、ジョブが失敗しました。
許可とネットワークドライブについて触れたので、これが問題だと思います。ただし、SQL Server内からネットワークドライブ上のAccess DBを使用してストアドプロシージャを手動で実行できる理由について、まだ混乱していますか?
この提案をどのように適用したかについて、詳細を教えていただけますか?
この場合は、ドライブ文字N:を変更して、代わりに完全なネットワークパス\\ servername\Database_Tools\AccessDB\delphi.accdbを使用してみて、それが機能するかどうかを確認してください。
最後に、この提案をどのように適用できますか? SQL Serverのどこでこの機能を構成するかを意味します。
sQLエージェントサービスアカウントの権限を変更して、ターゲットの場所へのアクセスを許可するか、パッケージを実行する前に、アカウントがアクセスできる場所(ローカルディスクの可能性があります)にアクセスデータベースをコピーします。
皆さんの時間、努力、そして忍耐に感謝します!
男
更新:
ストアドプロシージャはSSMSで完全に実行されますが、スケジュールパッケージまたはジョブでは実行されません。ネットワークドライブに関する提案の1つに基づいています。ローカルジョブのAccessデータベースと、作品を含むスケジュールジョブを削除しました!
したがって、問題はネットワークドライブにある外付けデバイスにあることがわかります。
では、ネットワークロケーションを設定して機能させるにはどうすればよいですか?
以下の手順の概要に従いましたが、ドメインアカウントに切り替える方法がわかりません。
sQL構成マネージャーでSQLエージェントサービスが実行されているアカウントを変更します([スタート]> [すべてのプログラム]> [Microsoft SQL Server 2008]> [構成ツール]にあります。SQLServerサービスのリストで「SQL Serverエージェント」を見つけ、 「ログオン」列)。共有にアクセスするには、これをドメインアカウントに切り替える必要がある場合があります。
迷っています: 共有にアクセスするには、これをドメインアカウントに切り替える必要がある場合があります。
または、このソリューション、ユーザー名は何ですか?
その場合は、ドライブ文字N:を変更して、代わりに完全なネットワークパス\\ servername\Database_Tools\AccessDB\delphi.accdbを使用して、それが機能するかどうかを確認してください。
みなさんありがとう-もうすぐです。
男
質問では触れていませんが、SQLエージェントジョブからストアドプロシージャを単に実行するのではなく、SSISパッケージを使用している理由は、プロセスに他のステップがあるためだと思います。私のもう1つの想定は、SQLエージェントジョブを使用してSSISパッケージをスケジュールすることです。
最初のエラーメッセージは、AccessデータベースへのOLEDB接続を作成しているが、データベースが見つからなかったことを示しています。これはセキュリティ上の問題であり、SSISパッケージを実行しているWindowsアカウントに、Accessデータベースが格納されているファイルシステムの場所へのアクセス許可がない可能性があります。
2番目のエラーメッセージがこれをバックアップしているようです-SPを実行すると、リンクサーバー接続を開くことができませんでした。
これを問題として確認するには、SQLエージェントサービスが実行されているのと同じアカウントを使用して、SSMSでSPを実行してみてください。
これが問題である場合、SQLエージェントサービスアカウントの権限を変更して、ターゲットの場所へのアクセスを許可するか、アクセスデータベースを実行する前に、アカウントがアクセスできる場所(おそらくローカルディスク)にアクセスデータベースをコピーする必要があります。パッケージ。
[〜#〜] edit [〜#〜]-追加の詳細に応じて:
許可とネットワークドライブについて触れたので、これが問題だと思います。ただし、SQL Server内からネットワークドライブ上のAccess DBを使用してストアドプロシージャを手動で実行できる理由について、まだ混乱していますか?
アクセスリンクサーバーは、クエリを実行するアカウントのセキュリティ資格情報を使用するように構成されています。 SQL Server Management Studioからプロシージャを実行するときは、ネットワーク共有へのアクセス許可が必要なWindowsアカウントのコンテキストで実行します。
SQLエージェントサービスによって同じクエリが実行されると、共有にアクセスできない、サービスが実行されているサービスアカウントのセキュリティコンテキストが使用されます。
最後に、この提案をどのように適用できますか? SQL Serverのどこでこの機能を構成するかを意味します。
sQLエージェントサービスアカウントの権限を変更して、ターゲットの場所へのアクセスを許可する
SQL構成マネージャーでSQLエージェントサービスが実行されているアカウントを見つけて変更できます([スタート]> [すべてのプログラム]> [Microsoft SQL Server 2008]> [構成ツール]にあります。SQLのリストで[SQL Serverエージェント]を探します。サーバーサービスおよび「ログオン」列を参照)。共有にアクセスするには、これをドメインアカウントに切り替える必要がある場合があります。
たまたま、ドライブデータベースは、Accessデータベースがあるネットワークの場所ですか?私は1年ほど前に同様の問題に遭遇しました。そこでは、誰かがサーバー上の独自のログインを使用してマップしたドライブ文字の場所を参照するためのプロシージャを設定しました。ログインして自分で実行すると問題なく動作しましたが、SQLエージェントで実行すると機能しません。ネットワークロケーションのドライブ文字マッピングはユーザー固有であり、通常、サーバーの他のログイン(SQLエージェントやSSISパッケージで使用されるログインなど)に関連付けられていません。
その場合は、ドライブ文字N:を変更して、代わりに完全なネットワークパス\\ servername\Database_Tools\AccessDB\delphi.accdbを使用して、それが機能するかどうかを確認してください。