此文章适合于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[1].ToString();string[] connecstr = bb.Split();for (int i = 0; i < connecstr.Length; i++){//判断是否匹配到数组中的的密码if (connecstr[i].Contains("Password")){//获取带密码的字符串长度,比如:Password=Xeferfa0=长度为18int GrossPwdlth = connecstr[i].Length;//获取Password=后面的加密字符string RevertoldPwd = connecstr[i].Substring(9, GrossPwdlth - 9);//将获取到的密码密文进行解密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(0, 8));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, 0, 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, 0, 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 中进行封装测试,如下图,包 执行封装测试成功

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

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

转载于:https://www.cnblogs.com/Sientuo/p/5893659.html

关于SSIS中解密数据库字符串的方法相关推荐

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

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

  2. java中字符串和数组如何比较_[Java教程]javascript中数组和字符串的方法比较

    [Java教程]javascript中数组和字符串的方法比较 0 2016-07-19 23:00:05 ×目录[1]可索引 [2]转换 [3]拼接[4]创建[5]位置 前面的话 字符串和数组有很多的 ...

  3. Spring Jpa实体中出现数据库关键字解决方法

    Spring Jpa实体中出现数据库关键字解决方法 在Spring Jpa 中出现关键字是无法向数据库中添加等操作 有异常进行抛出. 这里可以使用字段个属性进行关联 @Column(name = &q ...

  4. mybatis中的xml中拼接sql中参数与字符串的方法

    场景 mybatis中接口方法对应的xml文件中的方法中,需要使用模糊搜索, 查询以参数开头的记录. 错误的sql拼接: <if test="locationVO != null an ...

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

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

  6. python字符串的方法和列表的方法_Python 中列表和字符串的方法总结

    一.列表 1.li.append()        #添加元素到末尾,返回none 2.li.clear()            #清空列表,一个比较危险的方法(QAQ) 3.li.copy()   ...

  7. python怎么更新数据库_在Python的Django框架中更新数据库数据的方法

    先使用一些关键参数创建对象实例,如下: >>> p = Publisher(name='Apress', ... address='2855 Telegraph Ave.', ... ...

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

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

  9. python展示数据库视图_在Django的视图中使用数据库查询的方法

    在视图中也有笨方法可以从数据库中获取数据. 很简单: 用现有的任何 Python 类库执行一条 SQL 查询并对结果进行一些处理. 在本例的视图中,我们使用了 MySQLdb 类库(可以从 http: ...

最新文章

  1. c语言编程题餐饮服务打分,求详细分析C语言题餐饮服务质量调查打分题和答案..._质量员考试_帮考网...
  2. EPOLL的工作模式 ET and LT
  3. redis与spring的完全集成
  4. 关于linux系统下文件压缩归档操作命令略提
  5. 单机最大负载_分布式高可靠之负载均衡,今天看了你肯定会
  6. cups支持的打印机列表_CUPS共享打印机服务
  7. Android视频播放器在播放前出现灰色图像
  8. 利用计算机名称共享打印机步骤,如何连接共享打印机汇总教程
  9. linux返回上级目录
  10. 河北农大计算机专业全国排名,2019河北农业大学现代科技学院专业排名
  11. 流程控制的三个练习题的问题,请求解释,谢谢
  12. arp在交换机级联情况下的访问
  13. Puppet erb模板介绍(三十二)
  14. win10触摸键盘TabTip软件特性
  15. linux之文件搜索和文件内容搜索
  16. 优化网络方法思维导图总结
  17. 中国各地特色商品大全
  18. 开始利用CSDN做学习笔记,从windows 游戏编程大师技巧和3D游戏编程大师开始
  19. Java常用框架学习
  20. 一种具有椭圆型金属钛球体的C4炸弹

热门文章

  1. 第19节 项目整体绩效评估.
  2. linux:apt的源
  3. java8 新特性 lambda过滤
  4. iOS知识小集·NSNumber to NSString出错啦
  5. springboot发送http请求
  6. 虚拟机里安装Linux系统出现乱码
  7. nodejs之express -- 1
  8. Webwork 学习之路【08】结合实战简析Controller 配置
  9. 【云栖大会】基因计算:解读生命的力量
  10. WCF学习之旅—基于Fault Contract 的异常处理(十八)