Saya memiliki dua paket SSIS yang menjalankan dijadwalkan semalam (melalui SQL Server Agent) sebagai bagian dari penyebaran SSIS yang lebih besar, tanpa masalah. Semuanya menggunakan otentikasi Windows, dan pekerjaan terjadwal dimiliki oleh sysadmin (well, me) dan dijalankan sebagai Akun Layanan Agen SQL Server.
Jadi, data pada dasarnya berlangsung source system ~> transit db ~> staging ~> NDS
semalam.
Dua paket SSIS yang saya pedulikan , masing-masing menangani, transit db ~> staging
dan staging ~> NDS
bagian, untuk satu set data tertentu.
Pengguna domain (non-sysadmin) melakukan sesuatu di source system
dan yang mendorong data menarik ke dalam transit db
, jadi saya perlu cara untuk mengambil data yang diperbarui ini selama jam kerja untuk memperbarui NDS
: diputuskan bahwa cara paling sederhana bagi orang ini untuk memicu ETL itu, adalah dengan mengklik tombol di buku kerja Excel yang diaktifkan makro, yang terhubung ke SQL Server melalui ODBC (menggunakan Windows Authentication) dan menjalankan prosedur yang tersimpan.
Prosedur tersimpan terlihat seperti ini:
create procedure dbo.UpdateMaterialInventory
as
begin
execute msdb.dbo.UpdateMaterialInventory;
end
Prosedur tersimpan "sister" di [msdb] terlihat seperti ini:
create procedure dbo.UpdateMaterialInventory
with execute as 'SqlAgentProxy'
as
begin
execute msdb.dbo.sp_start_job N'NDS-ManualMaterialInventory';
end
Pengguna [SqlAgentProxy] ini adalah pengguna Windows yang saya buat di [msdb] dari login pengguna domain, yang saya berikan execute
izin untuk UpdateMaterialInventory
prosedur ini . Ini menghindari keharusan memberikan execute
izin kepada pengguna domain msdb.dbo.sp_start_job
, yang akan berlebihan.
Pekerjaan SQL Agent NDS-ManualMaterialInventory
dimiliki oleh pengguna domain dan memiliki 2 langkah, masing-masing tipe [Paket Layanan Integrasi SQL Server], yang disetel untuk Jalankan sebagai SSISProxy
.
SSISProxy
adalah proxy SQL Server Agent yang dipetakan ke subsistem [SQL Server Integration Services Package], menggunakan nama kredensial SSISProxyCredentials
. Login pengguna domain telah ditambahkan ke prinsipal akun Proxy .
Itu SSISProxyCredentials
dibuat dengan Identitas pengguna domain yang sama yang menjalankan seluruh SSIS ETL dalam semalam, dan kata sandinya diperiksa empat kali lipat.
Sekarang, jika saya menjalankan ini:
execute as login=N'DOMAIN\thatperson'
exec NDS.dbo.UpdateMaterialInventory;
go
Saya mendapatkan hasil ini:
Job 'NDS-ManualMaterialInventory' started successfully.
Namun riwayat pekerjaan menceritakan kisah yang kurang menggembirakan:
The job failed. The Job was invoked by User DOMAIN\thatperson.
The last step to run was step 1 (Extract).
Dan langkah 1 detail:
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.
Pekerjaan gagal dan tidak ada yang dicatat di mana pun.
Jika saya mengubah pemilik pekerjaan menjadi diri saya sendiri, dan mengubah langkah-langkah dijalankan sebagai menjadi Akun Layanan Agen SQL Server, pekerjaan berjalan, berhasil dan mencatat 1.067 baris ke [Metadata]. [Dbo]. [Sysssislog].
Sepertinya ada sesuatu yang tidak beres tentang bagaimana proxy / kredensial diatur. Bagian mana yang saya lakukan salah?