此文章适合于SSIS新手,我是个小白,在繁复查阅资料后仍无果到最后解决问题,走了很多弯路,现在讲其中一些关于SSIS的理解写出来,供大家参考,在正文之前,我就我自己的理解,阐明一些概念。

什么是SSIS? 大数据中会涉及到一个概念, 叫ETL,中文就是数据的提取、加载、转换。SSIS是ETL常用工具中的一种,具体的这位仁兄的博客写的很详细http://www.cnblogs.com/qinpengming/archive/2011/12/06/2278299.html。我就不过多赘述了

如果从SSIS包中需要读取SQL数据库中的连接信息,当然前提是这些信息是加密过的。需要一个媒介,来进行解密,再将解密后的连接字符串进行赋值,来让SSIS包正常执行封装测试。其实思路很明确,但是过程中总是会遇到一些莫名其妙的问题,尤其是在做升级的时候。

关于封装密碼明文的解決方案如下:

  1. 當把包在VS2015中打開之後,點擊SSIS菜單欄下的Package Configuration,查看鏈接管理配置信息。所以如下圖所示

2.当我们选择用是脚本来解密数据库连接字符串的时候,就不再需要用配置包的SQL连接来获取了,所以需要删除相关的数据库配置数据,组态只保留除连接数据库配置以外的连接信息。因为组态读取某个数据库的配置信息,我们会把数据库里面的数据库连接加密,下面Connection Managers是识别不了加密的数据库连接,这样在VS2015上是可以正常跑,但是数据库调用会报错。所以我们要把组态里面的数据库连接删除。用脚本去数据库里面取读取数据库连接,并解密,把解密出来的数据库连接赋值给Connection Managers。

3.添加一个腳本放在每個Package最前面,然后脚本中先写一个用windows身份连接的

 public static string GetConDb(string filter, string Dbname)
{
string Reaconn = "";
string constr = "Data Source=.;Initial Catalog=IBBC;Integrated Security=SSPI;";
string sqlstr = "SELECT * FROM IBBC.dbo.Table_1 where temp1='"+filter+"' and temp2='"+Dbname+"'";
SqlConnection con = new SqlConnection(constr);
SqlCommand cmd = new SqlCommand(sqlstr, con);
con.Open();
try
{
SqlDataReader sdr = cmd.ExecuteReader();
while (sdr.Read())
{
//此处获取对应的整个sql身份验证的连接字符串
string bb = sdr[].ToString();
string[] connecstr = bb.Split();
for (int i = ; i < connecstr.Length; i++)
{
//判断是否匹配到数组中的的密码
if (connecstr[i].Contains("Password"))
{
//获取带密码的字符串长度,比如:Password=Xeferfa0=长度为18
int GrossPwdlth = connecstr[i].Length;
//获取Password=后面的加密字符
string RevertoldPwd = connecstr[i].Substring(, GrossPwdlth - );
//将获取到的密码密文进行解密
string newpwd = DecryptDES(RevertoldPwd, UUkey);
//将密文密码替换成明文密码
bb = bb.Replace(RevertoldPwd, newpwd);
} }
Reaconn = bb;
}
return Reaconn;
}
catch (Exception ex)
{ throw new Exception(ex.Message); ;
}
finally
{
con.Close();
}
}

然后再用脚本组件中自带的DTs对象,将解密后的连接字符串赋值给配置数据源的名字 Dts.Connections[item].ConnectionString = Reaconn; , 当然中间采用什么加密方式,什么解密方式,各位都是大神,初级的也不是很难,我用的Des加密,如下。

    private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
//密钥
private static string UUkey = "********";
/**/
/**/
/**/
/// <summary>
/// DES加密字符串
/// </summary>
/// <param name="encryptString">待加密的字符串</param>
/// <param name="encryptKey">加密密钥,要求为8位</param>
/// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
public static string EncryptDES(string encryptString, string encryptKey)
{
try
{
byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(, ));
byte[] rgbIV = Keys;
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, , inputByteArray.Length);
cStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray()); }
catch
{
return encryptString;
}
}
/**/
/**/
/**/
/// <summary>
/// DES解密字符串
/// </summary>
/// <param name="decryptString">待解密的字符串</param>
/// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
/// <returns>解密成功返回解密后的字符串,失败返源串</returns>
public static string DecryptDES(string decryptString, string decryptKey)
{
try
{
byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
byte[] rgbIV = Keys;
byte[] inputByteArray = Convert.FromBase64String(decryptString);
DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, , inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}
catch
{
return decryptString;
} }

4.到目前为止,所有的代码工作已经完成,剩下的就是配置问题,当我在VS2015环境中跑包全部通过之后,就只剩下SQL2012上进行封装跑包,在此期间,需要鼠标点击整个项目右键选中属性,此时在右侧属性栏位中,在ProtectionLevel 下选择EncryptSensitiveWithUserKey模式,之前没选择该模式,VS中关闭再打开包,连接数据源那里就会报红,VS和sql跑包都会失败,sql中提示未正确连接数据库,这里足足卡壳了两天,终于找到是这里保护级别的原因,具体内容见下表

不保存敏感数据 (DontSaveSensitive)

保存包时不保存包中敏感属性的值。 这种保护级别不进行加密,但它防止标记为敏感的属性随包一起保存,因此其他用户将无法使用这些敏感数据。 如果其他用户打开该包,敏感信息将被替换为空白,用户必须提供这些敏感信息。

当与 dtutil 实用工具 (dtutil.exe) 一起使用时,此保护级别对应的值为 0。

使用密码加密所有数据 (EncryptAllWithPassword)

使用密码加密整个包。 使用用户在创建包或导出包时提供的密码加密包。 若要在 SSIS 设计器中打开包或使用 dtexec 命令提示实用工具运行包,用户必须提供包密码。 如果没有密码,用户将无法访问或运行包。

当与 dtutil 实用工具一起使用时,此保护级别对应的值为 3。

使用用户密钥加密所有数据 (EncryptAllWithUserKey)

使用基于当前用户配置文件的密钥加密整个包。 只有创建包或导出包的用户才可以在 SSIS 设计器中打开包或使用 dtexec 命令提示实用工具运行包。

当与 dtutil 实用工具一起使用时,此保护级别对应的值为 4。

注意

对于使用用户密钥的保护级别,Integration Services 使用 DPAPI 标准。 有关 DPAPI 的详细信息,请参阅位于 http://msdn.microsoft.com/library 的 MSDN Library。

使用密码加密敏感数据 (EncryptSensitiveWithPassword)

使用密码只加密包中敏感属性的值。 DPAPI 用于此加密。 敏感数据作为包的一部分保存,但数据是使用当前用户在创建包或导出包时提供的密码加密的。 若要在 SSIS 设计器中打开包,用户必须提供包密码。 如果不提供该密码,则包虽然可以打开但其中不包含敏感数据,当前用户必须为敏感数据提供新值。 如果用户试图在不提供密码的情况下执行包,则包执行将会失败。 有关密码和命令行执行的详细信息,请参阅dtexec 实用工具

当与 dtutil 实用工具一起使用时,此保护级别对应的值为 2。

使用用户密钥加密敏感数据 (EncryptSensitiveWithUserKey)

使用基于当前用户配置文件的密钥只加密包中敏感属性的值。 只有使用同一配置文件的同一个用户才能加载此包。 如果其他用户打开该包,敏感信息将被替换为空白,当前用户必须为敏感数据提供新值。 如果用户试图执行该包,则包执行将会失败。 DPAPI 用于此加密。

当与 dtutil 实用工具一起使用时,此保护级别对应的值为 1。

注意

对于使用用户密钥的保护级别,Integration Services 使用 DPAPI 标准。 有关 DPAPI 的详细信息,请参阅位于 http://msdn.microsoft.com/library 的 MSDN Library。

依靠服务器存储进行加密 (ServerStorage)

使用 SQL Server 数据库角色保护整个包。 在将包保存到 SQL Server msdb 数据库后,支持此选项。 此外,SSISDB 目录使用 ServerStorage 保护级别。

在将包从 SQL Server Data Tools (SSDT) 保存到文件系统时,不支持此选项。

5.设置完后,请把packag关闭,在开启。看Connection Managers里面的数据库连接有沒有报红,如果沒有,就说明设置好了。

6.所有的准备工作都已完成,将包附加到SQL2012 中进行封装测试,如下图,包 执行封装测试成功

作为资深小白,记录第一篇随笔,留下个脚印

-------市人皆大笑,举手揶揄之

												

关于SSIS中解密数据库字符串的方法的更多相关文章

  1. 关于SSIS中解密FTP字符串的方法

    FTP(File Transfer Protocol),是文件传输协议的简称.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Application).用户可以通过它把自己的PC ...

  2. C#中oracle数据库的连接方法

    C#中oracle数据库的连接方法 一.关于数据库的操作 1.数据库连接      有2种:      第一种:古老的方法(较为死板,不利于灵活操作),即用OracleConnection的类来连接 ...

  3. [翻译]python3中新的字符串格式化方法-----f-string

    从python3.6开始,引入了新的字符串格式化方式,f-字符串. 这使得格式化字符串变得可读性更高,更简洁,更不容易出现错误而且速度也更快. 在本文后面,会详细介绍f-字符串的用法. 在此之前,让我 ...

  4. (数据科学学习手札131)pandas中的常用字符串处理方法总结

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在日常开展数据分析的过程中,我们经常需要对 ...

  5. javascript中数组和字符串的方法比较

    × 目录 [1]可索引 [2]转换 [3]拼接[4]创建[5]位置 前面的话 字符串和数组有很多的相同之处,它们的方法众多,且相似度很高:但它们又有不同之处,字符串是不可变值,于是可以把其看作只读的数 ...

  6. Sql Server中三种字符串合并方法的性能比较

    文章来自:博客园-DotNet菜园 最近正在处理一个合并字符吕的存储过程,在一个测试系统的开发中,要使用到字符串合并功能,直接在Sql中做.示例:有表內容﹕名称  內容1     abc1      ...

  7. ES6中的模板字符串使用方法

    传统的 JavaScript 语言,输出模板通常是这样写的. $('#result').append( 'There are <b>' + basket.count + '</b&g ...

  8. mysql中replace替换字符串更改方法

    MySQL中update替换部分字符串replace的简单用法 近日,遇到了需要将部分字符串替换为另外的字符,平时用的最多的是直接update整个字段值,在这种情况下效率比较低,而且容易出错.其实my ...

  9. 在SQL SERVER中批量替换字符串的方法

    UPDATE MainData SET Content = )) , 'XM00000137' , 'XM00000078') WHERE [Key] IN (SELECT md_key FROM i ...

随机推荐

  1. 李洪强iOS经典面试题134-C语言

    可能碰到的iOS笔试面试题(4)--C语言   C语言,开发的基础功底,iOS很多高级应用都要和C语言打交道,所以,C语言在iOS开发中的重要性,你懂的.里面的一些问题可能并不是C语言问题,但是属于计 ...

  2. gerrit使用教程

      注:使用时把“user”替换为自己的账号,例如 ueapp: ssh://huang.fei@10.0.64.16:29418/jonet2_0_app_ueapp.git 新的环境下需要先注册g ...

  3. js打印功能

    1.window.print方式: jsp页面 打印按钮:       <input type="button" value="打印" onclick=& ...

  4. Python之路(二)

    (1)python的内置函数(BIF) python3中内置了70多个BIF,常用的几个有: list():创建一个新的空列表. range():输入次数参数,返回一个迭代固定次数的迭代器. enum ...

  5. c#面向对象基础 类、方法、方法重载

    C#是纯粹的面向对象编程语言,它真正体现了“一切皆为对象”的精神.在C#中,即使是最基本的数据类型,如int,double,bool类型,都属于System.Object(Object为所有类型的基类 ...

  6. 判断pc端还是移动,并给移动加上其它的样式文件方法

      所有移动端PC端 按 640 进行排版 body, html { width: %; height: %; overflow: hidden; background-color: #; } bod ...

  7. string用法

    截取字符串 string strTributeInfo = "1#2#3#4#5#6#7"; vector<string> vecTribute; StringUtil ...

  8. Vim简要说明

    说明:在这篇文章里面,[C-X] 代表 Ctrl + X--就是按住 Ctrl 键然后再按 X.而且你可以在很多情况下使用 :help command 来获得大部分命令的帮助,这个是VIM的内部帮助文 ...

  9. 给RecyclerView实现的GridView加上HeaderView和FooterView

    给RecyclerView设置布局管理器 GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3); 写适配器,添加子项 ...

  10. Json 、 Jsonp

    SONP is simply a hack to allow web apps to retrieve data across domains. It could be said that it vi ...