SQL Server 数据恢复

今天下午接到大张老师电话,问能不能恢复SQL Server中已经被删除的一条记录,忽然想起若干年前牙牙老师也问过我这个问题,于是放狗搜索了下,找到了解决方案。

因为SQL Server是基于日志管理的数据库系统,每一笔操作都有详细的日志作为记录,这为我们做恢复提供了非常有利的先决条件,通过搜索引擎,我查找到了一款名为“LogExplorer”的商业软件,可以对SQL Server的日志进行分析,并通过日志恢复数据。

这是一款商业软件,未注册版本可以使用30天,安装的时候需要同时安装客户端及服务器端。软件运行界面如下图。

LogExplorer

而我们要做的非常简单,点击左侧的“View Log”即可查询所有的日志信息,如下图:

LogExplorer-1

因为我们的日志数量非常多,而日志中又记录了全部的CRUD操作,我们只想筛选某一时间的某种操作,怎么办呢,很简单,点选上图工具栏的第一个图标即可。点击之后,他会让你选择筛选条件,如下图:

LogExplorer-2

除了可以设置筛选的时间之外,我们还可以按照操作进行筛选~如下图:

LogExplorer-3

在这里我仅仅针对删除的记录做筛选,从上图中看出,我们几乎可以对所有的操作进行筛选~筛选完成点击“Apply”。系统便会给出我们筛选结果~

LogExplorer-4

经过我们的筛选,列表中只剩下一条记录啦,经查,这条记录就是被我们误删的记录。那我们想要恢复这条记录,也只是仅仅需要在记录上面点右键,选择“Undo Transaction”如下图。

LogExplorer-5

他的恢复并不是直接作用于数据库,而是生成对应操作的逆操作脚本,所以在选择“Undo Transaction”之后,系统会让你给出脚本的保存位置。系统导出的脚本如下:

LogExplorer-6

最后再通过SQL Server自带的查询分析器执行生成的脚本,即可恢复记录。

点此下载:LogExpress

更多关于Log Explorer的使用,可以参考:

LogExplore的一个详细操作手册

SqlCommand SqlDataAdapter DataSet 等相关概念的解释(转)

sqlconnection数据库连接对象:只有联接才能进行其它操作
sqldataadapter数据适配器对象,就是用某个sqlconnection,执行某个查询语句(SELECT语句),放到某个DataSet里
sqlcommand 数据命令对象(SELECT,INSERT,DELETE,UPDATE等,还可以是存储过程) SqlCommand.Parameter属性传sql参数
ExecuteScalar :执行查询,返回单个字段,比如求和的结果,平均值,最大最小值等等
ExecuteReader执行快速只读向前查询,一般对单条记录的多个字段逐个查询,多条记录亦可,

通俗点说吧,通常来说是这样的:

DataSet和SqlDataAdapter在一起用,就没SqlCommand什么事了,通常作用是把某张表的信息显示出来,比如显示在GridView上之类的

ExecuteNonQuery和SqlCommand一起用,也就没DataSet和SqlDataAdapter什么事了,通常用在对数据的增加、修改、删除,注意查询不能用它

要说查询SqlDataReader和SqlCommand一起使用,是用来查询的,我想你是这个意思,按照我的理解,查询少量数据的时候使用SqlDataReader比较方便和灵活,效率也高,比如查询某一行数据之类的

另外还有个ExecuteScalar也和SqlCommand一起用作用,返回单个值,如求和、总行数等SQL语句的聚合函数,比如SELECT COUNT(*) FROM 表名1

SqlConnection
表示 SQL Server 数据库的一个打开的连接。

System.Data.SqlClient.SqlConnection

SqlConnection 对象表示与 SQL Server 数据源的一个唯一的会话。对于客户端/服务器数据库系统,它相当于到服务器的网络连接。SqlConnection 与 SqlDataAdapter 和 SqlCommand 一起使用,以便在连接 Microsoft SQL Server 数据库时提高性能。对于所有第三方 SQL 服务器产品以及其他支持 OLE DB 的数据源,请使用 OleDbConnection。

SqlDataAdapter
表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。

System.Data.SqlClient.SqlDataAdapter

SqlDataAdapter 是 DataSet 和 SQL Server 之间的桥接器,用于检索和保存数据。SqlDataAdapter 通过对数据源使用适当的 Transact-SQL 语句映射 Fill(它可更改 DataSet 中的数据以匹配数据源中的数据)和 Update(它可更改数据源中的数据以匹配 DataSet 中的数据)来提供这一桥接。

SqlDataAdapter 与 SqlConnection 和 SqlCommand 一起使用,以便在连接到 Microsoft SQL Server 数据库时提高性能。若要访问其他数据源,可使用 OleDbDataAdapter 以及与之关联的 OleDbCommand 和 OleDbConnection。

SqlDataAdapter 还包括 SelectCommand、InsertCommand、DeleteCommand、UpdateCommand 和 TableMappings 属性,使数据的加载和更新更加方便。

SqlCommand
表示要对 SQL Server 数据库执行的一个 Transact-SQL 语句或存储过程。

System.Data.SqlClient.SqlCommand

SqlCommand 特别提供了以下对 SQL Server 数据库执行命令的方法:

ExecuteReader 执行返回行的命令。为了提高性能,ExecuteReader 使用 Transact-SQL sp_executesql 系统存储过程调用命令。因此,如果用于执行像 Transact-SQL SET 语句这样的命令,ExecuteReader 可能无法获得预期效果。

ExecuteNonQuery 执行如 Transact-SQL INSERT、DELELE、UPDATE 和 SET 语句等命令。

ExecuteScalar 从数据库中检索单个值(例如一个聚合值)。

ExecuteXmlReader 将 CommandText 发送到 Connection 并生成一个 XmlReader 对象。

sql server express 启用sa及附加数据库的方法

最近一直在玩VS,因为VS自带的那个Sql Server Express没有企业管理器,所以感觉特别鸡肋,于是我在虚拟机里搞了一个Sql Server的服务器,可是今天这个Vmware又起不来了,于是我只好啃啃这块鸡肋~~

还好鸡肋也不是特别鸡肋,至少提供了可以执行sql语句的地方~我的思路很简单,附加数据库,然后用存储过程修改sa密码,之后再用sa链接数据库。思路很清晰,可是事实证明,思路永远跟显示存在着差距:

附加数据库的步骤很顺利,通过一个内置的存储过程  sp_attach_db ‘数据库名’,’数据库全路径’,’日志全路径’ 这样就把附加数据库搞定了~~修改sa密码同样也很easy,修改了master表,  ALTER LOGIN [sa] WITH PASSWORD=N’新密码’ 这样就搞定了修改密码。可是当我尝试用sa与新密码登陆时,却被告知sa登陆失败,上网查询了下下,发现express版默认登陆验证方式是windows方式,而常规的更改方法需要企业管理器,没办法只好用非常规的办法了,查了半天资料,终于在CSDN找到了有用的东西:

想要修改登陆模式,可以通过修改注册表的办法进行

2005:HKLMSOFTWAREMicrosoftMicrosoft SQL ServerMSSQL.1MSSQLServerLoginMode
2008:HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL ServerMSSQL10.MSSQLSERVERMSSQLServerLoginMode

1:windows身份验证
2:混合身份验证

这下就好了,我改了注册表,重启了Sql server服务,却出现了新的问题,提示 “sa已被禁用”汗……再接着搜索,发现还是修改master表可以解决这个问题:

USE [master]
GO
ALTER   LOGIN   sa   ENABLE   ;

至此,就可以使用sa跟密码进行登录咯~~

PS:最后附个SQL Server Management Studio Express 2005的下载链接吧:点此下载

记一个很奇怪的数据导入故障

今天中午接到W老师的电话说文传系的W老师遇到了一个奇怪的问题~~我对奇怪的问题很感兴趣,于是就兴冲冲的去了。去了以后才发现是关于高校学生毕业生的一个系统,他成绩导不进去~~提示也很奇怪,说“第一行与数据库字段不符,无法导入”还说“文件中含有非法字符”,可是我们检查了几乎所有的记录,都没有发现有问题的地方。呵呵,最后一个不经意间,改了一下名,竟然数据成功导入了~~~

总结:如果以后遇到这种在线导入数据的时候,一定要检查下数据名,这个可能最容易被忽略掉。嗯嗯。

很神奇的Access数据库问题

Teacher W 给我了一个很奇怪的任务,让我给出一套Asp+Access完成的系统的数据库结构。我查看了这个Access数据库,加密了,这个很简单,从网上随便找一个解密工具,就OK了。

不过接下来的情况却让我大吃一惊。这个数据库里一个表都没有,我查看了对应的Asp程序,程序却正常的访问了所有的表,而且也没有提示出错。很神奇。找了很多资料,最后找到了一个第三方的数据库查看工具,可以看到库结构了,但是无法修改。在好奇心的驱使下,我继续对这个数据库进行了研究。最终,发现了Access中很不起眼的一个功能——隐藏表功能。

如下图,Kaisir新建了一个数据库,库中有一个表:“基本情况”

access

接下来,我们选中这个要隐藏的表,并单击鼠标右键。选择“属性”。

access1

注意到上图中标注的“隐藏”属性了么。选中它。这个“基本情况”表就消失了~

access3

嘿嘿 是不是隐藏了~~那怎样再让他显示出来呢?
方法也很简单~

选择菜单栏中的“查看”,“选项”找到其中“视图”选项卡,如下图:

access4

然后选中“隐藏对象”单击确定。就OK了~~

数据库行列转换【转】

create table tb
(
  Name    varchar(10) ,
  Subject varchar(10) ,
  Result  int
)

insert into tb(Name , Subject , Result) values(‘张三’ , ‘语文’ , 74)
insert into tb(Name , Subje…

create table tb
(
  Name    varchar(10) ,
  Subject varchar(10) ,
  Result  int
)

insert into tb(Name , Subject , Result) values(‘张三’ , ‘语文’ , 74)
insert into tb(Name , Subject , Result) values(‘张三’ , ‘数学’ , 83)
insert into tb(Name , Subject , Result) values(‘张三’ , ‘物理’ , 93)
insert into tb(Name , Subject , Result) values(‘李四’ , ‘语文’ , 74)
insert into tb(Name , Subject , Result) values(‘李四’ , ‘数学’ , 84)
insert into tb(Name , Subject , Result) values(‘李四’ , ‘物理’ , 94)
go
———
–动态SQL,指subject不止语文、数学、物理这三门课程。
declare @sql varchar(8000)
set @sql = ‘select Name as ‘ + ‘姓名’
select @sql = @sql + ‘ , max(case Subject when ”’ + Subject + ”’ then Result else 0 end) [‘ + Subject + ‘]’
from (select distinct Subject from tb) as a
set @sql = @sql + ‘ from tb group by name’
exec(@sql)
/*
姓名        数学        物理        语文         
———- ———– ———– ———–
李四        84          94          74
张三        83          93          74
*/

奇怪的ODBC连接问题

今天S同学终于完成了他用PowerBuilder开发的英语四六级报名系统。我用我的电脑帮他测试。可是此时出现了一个很奇怪的问题,我按要求设置好了ODBC数据源,可运行程序依然提示ODBC数据源错,检查了很多遍ODBC,我并没有设置出错。。。后来讲PB的Share文件夹拷贝到运行目录下,故障解决。后来查询到是因为没有pbodb110.dll造成的。。。这个问题真的很神奇 神奇。。。

今天S同学终于完成了他用PowerBuilder开发的英语四六级报名系统。我用我的电脑帮他测试。可是此时出现了一个很奇怪的问题,我按要求设置好了ODBC数据源,可运行程序依然提示ODBC数据源错,检查了很多遍ODBC,我并没有设置出错。。。后来讲PB的Share文件夹拷贝到运行目录下,故障解决。后来查询到是因为没有pbodb110.dll造成的。。。这个问题真的很神奇 神奇。。。

SQL Server 2000 服务无法启动故障

今天上课,有几台电脑的SQLServer无法启动,系统提示服务启动后又停止了。

查了很多资料,并没有解决问题,不过在一个偶然间注意到系统时间为“2002年”将系统时间改为正常时间,故障解决。

今天上课,有几台电脑的SQLServer无法启动,系统提示服务启动后又停止了。

查了很多资料,并没有解决问题,不过在一个偶然间注意到系统时间为“2002年”将系统时间改为正常时间,故障解决。