gpt4 book ai didi

sql-server - 在没有 xp_cmdshell 的情况下以代理用户身份从存储过程执行 SSIS 包

转载 作者:行者123 更新时间:2023-12-04 12:54:15 26 4
gpt4 key购买 nike

我正在尝试通过存储过程运行 SSIS 包,但我收到了 Access is denied尝试导入 CSV 时出错。

我把这个包放在一个作业中并运行它,只要我使用代理帐户,它就可以工作。我正在尝试将该代理帐户复制到存储过程调用 没有 使用 xp_cmdshell .我也在 Visual Studio 中运行了这个包,它运行得很顺利。

我的 SSIS 包很简单:它从网络导入一个 CSV 文件,将数据转换为 varchar ,并将数据存储到表中。

甚至我的系统管理员也无法成功运行存储过程。

我的存储过程如下所示:

ALTER PROCEDURE [dbo].[spImportFile] 
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

DECLARE @execution_id bigint
EXEC SSISDB.CATALOG.create_execution
@folder_name = 'folder_name',
@project_name = 'project_name',
@package_name = 'package_name.dtsx',
@use32bitruntime = 1,
@execution_id = @execution_id output

EXEC SSISDB.CATALOG.start_execution @execution_id
END

我的问题是,如何在不使用 xp_cmdshell 的情况下以编程方式在此存储过程中使用代理用户?

更新:

感谢 billinkc,我现在正试图冒充我的代理用户,但现在我在执行 SSIS 包时遇到了这个错误:

The current security context cannot be reverted. Please switch to the original database where 'Execute As' was called and try it again.



这是我修改过的代码:
ALTER PROCEDURE [dbo].[spImportFile] 
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

EXECUTE AS LOGIN = 'domain\credentials'

DECLARE @execution_id bigint
EXEC SSISDB.CATALOG.create_execution
@folder_name = 'folder_name',
@project_name = 'project_name',
@package_name = 'package_name.dtsx',
@use32bitruntime = 1,
@execution_id = @execution_id output

EXEC SSISDB.CATALOG.start_execution @execution_id -- <<<< ERROR HERE!

REVERT

END

我测试成功 EXECUTE AS LOGINREVERT没有 start_execution通过查看我通常无法访问的系统表。

最佳答案

我已经意识到,由于我要模拟用户并且鼓励我使用工作,因此使用代理帐户在服务器上运行此 SSIS 包会更容易。

这是我的解决方案,包括运行作业:

ALTER PROCEDURE [dbo].[spImportFile] 
@intStatus int output
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

SELECT user_name() -- test before execute

EXECUTE AS LOGIN = 'domain\credentials'

SELECT user_name() -- test after execute

-- Start job
DECLARE @job_name VARCHAR(100) = 'JobName'
EXEC msdb.dbo.sp_start_job @job_name = @job_name

-- Wait for job to finish
DECLARE @job_history_id AS INT = NULL
DECLARE @intLimit AS INT = 10
DECLARE @intAttempt AS INT = 1

WHILE @intAttempt < @intLimit
BEGIN
SELECT TOP 1 @job_history_id = activity.job_history_id
FROM msdb.dbo.sysjobs jobs
INNER JOIN msdb.dbo.sysjobactivity activity ON activity.job_id = jobs.job_id
WHERE jobs.name = @job_name
ORDER BY activity.start_execution_date DESC

IF @job_history_id IS NULL
BEGIN
WAITFOR DELAY '00:00:01'
CONTINUE
END
ELSE
BEGIN
BREAK
END

SET @intAttempt = @intAttempt + 1
END

-- Check exit code
SELECT @intStatus = history.run_status
FROM msdb.dbo.sysjobhistory history
WHERE history.instance_id = @job_history_id

REVERT

SELECT user_name() -- test after revert

END

此职位代码基于此问题,“ Executing SQL Server Agent Job from a stored procedure and returning job result

调查结果 :
我了解到您需要 GRANT IMPERSONATE ON LOGIN::[domain\ProxyUser] to [domain\credentials]从这里 MSDN source .
ALTER DATABASE database_name SET TRUSTWORTHY ON是另一个设置 sysadmin需要实现和这个 MSDN source有助于解释用法。

备注 :
该解决方案基于我是 dbo 的事实。数据库和我有一个 sysadmin将代理帐户的模拟授予我的 Windows 安全组。我也在使用 Windows 身份验证。

我已经更新了这个问题,以不限制最初研究这个问题的任何人使用工作。如果有不需要工作的解决方案,我将非常乐意查看甚至更改此问题上已接受的解决方案。

关于sql-server - 在没有 xp_cmdshell 的情况下以代理用户身份从存储过程执行 SSIS 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27535338/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com