sysadmin以外のドメインユーザーが所有するSQL AgentジョブからSSISパッケージを実行する


16

大規模なSSIS展開の一部として、問題なく(SQL Serverエージェント経由で)夜間に実行される2つのSSISパッケージがあります。すべてがWindows認証を使用しており、スケジュールされたジョブはsysadmin(私も)によって所有さ、SQL Serverエージェントサービスアカウントとして実行されます。

そのため、データは基本的にsource system ~> transit db ~> staging ~> NDS一晩で処理されます。

私はハンドル、気に2つのSSISパッケージtransit db ~> stagingstaging ~> NDSデータの特定のセットのために、それぞれの部品。

ドメインユーザー(sysadmin以外)が何かを実行し、source system興味深いデータをにプッシュするtransit dbため、勤務時間中にこの更新されたデータをフェッチして更新する方法が必要NDSです。この人にとって最も簡単な方法は、そのETLは、マクロ対応のExcelブックのボタンをクリックすることで、ODBCを介してSQL Serverに接続し(Windows認証を使用)、ストアドプロシージャを実行します。

ストアドプロシージャは次のようになります。

create procedure dbo.UpdateMaterialInventory
as
begin
    execute msdb.dbo.UpdateMaterialInventory;
end

[msdb]の「姉妹」ストアドプロシージャは次のようになります。

create procedure dbo.UpdateMaterialInventory
with execute as 'SqlAgentProxy'
as
begin
    execute msdb.dbo.sp_start_job N'NDS-ManualMaterialInventory';
end

この[SqlAgentProxy]ユーザーは、ドメインユーザーのログインから[msdb]で作成したWindowsユーザーでexecute、このUpdateMaterialInventoryプロシージャへのアクセス許可を付与しました。これにより、ドメインユーザーににexecute許可を与える必要がなくなりますmsdb.dbo.sp_start_job

SQL AgentジョブNDS-ManualMaterialInventoryはドメインユーザーが所有し、2つのステップがあり、それぞれ[SQL Server Integration Servicesパッケージ]タイプで[別のユーザーとして実行 ]に設定されていますSSISProxy

SSISProxy資格情報名を使用して、[SQL Server Integration Services Package]サブシステムにマップされるSQL ServerエージェントプロキシですSSISProxyCredentials。ドメインユーザーのログインは、プロキシアカウントプリンシパルに追加されました。

SSISProxyCredentialsで作成されたアイデンティティ一晩全体SSISのETLを実行している同じドメインのユーザーの、およびそのパスワードは四重にチェックしました。

さて、これを実行すると:

execute as login=N'DOMAIN\thatperson'
exec NDS.dbo.UpdateMaterialInventory;
go

私はこの出力を取得します:

Job 'NDS-ManualMaterialInventory' started successfully.

しかし、仕事の歴史は非常に期待の持てない物語を語っています。

The job failed.  The Job was invoked by User DOMAIN\thatperson.
The last step to run was step 1 (Extract).

ステップ1の詳細:

Executed as user: {domain user that runs SSIS ETL overnight}.
Microsoft (R) SQL Server Execute Package Utility  Version 12.0.4100.1 for 64-bit
Copyright (C) Microsoft Corporation. All rights reserved.
Started:  2:18:50 PM  Failed to execute IS server package because of error 0x80131904.
Server: {server name}, Package path: \SSISDB\Foo\Bar\foobar.dtsx, Environment reference Id: NULL.
Description: Login failed for user '{domain user that runs SSIS ETL overnight}'.
Source: .Net SqlClient Data Provider 
Started:  2:18:50 PM  Finished: 2:18:51 PM  Elapsed:  0.094 seconds.
The package execution failed.
The step failed.

ジョブは失敗し、何もログに記録されません。

ジョブの所有者を自分自身に変更し、ステップの実行を SQL Serverエージェントサービスアカウントとして変更すると、ジョブは実行され、成功し、1,067行を[Metadata]。[dbo]。[sysssislog]に記録します。

プロキシ/クレデンシャルの設定方法について正しくないことがあるようです。どの部分が間違っていますか?

回答:


18

問題はそれよりも複雑に見えます。SQL 2014を使用しているため、おそらく2012年に導入された新しいセキュリティ機能に悩まされているでしょう。

実際に重要なことは次のとおりです。

Server: {server name}, Package path: \SSISDB\Foo\Bar\foobar.dtsx, Environment reference Id: NULL.   
Description: Login failed for user '{domain user that runs SSIS ETL overnight}'.

プロキシユーザーのログインには、SSISDBカタログへのアクセス権がない可能性があります(SQL Serverへのアクセス権がある場合でも)。
ログインをSSISDBユーザーにマップする必要があります統合サービスでSSISDBフォルダ/プロジェクトへのアクセスを設定します。

このMSDNブログの投稿SSISカタログアクセス制御のヒントをご覧ください。 SQL 2012 SSISカタログのアクセス許可を

パッケージを実際にロードすると、他のセキュリティコンテキストの問題が発生する可能性がありますが、統合サービス自体からより良いログを取得する必要があります。


3
まさにこれ。上記を超えてくれてありがとう:-)
マチューギンドン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.