У меня есть два пакета служб SSIS, которые запускаются по расписанию в одночасье (через агента SQL Server) в рамках более крупного развертывания служб SSIS без каких-либо проблем. Все использует проверку подлинности Windows, а запланированное задание принадлежит системному администратору (ну, я) и выполняется как учетная запись службы агента SQL Server.
Таким образом, данные по существу идут source system ~> transit db ~> staging ~> NDS
за одну ночь.
Два пакета служб SSIS, которые мне нужны, обрабатывают transit db ~> staging
и staging ~> NDS
части соответственно для определенного набора данных.
Пользователь домена (не sysadmin) делает что-то в этом, source system
и это помещает интересные данные в transit db
, поэтому мне нужен способ получить эти обновленные данные в рабочее время для обновления NDS
: было решено, что этот человек самый простой способ вызвать этот ETL был нажатием кнопки в книге Excel с поддержкой макросов, которая подключается к SQL Server через ODBC (с использованием аутентификации Windows) и выполняет хранимую процедуру.
Хранимая процедура выглядит так:
create procedure dbo.UpdateMaterialInventory
as
begin
execute msdb.dbo.UpdateMaterialInventory;
end
Хранимая процедура «сестры» в [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 Server, который сопоставлен с подсистемой [Пакет служб интеграции SQL Server] с использованием имени учетной записи SSISProxyCredentials
. Логин пользователя домена был добавлен в учетную запись Прокси .
Они SSISProxyCredentials
были созданы с удостоверением того же пользователя домена, который всю ночь выполнял ETL служб SSIS, и его пароль был проверен в четыре раза.
Теперь, если я запускаю это:
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 Server, прогоны заданий, успешно и журналы 1067 строк в [Метаданные]. [DBO]. [Sysssislog].
Похоже, что-то не так с настройкой прокси / учетных данных. Какую часть я делаю не так?