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 ~> staging
ve staging ~> NDS
parçaları ele aldığım iki SSIS paketi .
Bir etki alanı kullanıcısı (sysadmin olmayan) içinde bir şey yapar source system
ve 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 execute
bu UpdateMaterialInventory
yordama izin verdiğim bir Windows kullanıcısı . Bu, etki alanı kullanıcısına execute
izin vermek zorunda kalmaz ve msdb.dbo.sp_start_job
bu aşırı olur.
SQL Agent işi NDS-ManualMaterialInventory
etki 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
.
SSISProxy
kimlik 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?