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 ~> NDS
qua đêm.
Hai gói SSIS tôi quan tâm, xử lý tương ứng transit db ~> staging
và staging ~> NDS
cá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 system
và đẩ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 execute
quyền cho UpdateMaterialInventory
quy trình này . Điều này tránh việc phải cấp execute
quyề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
.
SSISProxy
là 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?