Mark Standeven Ответов: 0

Я пытаюсь сканировать пакеты служб SSIS, развернутые на SQL server, на наличие определенных элементов кода


Этот SQL-запрос возвращает все пакеты служб SSIS, видимые при расширении узла "каталоги служб Integration Services" в среде SQL Server Management Studio:
USE SSISDB

SELECT [package_id]
	  ,fd.name as fd_name
	  ,proj.name as proj_name
      ,pk.[name] as pk_name
      ,[package_guid]
FROM [catalog].[packages] pk
	INNER JOIN [catalog].[projects] proj ON pk.project_id = proj.project_id
	INNER JOIN [catalog].[folders] fd ON proj.folder_id = fd.folder_id
ORDER BY fd.name, proj.name, pk.name


Что я уже пробовал:

В C# я использую приведенный ниже код для перебора приведенной выше таблицы данных.
("cn" - это класс со строковым атрибутом "Connstr" и методом "DataTableSQL", который возвращает объект DataTable и принимает приведенную выше строку SQL в качестве аргумента).
Ни один из пакетов не зашифрован и не требует пароля для выполнения, т. е. используются аргументы "null" для "serverUserName" и "serverPassword".
Строка подключения:
"источник данных=Имя сервера;Начальный Каталог=Имя базы данных;Комплексная Безопасность=True;В Сохранять Сведения О Безопасности=False В"
SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder(cn.ConnStr);
Application ssisApplication = new Application();

DataTable dt = cn.DataTableSQL(<SQL>);
foreach (DataRow dr in dt.Rows)
{
    string fd_name = "", proj_name = "", pk_name = "", pk_location = "";
    if (!dr.IsNull(1)) fd_name = dr[1].ToString();
    if (!dr.IsNull(2)) proj_name = dr[2].ToString();
    if (!dr.IsNull(3))
    {
        FileInfo fp = new FileInfo(dr[3].ToString());
        pk_name = fp.Name.Substring(0, fp.Name.Length - fp.Extension.Length);
        pk_location = string.Format(@"\{0}\{1}\{2}", fd_name, proj_name, pk_name);
    }

    try
    {
        Package pkg = new Package();
        pkg = ssisApplication.LoadFromSqlServer(pk_name, csb.DataSource, null, null, null);
        // Processing steps to be added to parse pkg.Executables...
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message, pk_name);
    }
}

Я получаю эту ошибку для каждой строки данных:
Цитата:
Указанный пакет не может быть загружен из базы данных SQL Server.

Какую комбинацию "fd_name", "proj_name" и "pk_name" лучше всего использовать для "pk_location", если она используется в качестве первого аргумента функции "LoadFromSqlServer" вместо "pk_name"?
Любая помощь будет очень признательна.

RedDk

"Какая комбинация ... и т. д."? Очевидно, любой, который работает. "Лучший" ... ни одно слово не имеет никакого значения в программном смысле, особенно если оно не используется в качестве ключевого слова в коде.

0 Ответов