Menjalankan paket SSIS dari pekerjaan SQL Agent yang dimiliki oleh pengguna domain non-sysadmin

16

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 ~> NDSsemalam.

Dua paket SSIS yang saya pedulikan , masing-masing menangani, transit db ~> stagingdan staging ~> NDSbagian, untuk satu set data tertentu.

Pengguna domain (non-sysadmin) melakukan sesuatu di source systemdan 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 executeizin untuk UpdateMaterialInventoryprosedur ini . Ini menghindari keharusan memberikan executeizin kepada pengguna domain msdb.dbo.sp_start_job, yang akan berlebihan.

Pekerjaan SQL Agent NDS-ManualMaterialInventorydimiliki oleh pengguna domain dan memiliki 2 langkah, masing-masing tipe [Paket Layanan Integrasi SQL Server], yang disetel untuk Jalankan sebagai SSISProxy .

SSISProxyadalah 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 SSISProxyCredentialsdibuat 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?

Mathieu Guindon
sumber

Jawaban:

18

Masalahnya terlihat lebih kompleks dari itu. Karena Anda menggunakan SQL 2014, Anda mungkin digigit oleh fitur keamanan baru yang diperkenalkan pada 2012.

Satu-satunya hal yang benar-benar penting adalah:

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

Login pengguna Proxy Anda kemungkinan besar tidak memiliki akses ke katalog SSISDB (meskipun ia mungkin memiliki akses ke SQL Server).
Anda perlu memetakan login ke pengguna SSISDB dan mengonfigurasi akses ke folder / proyek SSISDB di Layanan Integrasi.

Silakan lihat posting blog MSDN ini Tips Kontrol Akses Katalog SSIS dan Izin Katalog SSIS SQL 2012

Setelah Anda memiliki paket yang benar-benar dimuat, Anda mungkin mengalami masalah konteks keamanan lainnya tetapi Anda harus mendapatkan pencatatan yang lebih baik dari layanan integrasi itu sendiri.

Tom V - Tim Monica
sumber
3
Persis seperti ini. Terima kasih telah pergi di atas dan di luar :-)
Mathieu Guindon