此文章适合于SSIS新手,我是个小白,在繁复查阅资料后仍无果到最后解决问题,走了很多弯路,现在讲其中一些关于SSIS的理解写出来,供大家参考,在正文之前,我就我自己的理解,阐明一些概念。
什么是SSIS? 大数据中会涉及到一个概念, 叫ETL,中文就是数据的提取、加载、转换。SSIS是ETL常用工具中的一种,具体的这位仁兄的博客写的很详细http://www.cnblogs.com/qinpengming/archive/2011/12/06/2278299.html。我就不过多赘述了
如果从SSIS包中需要读取SQL数据库中的连接信息,当然前提是这些信息是加密过的。需要一个媒介,来进行解密,再将解密后的连接字符串进行赋值,来让SSIS包正常执行封装测试。其实思路很明确,但是过程中总是会遇到一些莫名其妙的问题,尤其是在做升级的时候。
关于封装密碼明文的解決方案如下:
- 當把包在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。
|
||
使用密码加密敏感数据 (EncryptSensitiveWithPassword) |
使用密码只加密包中敏感属性的值。 DPAPI 用于此加密。 敏感数据作为包的一部分保存,但数据是使用当前用户在创建包或导出包时提供的密码加密的。 若要在 SSIS 设计器中打开包,用户必须提供包密码。 如果不提供该密码,则包虽然可以打开但其中不包含敏感数据,当前用户必须为敏感数据提供新值。 如果用户试图在不提供密码的情况下执行包,则包执行将会失败。 有关密码和命令行执行的详细信息,请参阅dtexec 实用工具。 当与 dtutil 实用工具一起使用时,此保护级别对应的值为 2。 |
||
使用用户密钥加密敏感数据 (EncryptSensitiveWithUserKey) |
使用基于当前用户配置文件的密钥只加密包中敏感属性的值。 只有使用同一配置文件的同一个用户才能加载此包。 如果其他用户打开该包,敏感信息将被替换为空白,当前用户必须为敏感数据提供新值。 如果用户试图执行该包,则包执行将会失败。 DPAPI 用于此加密。 当与 dtutil 实用工具一起使用时,此保护级别对应的值为 1。
|
||
依靠服务器存储进行加密 (ServerStorage) |
使用 SQL Server 数据库角色保护整个包。 在将包保存到 SQL Server msdb 数据库后,支持此选项。 此外,SSISDB 目录使用 ServerStorage 保护级别。 在将包从 SQL Server Data Tools (SSDT) 保存到文件系统时,不支持此选项。 |
5.设置完后,请把packag关闭,在开启。看Connection Managers里面的数据库连接有沒有报红,如果沒有,就说明设置好了。
6.所有的准备工作都已完成,将包附加到SQL2012 中进行封装测试,如下图,包 执行封装测试成功
作为资深小白,记录第一篇随笔,留下个脚印
-------市人皆大笑,举手揶揄之
关于SSIS中解密数据库字符串的方法的更多相关文章
-
关于SSIS中解密FTP字符串的方法
FTP(File Transfer Protocol),是文件传输协议的简称.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Application).用户可以通过它把自己的PC ...
-
C#中oracle数据库的连接方法
C#中oracle数据库的连接方法 一.关于数据库的操作 1.数据库连接 有2种: 第一种:古老的方法(较为死板,不利于灵活操作),即用OracleConnection的类来连接 ...
-
[翻译]python3中新的字符串格式化方法-----f-string
从python3.6开始,引入了新的字符串格式化方式,f-字符串. 这使得格式化字符串变得可读性更高,更简洁,更不容易出现错误而且速度也更快. 在本文后面,会详细介绍f-字符串的用法. 在此之前,让我 ...
-
(数据科学学习手札131)pandas中的常用字符串处理方法总结
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在日常开展数据分析的过程中,我们经常需要对 ...
-
javascript中数组和字符串的方法比较
× 目录 [1]可索引 [2]转换 [3]拼接[4]创建[5]位置 前面的话 字符串和数组有很多的相同之处,它们的方法众多,且相似度很高:但它们又有不同之处,字符串是不可变值,于是可以把其看作只读的数 ...
-
Sql Server中三种字符串合并方法的性能比较
文章来自:博客园-DotNet菜园 最近正在处理一个合并字符吕的存储过程,在一个测试系统的开发中,要使用到字符串合并功能,直接在Sql中做.示例:有表內容﹕名称 內容1 abc1 ...
-
ES6中的模板字符串使用方法
传统的 JavaScript 语言,输出模板通常是这样写的. $('#result').append( 'There are <b>' + basket.count + '</b&g ...
-
mysql中replace替换字符串更改方法
MySQL中update替换部分字符串replace的简单用法 近日,遇到了需要将部分字符串替换为另外的字符,平时用的最多的是直接update整个字段值,在这种情况下效率比较低,而且容易出错.其实my ...
-
在SQL SERVER中批量替换字符串的方法
UPDATE MainData SET Content = )) , 'XM00000137' , 'XM00000078') WHERE [Key] IN (SELECT md_key FROM i ...
随机推荐
-
android 很多牛叉布局github地址(转)
原文地址 http://blog.csdn.net/luo15309823081/article/details/41449929 点击可到达github-------https://github.c ...
-
IFeatureCursor.Flush
IFeatureCursor.Flush Method Flush any outstanding buffered writes to the database. [Visual Basic .NE ...
-
MVC之Razor语法
Razor是MVC3中才有的新的视图引擎.我们知道,在ASP.NET中,ASPX的视图引擎依靠<%和%>来调用C#指令.而MVC3以后有了一套新的使用@标记的Razor语法,使用起来更灵活 ...
-
用 JMH 检测 Lambdas 序列化性能
本文将介绍如何进行 Java Lambdas 序列化性能检测.Lambdas 的重要性以及 Lambdas 在分布式系统中的应用. Lambdas 表达式是 Java 8 中万众期待的新特性,其若干用 ...
-
对pathtracing的一些个人理解
本人水平有限,若有错误也请指正~ 上面说到pathtracing(pt)的一些优点和缺点,优点即其实现很简单,这就是大概为什么当今市面上流行的很多渲染器如今都相继采用pathtracing算法为核心进 ...
-
linux虚拟机下解压文件
pscp命令上传文件到linux虚拟机 项目开发过程中,经常需要从windows向linux服务器上传下载文件.下面简单介绍一下如何上传下载文件. 下载安装putty软件:https://pan. ...
-
BZOJ_2134_单选错位——期望DP
BZOJ_2134_单选错位——期望DP 题意: 分析:设A为Ai ∈ [1,ai+1] 的概率,B为Ai = A(imodn+1)的概率显然P(A|B) = 1,那么根据贝叶斯定理P(B) = P( ...
-
IP通信基础学习第八周
安装完华三模拟器,拖多台设备到工作区,全部启动及配置,建立好拓扑图,之后启动命令行终端. 配置登录用户,口令的指令有: <H3C> //用户直行 ...
-
InnoDB体系架构(一)后台线程
InnoDB体系架构——后台线程 上一篇已经了解了MySQL数据库的体系结构 这一篇除了介绍InnoDB存储引擎的体系架构外,同时进一步了解InnoDB的后台线程. InnoDB存储引擎是多线程的模型 ...
-
C# WebSocket解析(收发数据包、分片超长包处理)
using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptograph ...