SSIS paketini sysadmin olmayan bir etki alanı kullanıcısının sahip olduğu SQL Agent işinden çalıştırma


15

Herhangi bir sorun olmadan, daha büyük bir SSIS dağıtımının bir parçası olarak (SQL Server Agent aracılığıyla) bir gecede planlanan iki SSIS paketleri var. Her şey, Windows kimlik doğrulaması kullanıyor ve planlanan iş (iyi, ben) ve bir sistem yöneticisi tarafından sahip olunan olarak çalıştırmak SQL Server Agent hizmet Hesabı.

Yani, veriler esasen bir geceye gidiyor source system ~> transit db ~> staging ~> NDS.

Belirli bir veri seti için sırasıyla önemsediğim, transit db ~> stagingve staging ~> NDSparçaları ele aldığım iki SSIS paketi .

Bir etki alanı kullanıcısı (sysadmin olmayan) içinde bir şey yapar source systemve ilginç verileri içine iter transit db, bu yüzden güncelleştirmek için çalışma saatleri sırasında bu güncelleştirilmiş verileri getirmenin bir yoluna ihtiyacım var NDS: bu kişinin tetiklemesinin en basit yoluna karar verildi bu ETL, makro etkinleştirilmiş bir Excel çalışma kitabındaki, ODBC (Windows Kimlik Doğrulaması kullanılarak) aracılığıyla SQL Server'a bağlanan ve saklı bir yordamı yürüten bir düğmeyi tıklatmaktı.

Saklı yordam şöyle görünür:

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

[Msdb] içindeki "kardeş" saklı yordamı şuna benzer:

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

Bu [SqlAgentProxy] kullanıcısı, [msdb] içinde etki alanı kullanıcısının oturum açması dışında oluşturduğum ve executebu UpdateMaterialInventoryyordama izin verdiğim bir Windows kullanıcısı . Bu, etki alanı kullanıcısına executeizin vermek zorunda kalmaz ve msdb.dbo.sp_start_jobbu aşırı olur.

SQL Agent işi NDS-ManualMaterialInventoryetki alanı kullanıcısına aittir ve her biri [SQL Server Entegrasyon Hizmetleri Paketi] türünde, Farklı çalıştır olarak ayarlanmış 2 adımı vardır SSISProxy.

SSISProxykimlik bilgisi adı kullanarak [SQL Server Entegrasyon Hizmetleri Paketi] alt sistemine eşlenen bir SQL Server Agent proxy'sidir SSISProxyCredentials. Etki alanı kullanıcısının giriş bilgileri Proxy hesabı yöneticilerine eklendi .

SSISProxyCredentialsİle oluşturulan Kimlik gecede tüm SSIS ETL çalışıyor aynı etki alanı kullanıcı ve bunun şifre dörtlü-kontrol idi.

Şimdi, eğer bunu çalıştırırsam:

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

Bu çıktıyı alıyorum:

Job 'NDS-ManualMaterialInventory' started successfully.

Ancak iş geçmişi çok daha az cesaret verici bir hikaye anlatıyor:

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

Ve 1. adım ayrıntıları:

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.

İş başarısız olur ve hiçbir şey hiçbir yere kaydedilmez.

Kendim olmak iş sahibini değiştirmek ve kademelerin değiştirirseniz olarak çalıştırmak SQL Server Agent hizmet hesabı, iş çalışır olmak, başarılı ve günlükleri [Meta]. [Dbo]. [Sysssislog] olarak 1067 satır.

Proxy / kimlik bilgilerinin nasıl ayarlandığı konusunda doğru olmayan bir şey var gibi görünüyor. Hangi kısmı yanlış yapıyorum?

Yanıtlar:


17

Sorun olduğundan daha karmaşık görünüyor. SQL 2014 kullandığınızdan, muhtemelen 2012'de tanıtılan yeni güvenlik özellikleri tarafından ısırılıyor olacaksınız.

Asıl önemli olan tek şey:

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}'.

Proxy kullanıcı girişinizin büyük olasılıkla SSISDB kataloğuna erişimi yoktur (SQL Server'a erişimi olsa bile).
Bir SSISDB kullanıcı giriş bilgilerini eşleştirmeniz gerekir ve SSISDB klasörler / Entegrasyon Hizmetleri projelerine yapılandırmak erişimi.

Lütfen bu MSDN blog yazısına bir göz atın SSIS Kataloğu Erişim Kontrolü İpuçları ve SQL 2012 SSIS Kataloğu İzinler

Paketi gerçekten yükledikten sonra, diğer güvenlik bağlamı sorunları ile karşılaşabilirsiniz, ancak entegrasyon hizmetlerinin kendisinden daha iyi günlük almalısınız.


3
Kesinlikle bu. Yukarıda ve öteye gittiğin için teşekkürler :-)
Mathieu Guindon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.