ฉันมีแพคเกจ SSIS สองชุดที่เรียกใช้งานข้ามคืน (ผ่านทางตัวแทนของเซิร์ฟเวอร์ SQL) ซึ่งเป็นส่วนหนึ่งของการปรับใช้ SSIS ที่ใหญ่กว่าโดยไม่มีปัญหาใด ๆ ทุกอย่างใช้การรับรองความถูกต้องของ Windows และงานที่กำหนดเวลาเป็น sysadmin (ดีฉัน) และทำงานเป็นบัญชีบริการตัวแทนของเซิร์ฟเวอร์ SQL
ดังนั้นข้อมูลจึงsource system ~> transit db ~> staging ~> NDS
ค้างคืน
SSIS สองแพ็คเกจที่ฉันสนใจจัดการtransit db ~> staging
และstaging ~> NDS
ส่วนต่าง ๆ ตามลำดับสำหรับชุดข้อมูลเฉพาะ
ผู้ใช้โดเมน (ไม่ใช่ผู้ดูแลระบบ) ทำอะไรในsource system
และผลักดันข้อมูลที่น่าสนใจเข้ามาtransit db
ดังนั้นฉันต้องการวิธีที่จะดึงข้อมูลที่อัปเดตนี้ในระหว่างชั่วโมงทำงานเพื่ออัปเดตNDS
: มีการตัดสินใจว่าวิธีที่ง่ายที่สุดสำหรับบุคคลนี้ในการเรียก ETL นั้นโดยคลิกปุ่มในสมุดงาน Excel ที่เปิดใช้งานแมโครซึ่งเชื่อมต่อกับ SQL Server ผ่าน ODBC (โดยใช้การพิสูจน์ตัวจริงของ Windows) และดำเนินการตามขั้นตอนที่เก็บไว้
กระบวนงานที่เก็บไว้มีลักษณะดังนี้:
create procedure dbo.UpdateMaterialInventory
as
begin
execute msdb.dbo.UpdateMaterialInventory;
end
กระบวนการ "sister" ที่เก็บไว้ใน [msdb] มีลักษณะดังนี้:
create procedure dbo.UpdateMaterialInventory
with execute as 'SqlAgentProxy'
as
begin
execute msdb.dbo.sp_start_job N'NDS-ManualMaterialInventory';
end
ผู้ใช้ [SqlAgentProxy] นี้เป็นผู้ใช้ Windows ที่ฉันสร้างขึ้นใน [msdb] จากการเข้าสู่ระบบของผู้ใช้โดเมนซึ่งฉันได้รับexecute
อนุญาตให้ใช้UpdateMaterialInventory
ขั้นตอนนี้ วิธีนี้หลีกเลี่ยงการให้สิทธิ์ผู้ใช้โดเมนexecute
แก่msdb.dbo.sp_start_job
ซึ่งจะมากเกินไป
งานตัวแทนของ SQL NDS-ManualMaterialInventory
เป็นเจ้าของโดยผู้ใช้โดเมนและมีขั้นตอนที่ 2 แต่ละประเภท [SQL Server บูรณาการแพคเกจบริการ] จัดตั้งขึ้นเพื่อเรียกใช้ในฐานะ SSISProxy
SSISProxy
เป็นพร็อกซี่ตัวแทนของเซิร์ฟเวอร์ SQL ที่แมปไป [SQL Server Integration Services Package] SSISProxyCredentials
ระบบย่อยโดยใช้ชื่อหนังสือรับรอง เข้าสู่ระบบผู้ใช้โดเมนของถูกเพิ่มลงในหลักการบัญชีพร็อกซี่
SSISProxyCredentials
ถูกสร้างขึ้นด้วยรหัสประจำตัวของผู้ใช้โดเมนเดียวกันที่เรียกใช้ SSIS ETL ทั้งในชั่วข้ามคืนและรหัสผ่านของตนได้รับการตรวจสอบสี่เท่า
ตอนนี้ถ้าฉันเรียกใช้สิ่งนี้:
execute as login=N'DOMAIN\thatperson'
exec NDS.dbo.UpdateMaterialInventory;
go
ฉันได้ผลลัพธ์นี้:
Job 'NDS-ManualMaterialInventory' started successfully.
อย่างไรก็ตามประวัติงานกำลังบอกเล่าเรื่องราวที่ให้กำลังใจน้อยกว่ามาก:
The job failed. The Job was invoked by User DOMAIN\thatperson.
The last step to run was step 1 (Extract).
และรายละเอียดขั้นตอนที่ 1:
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.
งานล้มเหลวและไม่มีการบันทึกอะไรเลย
ถ้าฉันเปลี่ยนเจ้าของงานให้เป็นตัวฉันเองและเปลี่ยนการดำเนินการตามขั้นตอนเป็นบัญชีบริการตัวแทนของเซิร์ฟเวอร์ SQL งานจะทำงานสำเร็จและบันทึก 1,067 แถวเป็น [Metadata] [dbo]. [sysssislog]
ดูเหมือนว่ามีบางอย่างไม่ถูกต้องเกี่ยวกับวิธีการตั้งค่าพร็อกซี / ข้อมูลรับรอง ฉันทำผิดส่วนไหน