Запуск пакета служб SSIS из задания агента SQL, принадлежащего пользователю домена, не являющемуся системным администратором

16

У меня есть два пакета служб 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].

Похоже, что-то не так с настройкой прокси / учетных данных. Какую часть я делаю не так?

Матье Гиндон
источник

Ответы:

18

Проблема выглядит сложнее, чем есть. Поскольку вы используете SQL 2014, вы, вероятно, укушены новыми функциями безопасности, введенными в 2012 году.

Единственное, что на самом деле имеет значение, это:

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

Ваш логин пользователя Proxy, скорее всего, не имеет доступа к каталогу SSISDB (даже если он может иметь доступ к SQL Server).
Вам необходимо сопоставить имя пользователя с SSISDB и настроить доступ к папкам / проектам SSISDB в службах Integration Services.

Пожалуйста, посмотрите на это MSDN блоге после SSIS Доступ к каталогу Советы управления и SQL 2012 SSIS Каталог разрешений

После того, как вы действительно загрузите пакет, вы можете столкнуться с другими проблемами контекста безопасности, но вам следует улучшить ведение журнала в самих службах интеграции.

Том V - Команда Моника
источник
3
Именно это. Спасибо за то, что сделали все возможное :-)
Матье Гиндон