PowerShell Refresh Excel без открытия файла Excel (проблема запланированного выполнения пакета с агентом SQL)
У меня есть пакет служб SSIS, который я разработал с "Задачей выполнения процесса" и "Задачей потока данных". У меня проблема с оформлением пакета.
РЕЗУЛЬТАТЫ: (Ручной или запланированный)
Все процессы успешны, если запуск выполняется вручную в 32-разрядном режиме из VS и SSISDB, когда я вхожу в систему с определенным профилем пользователя 'GEORGES/BL0040EP'.
- "Выполнить задачу процесса" - запустить сценарий powershell, чтобы обновить соединения Excel и сохранить файл Excel. (УСПЕХ)
- "Задача потока данных" - считывает данные Excel и вставляет их в таблицу SQL Server. (УСПЕХ)
Я пытаюсь запустить пакет с агентом SQL (используя учетную запись прокси), и у процесса есть некоторые проблемы.
- "Выполнить задачу процесса" - запустить сценарий powershell для обновления соединений Excel (НЕ РАБОТАЕТ, НЕ СООБЩЕНИЯ ОБ ОШИБКАХ). Сохраните файл Excel (УСПЕХ).
- "Задача потока данных" - считывает данные Excel и вставляет их в таблицу SQL Server. (УСПЕХ)
ПРОБЛЕМА:
powershell script to refresh the Excel file
казалось бы, не выдается на сервер SSAS при запуске изSQL Agent
, Не "запрос успешно выполнен". Не "запрос проблем с правами доступа". Просто "запрос вообще не выполняется". Проблемы с разрешениями не регистрируются и не обнаруживаются.
Я могу сказать, потому что я запустил SQL Profiler на сервере. Когда агент вызывает пакет, запрос не выполняется. Когда VS/SSISDIB вызывает пакет, я вижу, как выполняется запрос. Оба успешно с профилем пользователя (GEORGES\bl0040ep); и неудачно с ошибкой прав доступа с неавторизованным профилем пользователя (GEORGES\bl0040).
ВОПРОС:
Почему агент SQL не запускает запрос?
Я даже добавил к шикарной команде $env:UserName | Out-File -filepath
вывести текстовый файл, содержащий имя пользователя. И настройка учетной записи прокси-сервера, кажется, работает в ожидаемом контексте профиля пользователя. Содержание текстового файла bl0040ep
,
Создать учетную запись прокси
Создание прокси-пользователя для запуска пакета служб SSIS в агенте SQL Server
USE master
GO
-- Create a proxy credential for xp_cmdshell.
EXEC sp_xp_cmdshell_proxy_account 'GEORGES\bl0040ep', '!myPW!';--SELECT * FROM [master].[sys].[credentials]
-- Grant execute permission on xp_cmdshell to the SQL Server login account.
GRANT exec ON sys.xp_cmdshell TO [GEORGES\bl0040ep]
GO
-- Create a credential containing the GEORGES account PowerGEORGES\PowerUser and its password
CREATE CREDENTIAL Credential_BL0040EP WITH IDENTITY = N'GEORGES\bl0040ep', SECRET = N'!myPW!'
GO
USE [msdb]
GO
-- Create a new proxy called SSISProxy and assign the PowerUser credentail to it
EXEC msdb.dbo.sp_add_proxy @proxy_name=N'Proxy_BL0040EP',@credential_name=N'Credential_BL0040EP',@enabled=1
-- Grant SSISProxy access to the "SSIS package execution" subsystem
EXEC msdb.dbo.sp_grant_proxy_to_subsystem @proxy_name=N'Proxy_BL0040EP', @subsystem_id=11
-- Grant the login testUser the permissions to use SSISProxy
EXEC msdb.dbo.sp_grant_login_to_proxy @login_name = N'GEORGES\bl0040ep', @proxy_name=N'Proxy_BL0040EP'
GO
DatabaseSSAS_UsageStats_xlsx_ExcelRefresh.ps1
# Refresh the excel workbook connections and save the updated file
$file = 'C:\SVN\BusinessAnalysts\ExcelTools\DatabaseSSAS_UsageStats.xlsx'
$x1 = New-Object -ComObject Excel.Application
$x1.Visible = $false
$x1.DisplayAlerts = $False
$enddate = (Get-Date).tostring("dd-MM-yy")
# $filename = 'C:\SVN\BusinessAnalysts\ExcelTools\DatabaseSSAS_Usage Stats ' + $enddate + '.xlsx'
$filename = 'C:\SVN\BusinessAnalysts\ExcelTools\DatabaseSSAS_UsageStats.xlsx'
$env:UserName | Out-File -filepath C:\SVN\BusinessAnalysts\ExcelTools\RefreshAll_process.txt
$wb = $x1.workbooks.Open($file)
$wb.refreshall()
# REM: Use SLEEP to eliminate the message: "This will cancel a pending data refresh. Continue?"
Start-Sleep -Second 20
$wb.SaveAs($filename)
$wb.Close()
$x1.Quit()
Remove-Variable wb,x1
SQL Profiler
При запуске пакета из агента SQL не выполняется никаких действий. При запуске из VS и SSISDB регистрируется ошибка входа.
SQLProfiler_ (VS / SSIDB-connectionerror_user-bl0040).png
SQLProfiler_(SQL Agent-connection_no-активность).png
Нет изображения для атташе. Просто нет активности для пользователя (bl0040ep), когда пакет запускается в контексте агента SQL.
Ср 06/06/2019 14:31:46.96
ОБНОВЛЕНИЕ 1: папка системного рабочего стола
Я добавил папку "Рабочий стол" в System32, запустил задание из агента SQL, и проблема не исчезла. Это было рекомендовано для аналогичной проблемы, о которой сообщалось о проблемах TechNet с простым скриптом, выполняемым через агент SQL Server C:\Windows\System32\config\systemprofile\Desktop
а также C:\Windows\SysWOW64\config\systemprofile\Desktop
, Папка уже существует на SysWOW64.
ОБНОВЛЕНИЕ 2: исполняемый файл PowerShell в 32-разрядной версии
Я также попытался напрямую вызвать 32-разрядную версию PowerShell: %SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe
, Тем не менее обновление Excel не завершается при запуске через агент SQL с учетной записью прокси. Ссылка Запустите 32-битный скрипт Powershell на агенте сервера Sql.
ОБНОВЛЕНИЕ 3: Планировщик задач Windows вместо задания агента SQL
Я попробовал другой метод планирования для выполнения пакета (Windows Task Scheduler, вместо SQL Agent). Расписание завершается, но ведет себя точно так же, как и агент SQL... запрос не отправляется источнику данных. Справочник "Дневник Нирава", "Планирование пакета служб SSIS без развертывания", задача 2-Windows "Расписание"
1 ответ
Я решил эту проблему, удалив Excel с картинки. Вместо источника Excel теперь я использую соединитель .Net Providers for OleDb\Microsoft OLE DB Provider for Analysis Services 2.0
, Есть несколько дополнительных шагов, необходимых в базе данных, чтобы получить тот же набор данных (используя SQL Views
вместо Excel Powerquery M
).
Я проиграл этот бой в Excel... он не хотел быть автоматизированным. Я все-таки использовал те же ПОЛНОМОЧИЯ и ПРОКСИ для планирования работы.