Chạy gói SSIS từ công việc Tác nhân SQL được sở hữu bởi người dùng tên miền không phải là sysadmin


16

Tôi có hai gói SSIS chạy theo lịch trình qua đêm (thông qua SQL Server Agent) như là một phần của việc triển khai SSIS lớn hơn, mà không có bất kỳ vấn đề nào. Mọi thứ đang sử dụng xác thực Windows và công việc được lên lịch được sở hữu bởi một sysadmin (tốt, tôi) và chạy dưới dạng Tài khoản dịch vụ đại lý SQL Server.

Vì vậy, dữ liệu về cơ bản đi source system ~> transit db ~> staging ~> NDSqua đêm.

Hai gói SSIS tôi quan tâm, xử lý tương ứng transit db ~> stagingstaging ~> NDScác bộ phận cho một bộ dữ liệu cụ thể.

Một người dùng tên miền (không phải sysadmin) làm gì đó trong đó source systemvà đẩy dữ liệu thú vị vào transit db, vì vậy tôi cần một cách để lấy dữ liệu cập nhật này trong giờ làm việc để cập nhật NDS: đó là cách đơn giản nhất để người này kích hoạt rằng ETL, bằng cách nhấp vào nút trong sổ làm việc Excel có hỗ trợ macro, kết nối với SQL Server qua ODBC (sử dụng Xác thực Windows) và thực hiện quy trình được lưu trữ.

Thủ tục lưu trữ trông như thế này:

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

Quy trình được lưu trữ của "chị" trong [msdb] trông như thế này:

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

Người dùng [SqlAgentProxy] này là người dùng Windows mà tôi đã tạo trong [msdb] ngoài thông tin đăng nhập của người dùng tên miền mà tôi đã cấp executequyền cho UpdateMaterialInventoryquy trình này . Điều này tránh việc phải cấp executequyền cho người dùng tên miền msdb.dbo.sp_start_job, điều này sẽ quá mức.

Công việc Tác nhân SQL NDS-ManualMaterialInventoryđược sở hữu bởi người dùng miền và có 2 bước, mỗi loại [Gói dịch vụ tích hợp máy chủ SQL], được thiết lập để Chạy dưới dạng SSISProxy .

SSISProxylà một proxy Đại lý SQL Server được ánh xạ tới hệ thống con [Gói dịch vụ tích hợp SQL Server], sử dụng tên thông tin xác thực SSISProxyCredentials. Đăng nhập của người dùng tên miền đã được thêm vào hiệu trưởng tài khoản Proxy .

Chúng SSISProxyCredentialsđược tạo với Danh tính của cùng một người dùng tên miền đang chạy toàn bộ SSIS ETL qua đêm và mật khẩu của nó đã được kiểm tra bốn lần.

Bây giờ, nếu tôi chạy này:

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

Tôi nhận được kết quả này:

Job 'NDS-ManualMaterialInventory' started successfully.

Tuy nhiên, lịch sử công việc đang kể một câu chuyện ít đáng khích lệ hơn nhiều:

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

Và bước 1 chi tiết:

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.

Công việc thất bại và không có gì được ghi lại ở bất cứ đâu.

Nếu tôi thay đổi chủ sở hữu công việc thành chính mình và thay đổi các bước chạy như là Tài khoản dịch vụ đại lý SQL Server, công việc sẽ chạy, thành công và ghi nhật ký 1.067 hàng vào [Siêu dữ liệu]. [Dbo]. [Sysssislog].

Có vẻ như có điều gì đó không đúng về cách thiết lập proxy / thông tin đăng nhập. Phần nào tôi đang làm sai?

Câu trả lời:


18

Vấn đề có vẻ phức tạp hơn nó. Vì bạn đang sử dụng SQL 2014, có lẽ bạn đang bị cắn bởi các tính năng bảo mật mới được giới thiệu vào năm 2012.

Điều duy nhất thực sự quan trọng là:

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

Đăng nhập người dùng Proxy của bạn rất có thể không có quyền truy cập vào danh mục SSISDB (mặc dù anh ta có thể có quyền truy cập vào SQL Server).
Bạn cần ánh xạ thông tin đăng nhập đến người dùng SSISDB định cấu hình quyền truy cập vào các thư mục / dự án SSISDB trong Dịch vụ tích hợp.

Hãy có một cái nhìn tại MSDN này bài đăng blog SSIS Catalogue Access Control MẹoSQL 2012 SSIS Catalogue Quyền

Khi bạn đã tải gói thực sự, bạn có thể gặp phải các sự cố bối cảnh bảo mật khác nhưng bạn nên đăng nhập tốt hơn từ chính các dịch vụ tích hợp.


3
Chính xác là thế này. Cảm ơn bạn đã đi trên và hơn thế nữa :-)
Mathieu Guindon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.