【发布时间】:2015-02-16 13:50:32
【问题描述】:
我正在尝试通过存储过程运行 SSIS 包,但在尝试导入 CSV 时收到 Access is denied 错误。
我将包放入作业中并运行它,只要我使用代理帐户,它就可以工作。我正在尝试使用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 包时遇到了这个错误:
当前的安全上下文无法恢复。请切换到调用 'Execute As' 的原始数据库,然后重试。
这是我修改后的代码:
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
通过查看我通常无法访问的系统表,我成功地测试了没有start_execution 的EXECUTE AS LOGIN 和REVERT。
【问题讨论】:
-
关于您在 UPDATE 中遇到的“切换到原始数据库”错误,在连接到 SSISDB 数据库之前,我遇到了同样的问题。对于未来的 Google 员工,遵循这些说明对我们有用:stackoverflow.com/a/60850142/1703887
标签: sql-server stored-procedures ssis impersonation sql-server-2014