1

我有一个大问题,我什至不知道要检查什么。我有一个大的 SSIS 包,它在开始时运行一个“执行脚本”任务(名为 ST_2275f0b3eced4c84bd35d4c826cab866.csproj),用 C# 编写,如下所示:

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using Microsoft.Win32;

namespace ST_2275f0b3eced4c84bd35d4c826cab866.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {
public void Main()
        {

            Dts.Variables["user_uca"].Value = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\TDCredentials").GetValue("user_uca").ToString();

            Dts.TaskResult = (int)ScriptResults.Success;
        }
    }
}

底线是它使用来自特定 Windows 注册表项的数据加载 SSIS 包变量。问题是当我从 Visual Studio 运行 SSIS 包时它可以工作。但是,当我运行为该 SSIS 包创建的 Sql 代理作业时,它给了我错误:System.Reflection.TargetInvocationException:调用目标已引发异常。---> System.NullReferenceException:对象引用未设置为对象的实例。在 ST_2275f0b3eced4c84bd35d4c826cab866.csproj.ScriptMain.Main() 此错误表示 Windows 注册表项不存在。因为如果我故意删除特定的 Windows 注册表项,然后从 Visual Studio 运行 SSIS 包,我会收到确切的错误消息。我已经检查了所有我能做的事情:具有这些 Windows 注册表项的 sql 服务器和主机 - 它们是相同的。我还为这些密钥授予了“所有人”的权限,我还把密钥放在了 HKLocalMachine 中,以确保它们对所有用户都存在,仍然是同样的错误。有什么提示吗?!在此先感谢,博格丹。

4

2 回答 2

1

问题最终是权限问题。运行 SQL 代理的服务帐户或您正在运行 SSIS 的子系统作业步骤的凭据没有读取注册表的该部分的能力。

您需要授予该用户访问权限或创建可以从注册表读取的委托。

作为旁注,您不必使用脚本方法。读取注册表值并将它们分配给变量是 SSIS 中的本机功能。有关该主题的更多信息,请参阅配置。您仍然需要处理权限问题,但是您不会在整个包中复制和粘贴代码。

于 2013-07-23T15:30:39.900 回答
0

如前所述,这是运行 sql 代理作业的帐户的权限问题。因此解决方案是首先从“Credentials”->“New Credential”制作一个新的凭证。在“身份”字段中,我选择具有系统管理员权限的用户(例如 john.doe)。在“凭据名称”字段中,我填写了“约翰”。然后从 Sql Server Agent -> Proxies -> SSIS Package Execution 我创建了“新代理”。我在“代理名称”处填写了一个名称(ProxyJohn),在“凭据名称”中选择了早期定义的凭据“John”,然后在“对以下子系统有效”字段中检查了“Sql Server 集成服务包”选项。然后,在我的 Sql Server Agent -> Jobs,在我的工作中(运行时给了我错误消息),

希望它会有所帮助。最好的问候, 波格丹

于 2013-07-24T07:55:09.187 回答