一切福田,不離方寸,從心而覓,感無不通。

Category Archives: Database

Oracle卸载后彻底清理痕迹

Oracle数据库在开始菜单中使用自带的程序卸载后,我们经常为了避免下次再次安装过程中这样那样的错误发生,我们要对Oracle进行下完全的卸载,下面是手工处理删除不掉的一些文件夹和目录。 常用Oracle数据库的同仁都知道,Oracle经常会莫名的出现一些错误,导致数据库无法正常启动或使用。   经过对出现这些问题的解决,后来找到了问题的根源,也就是再次安装Oracle数据库时,未对之前安装的Oracle进行彻底的卸载所导致。下面我就详细谈谈如何才能彻底卸载Oracle数据库   一、Linux 平台    Linux 平台下卸载Oracle 非常简单,即:删除Oracle安装目录下的所有文件和文件夹即可。   二、Windows 平台   其实这篇文章我主要想就在Windows平台上如何彻底的卸载Oracle进行说明。     因为Oracle在Windows下的卸载颇有一些麻烦,如果不能完全卸载有可能影响将来的再次安装!常规卸载方法是运行Oracle的自带的 卸载程序,可遗憾的是我在卸载时总不能完全卸载,当我再次安装Oracle时,就会出现莫名其妙的问题,并且这种卸载方式比较麻烦,比较慢,下面我介绍一 种比较快并且能够彻底卸载Oracle的方法。         1.关闭oracle所有的服务。可以在windows的服务管理器中关闭;    2.打开注册表:regedit 打开路径: 这一步中,可以用到我们在注册表清理软件一文中介绍的一款及其方便查找路径的小软件。Registry Manager   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\    删除该路径下的所有以oracle开始的服务名称,这个键是标识Oracle在windows下注册的各种服务!     3.打开注册表,找到路径:   HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE   删除该oracle目录,该目录下注册着Oracle数据库的软件安装信息。     4.删除注册的oracle事件日志,打开注册表   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application   删除注册表的以oracle开头的所有项目。     5.删除环境变量path中关于oracle的内容。   鼠标右键右单击“我的电脑-->属性-->高级-->环境变量-->PATH 变量。   删除Oracle在该值中的内容。注意:path中记录着一堆操作系统的目录,在windows中各个目录之间使用分号(;)隔开的,删除时注意。   建议:删除PATH环境变量中关于Oracle的值时,将该值全部拷贝到文本编辑器中,找到对应的Oracle的值,删除后,再拷贝修改的串,粘贴到PATH环境变量中,这样相对而言比较安全。     6.重新启动操作系统。     以上1~5个步骤操作完毕后,重新启动操作系统。     7.重启操作系统后各种Oracle相关的进程都不会加载了。这时删除Oracle_Home下的所有数据。(Oracle_Home指Oracle程序的安装目录)     8.删除C:\Program Files下oracle目录。     (该目录视Oracle安装所在路径而定)     9.删除开始菜单下oracle项,如:    C:\Documents and Settings\All Users\「开始」菜单\程序\Oracle – ora10g    不同的安装这个目录稍有不同。    如果不删除开始菜单下的Oracle相关菜单目录,没关系,这个不影响再次安装Oracle.当再次安装Oracle时,该菜单会被替换。     至此,Windows平台下Oracle就彻底卸载了。  到这里,我们的任务就完成了, 如果哪位人才有感兴趣的同仁可以自己编写一个小工具,用来彻底删除Oracle.提供上来大家一起用用,我想很多人会感激涕零的。  FROM:http://www.tree360.cn/blog/article.asp?id=123

龙生   07 Feb 2012
View Details

数据库点滴之精妙SQL语句

SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作,方便自己写SQL时方便一点,想贴上来,一起看看,同时希望大家能共同多多提意见,也给我留一些更好的佳句,整理一份《精妙SQL速查手册》,不吝赐教!   一、基础   1、说明:创建数据库

  2、说明:删除数据库

  3、说明:备份sql server

  4、说明:创建新表

  5、说明:删除新表

  6、说明:增加一个列

  注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。   7、说明:添加主键

  说明:删除主键

  8、说明:创建索引

  说明:删除索引

  注:索引是不可更改的,想更改必须删除重新建。   9、说明:创建视图

  说明:删除视图

  10、说明:几个简单的基本的sql语句

  11、说明:几个高级查询运算词   A: UNION 运算符   UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。   B: EXCEPT 运算符   EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。   C: INTERSECT […]

龙生   29 Dec 2011
View Details

SQL Server性能调优之执行计划第一次实践

自从上一篇文章发出之后,收到了很朋友的关注。很多朋友要求多多实践,而不是纯粹的理论。确实,从打算出这个系列开始,我就本着实践的思想来进行的!同时,为了使得大家更好的理解、消化这些知识,我会定期的就所写内容进行在线的视频讲座,朋友们可以去参与这个小组:http://www.agilesharp.com/c/sqlprofiler.aspx,报名活动开始啦:http://www.agilesharp.com/Event.aspx/T-2   议程如下:   实践概述 图形化执行计划实战 执行计划信息解读   实践概述   执行计划可以辅助我们写出高效率的T-SQL代码,同时也可以找出现有T-SQL代码的问题,还可以监控数据库!当然,最后如何使用执行计划还是取决于我们自己了,但是不管怎么样,我们首先学会解析执行计划中所包含的信息,最快的学习方法就是实践。下面,我们就从一个实践开始。   为了使得大家易于理解,这里的例子不会太复杂,随着课程的不断深入,后续的示例也会越来越复杂。同时,如果大家也想跟着一起动手实践,那么希望朋友们安装SQL2005或更高版本,同时记得安装AdventureWorks数据库。下载地址为:http://msftdbprodsamples.codeplex.com   另外,有一个需要注意的是,由于数据库中数据,操作和时间的关系,可能大家在运行脚本产生的执行计划和我这里不完全一样,这是没有任何问题的!   图形化执行计划实战   下面我们正式进入要讨论的话题。   首先,为了使得我们可以查看执行计划,最起码要确保我们在登录数据库的时候,要被授予权限,如下语句所示:

  为了将讨论集中在执行计划(估计执行计划和实际执行计划)上,我们这里这是运行一个比较简单的查询,如下代码所示:

  下面,我们就来看看这个语句的估计执行计划,正如之前文章讲述的:估计执行计划是优化器使用了的元数据,成本分析算法等而产生的计划,这个计划是查询语句执前的一个分析!   显示估计执行计划   我们可以采用以下几种方式显示估计执行计划:   点击Sql Server Studio工具栏上的按钮: 在查询窗口右击鼠标,如下所示: 使用快捷键“CTRL + L”.   对以上面的查询语句,显示的图形化的估计查询计划如下:     显示执行查询计划   与估计执行计划不同,实际的执行计划不是优化器产生的,实际的执行计划是底层的存储引擎在执行时候产生的,这个计划中包含了大量的实际的底层数据和相关的信息。   我们可以采用以下方式获得实际的执行计划,如下所示:   点击工具栏上面的按钮: 在查询窗口右击鼠标,如下: 快捷键“CTRL + M”   上述查询的实际执行计划如下所示:     大家初一看,以为两者没有区别,但是它们包含的数据信息很多是不一样的。   下面,我们就开始对图形化的执行计划进行解读。 执行计划信息解读   刚刚大家已经看了图形化的执行计划了,相关大家比较关心的问题有两个:如何解读执行计划中提供的各种信息;如何采用执行计划来进行性能调优。   我们首先来看看第一个问题。   一般而言,我们在阅读图形化的执行计划的时候顺序是这样的:从右向左,从下往上。也就说:sql执行的第一步就显示在执行计划的右下角。   在图形化执行计划中的每一个图标,都表示一个操作,在之前的执行计划中就有两个操作。并且每个操作之前采用箭头连接起来,表明了数据流动的方向,其中箭头的粗细就反应了数据量的大小。   另外,在每个操作下面都显示了一个百分比。   对于估计执行计划而言,这个数字就是优化器对执行计划中每一个操作步骤进行成本分析后的结果。例外,在我们的例子中,整个查询最后会有两个操作会进行,Select和Table Scan,其中整个查询的成本将会落在Table Scan(整表扫描)上。   操作提示信息   当我们把鼠标放在每个操作或箭头上面的时候,就会弹出更多的相关信息,我们下面就来具体的看一看。   例如,当我们把鼠标放在执行计划的Select操作上面,显示如图:     上面图中给出的信息非常清楚了,我这里只是解释一下“估计子树大小”。因为执行计划可以看出是sql语句的逻辑执行步骤,这个选项就告诉我们:在我们现在所看的这个操作步骤以及后面的所有步骤的开销是多少,是一个总计数字。   如何朋友们还有有什么不清楚的,我们在后续将要展开的在线讲座中讲述!   […]

龙生   29 Dec 2011
View Details

养成一个SQL好习惯带来一笔大财富

我们做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员流动大,那么我么还能保证下一段时间系统还能流畅的运行吗?那么还能保证下一个人能看懂我么的存储过程吗?那么我结合公司平时的培训和平时个人工作经验和大家分享一下,希望对大家有帮助。   要知道sql语句,我想我们有必要知道sqlserver查询分析器怎么执行我么sql语句的,我么很多人会看执行计划,或者用profile来监视和调优查询语句或者存储过程慢的原因,但是如果我们知道查询分析器的执行逻辑顺序,下手的时候就胸有成竹,那么下手是不是有把握点呢?   一:查询的逻辑执行顺序   (1) FROM < left_table>   (2) ON < join_condition>   (3) < join_type> JOIN < right_table>   (4) WHERE < where_condition>   (5) GROUP BY < group_by_list>   (6) WITH {cube | rollup}   (7) HAVING < having_condition>   (8) SELECT (9) DISTINCT (11) < top_specification> < select_list>   (10) ORDER BY < order_by_list>   标准的SQL 的解析顺序为:   (1).FROM 子句 组装来自不同数据源的数据   (2).WHERE 子句 基于指定的条件对记录进行筛选   (3).GROUP BY 子句 将数据划分为多个分组   (4).使用聚合函数进行计算   (5).使用HAVING子句筛选分组   (6).计算所有的表达式   (7).使用ORDER BY对结果集进行排序 二 执行顺序:   […]

龙生   29 Dec 2011
View Details

SQL Server优化50法

虽然查询速度慢的原因很多,但是如果通过一定的优化,也可以使查询问题得到一定程度的解决。   查询速度慢的原因很多,常见如下几种:   没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) I/O吞吐量小,形成了瓶颈效应。 没有创建计算列导致查询不优化。 内存不足 网络速度慢 查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。 返回了不必要的行和列 查询语句不好,没有优化   可以通过如下方法来优化查询 :   把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要. 纵向、横向分割表,减少表的尺寸(sp_spaceuse) 升级硬件 根据查询条件,建立索引、优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段 提高网速; 扩大服务器的内存,Windows 2000和SQL server 2000能支持4-8G的内存。配置虚拟内存:虚拟内存大小应基于计算机上并发运行的服务进行配置。运行 Microsoft SQL Server 2000 时,可考虑将虚拟内存大小设置为计算机中安装的物理内存的 1.5 倍。如果另外安装了全文检索功能,并打算运行 Microsoft 搜索服务以便执行全文索引和查询,可考虑:将虚拟内存大小配置为至少是计算机中安装的物理内存的 3 倍。将 SQL Server max server memory 服务器配置选项配置为物理内存的 1.5 倍(虚拟内存大小设置的一半)。 增加服务器CPU个数;但是必须明白并行处理比串行处理更需要资源例如内存。使用并行还是串行程是MsSQL自动评估选择的。单个任务分解成多个任务,就可以在处理器上运行。例如耽搁查询的排序、连接、扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消耗大量的CPU的查询最适合并行处理。但是更新操作UPDATE,INSERT,DELETE还不能并行处理。 如果是使用like进行查询的话,简单的使用index是不行的,但是全文索引耗空间。 like 'a%' 使用索引 like '%a' 不使用索引。用 like '%a%' 查询时,查询耗时和字段值总长度成正比,所以不能用CHAR类型,而是VARCHAR。对于字段的值很长的建全文索引。 DB Server 和APPLication Server分离;OLTP和OLAP分离 分布式分区视图可用于实现数据库服务器联合体。联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制能够扩大一组服务器,以支持大型的多层 Web 站点的处理需要。有关更多信息,参见设计联合数据库服务器。(参照SQL帮助文件’分区视图') 在实现分区视图之前,必须先水平分区表 在创建成员表后,在每个成员服务器上定义一个分布式分区视图,并且每个视图具有相同的名称。这样,引用分布式分区视图名的查询可以在任何一个成员服务器上运行。系统操作如同每个成员服务器上都有一个原始表的复本一样,但其实每个服务器上只有一个成员表和一个分布式分区视图。数据的位置对应用程序是透明的。 重建索引DBCC REINDEX ,DBCC INDEXDEFRAG,收缩数据和日志DBCC SHRINKDB,DBCC SHRINKFILE. 设置自动收缩日志.对于大的数据库不要设置数据库自动增长,它会降低服务器的性能。 在T-sql的写法上有很大的讲究,下面列出常见的要点:首先,DBMS处理查询计划的过程是这样的: 查询语句的词法、语法检查 将语句提交给DBMS的查询优化器 优化器做代数优化和存取路径的优化 由预编译模块生成查询规划 然后在合适的时间提交给系统处理执行 最后将执行结果返回给用户其次,看一下SQL SERVER的数据存放的结构:一个页面的大小为8K(8060)字节,8个页面为一个盘区,按照B树存放。 Commit和rollback的区别Rollback:回滚所有的事务。Commit:提交当前的事务.没有必要在动态SQL里写事务,如果要写请写在外面。如: begin tran exec(@s) commit […]

龙生   29 Dec 2011
View Details

监控SQL Server的运行状况

Microsoft SQL Server 2005 提供了一些工具来监控数据库。方法之一是动态管理视图。动态管理视图 (DMV) 和动态管理函数 (DMF) 返回的服务器状态信息可用于监控服务器实例的运行状况、诊断问题和优化性能。   常规服务器动态管理对象包括:   dm_db_*:数据库和数据库对象 dm_exec_*:执行用户代码和关联的连接 dm_os_*:内存、锁定和时间安排 dm_tran_*:事务和隔离 dm_io_*:网络和磁盘的输入/输出   此部分介绍为监控 SQL Server 运行状况而针对这些动态管理视图和函数运行的一些常用查询。   示例查询   您可以运行以下查询来获取所有 DMV 和 DMF 名称:

  监控 CPU 瓶颈   CPU 瓶颈通常由以下原因引起:查询计划并非最优、配置不当、设计因素不良或硬件资源不足。下面的常用查询可帮助您确定导致 CPU 瓶颈的原因。   下面的查询使您能够深入了解当前缓存的哪些批处理或过程占用了大部分 CPU 资源。

  下面的查询显示缓存计划所占用的 CPU 总使用率(带 SQL 文本)。

  下面的查询显示 CPU 平均占用率最高的前 50 个 SQL 语句。

  下面显示用于找出过多编译/重新编译的 DMV 查询。

  下面的示例查询显示已重新编译的前 25 个存储过程。plan_generation_num 指示该查询已重新编译的次数。

  效率较低的查询计划可能增大 CPU 占用率。   下面的查询显示哪个查询占用了最多的 CPU 累计使用率。

  下面的查询显示一些可能占用大量 CPU 使用率的运算符(例如 ‘%Hash Match%’、‘%Sort%’)以找出可疑对象。

[…]

龙生   29 Dec 2011
View Details

SET IDENTITY_INSERT 学习心得

想要将值插入到自动编号(或者说是标识列,IDENTITY)中去,需要设定 SET IDENTITY_INSERT 示例: 1.首先建立一个有标识列的表:CREATE TABLE products (id int IDENTITY PRIMARY KEY, product varchar(40)) 2.尝试在表中做以下操作:INSERT INTO products (id, product) VALUES(3, 'garden shovel') 结果会导致错误:“当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'products' 中的标识列插入显式值。” 3.改用:SET IDENTITY_INSERT products ONINSERT INTO products (id, product) VALUES(1, 'garden shovel') 返回正确。 4.建立另外一个表products2,尝试相同插入操作:CREATE TABLE products2 (id int IDENTITY PRIMARY KEY, product varchar(40)) 然后执行:SET IDENTITY_INSERT products2 ONINSERT INTO products2 (id, product) VALUES(1, 'garden shovel') 导致错误:“表 'material.dbo.products' 的 IDENTITY_INSERT 已经为 ON。无法对表 'products2' 执行 SET 操作。” 改为执行:SET IDENTITY_INSERT products OFFSET IDENTITY_INSERT products2 ONINSERT INTO products2 (id, product) VALUES(2, 'garden shovel') 执行通过。 5.尝试以下操作:SET IDENTITY_INSERT […]

龙生   05 Aug 2011
View Details

mysql百度百科

MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。而2009年,SUN又被Oracle收购.对于Mysql的前途,没有任何人抱乐观的态度.目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。         名称简介 MySQL最初的开发者的意图是用mSQL和他们自己的快速低级例程(ISAM)去连接表格。不管怎样,在经过一些测试后,开发者得出结论:mSQL并没有他们需要的那么快和灵活。这导致了一个使用几乎和mSQL一样的API接口的用于他们的数据库的新的SQL接口的产生,这样,这个API被设计成允许为用于mSQL而写的第三方代码更容易移植到MySQL。   MySQL这个名字是怎么来的已经不清楚了。基本指南和大量的库和工具带有前缀“my”已经有10年以上,而且不管怎样,MySQL AB创始人之一的Monty Widenius的女儿也叫My。这两个到底是哪一个给出了MySQL这个名字至今依然是个迷,包括开发者在内也不知道。   MySQL的海豚标志的名字叫“sakila”,它是由MySQL AB的创始人从用户在“海豚命名”的竞赛中建议的大量的名字表中选出的。获胜的名字是由来自非洲斯威士兰的开源软件开发者Ambrose Twebaze提供。根据Ambrose所说,Sakila来自一种叫SiSwati的斯威士兰方言,也是在Ambrose的家乡乌干达附近的坦桑尼亚的Arusha的一个小镇的名字。   自身特性 1.使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性   2.支持AIX、FreeBSD、HP-UX、Linux、Mac OS、Novell Netware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统   3.为多种编程语言提供了API。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。   4.支持多线程,充分利用CPU资源   5.优化的SQL查询算法,有效地提高查询速度   6.既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中提供多语言支持,常见的编码如中文的GB 2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名   7.提供TCP/IP、ODBC和JDBC等多种数据库连接途径   8.提供用于管理、检查、优化数据库操作的管理工具   9.可以处理拥有上千万条记录的大型数据库   应用环境 与其他的大型数据库例如Oracle、DB2、SQL Server等相比,MySQL自有它的不足之处,如规模小、功能有限(MySQL Cluster的功能和效率都相对比较差)等,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本。   目前Internet上流行的网站构架方式是LAMP(Linux+Apache+MySQL+PHP),即使用Linux作为操作系统,Apache作为Web服务器,MySQL作为数据库,PHP作为服务器端脚本解释器。由于这四个软件都是免费或开放源码软件(FLOSS),因此使用这种方式不用花一分钱(除开人工成本)就可以建立起一个稳定、免费的网站系统。   管理软件 可以使用命令行工具管理MySQL数据库(命令mysql 和 mysqladmin),也可以从MySQL的网站下载图形管理工具MySQL Administrator和MySQL Query Browser。   phpMyAdmin是由php写成的MySQL资料库系统管理程式,让管理者可用Web界面管理MySQL资料库。   phpMyBackupPro也是由PHP写成的,可以透过Web界面创建和管理数据库。它可以创建伪cronjobs,可以用来自动在某个时间或周期备份MySQL 数据库。   另外,还有其他的GUI管理工具,例如早先的mysql-front 以及 ems mysql manager,navicat 等等。   存储引擎 MyISAM Mysql的默认数据库,最为常用。拥有较高的插入,查询速度,但不支持事务   InnoDB 事务型数据库的首选引擎,支持ACID事务,支持行级锁定   BDB 源自Berkeley DB,事务型数据库的另一种选择,支持COMMIT和ROLLBACK等其他事务特性   Memory 所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失   Merge 将一定数量的MyISAM表联合而成一个整体,在超大规模数据存储时很有用   Archive 非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive拥有高效的插入速度,但其对查询的支持相对较差   Federated […]

龙生   07 May 2011
View Details

SQL事务

一、事务概念    事务是一种机制、是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。因此事务是一个不可分割的工作逻辑单元。在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的。这特别适用于多用户同时操作的数据通信系统。例如:订票、银行、保险公司以及证券交易系统等。 二、事务属性事务4大属性:1   原子性(Atomicity):事务是一个完整的操作。2   一致性(Consistency):当事务完成时,数据必须处于一致状态。3   隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的。4   持久性(Durability):事务完成后,它对于系统的影响是永久性的。 三、创建事务T-SQL中管理事务的语句:1 开始事务: begin transaction2 提交事务:commit transaction3 回滚事务: rollback transaction 事务分类:1 显式事务:用begin transaction明确指定事务的开始。2 隐性事务:打开隐性事务:set implicit_transactions on,当以隐性事务模式操作时,SQL Servler将在提交或回滚事务后自动启动新事务。无法描述事务的开始,只需要提交或回滚事务。3 自动提交事务:SQL Server的默认模式,它将每条单独的T-SQL语句视为一个事务。如果成功执行,则自动提交,否则回滚。 示例:张三转800元到李四帐户上。  use stuDBgo--创建帐户表bank--if exists(select* from sysobjects where name=’bank')    drop table bankcreate table bank(    customerName char(10),    --顾客姓名    currentMoney money        --当前余额)go/**//*--添加约束,帐户不能少于元--*/alter table bank add        constraint CK_currentMoney check(currentMoney>=1)/**//*--插入测试数据--*/insert into bank(customerName,currentMoney)select '张三',1000 unionselect '李四',1 select * from bankgo /**//*--使用事务--*/use stuDBgo--恢复原来的数据--update bank set currentMoney=currentMoney-1000 where customerName=’李'set nocount on    --不显示受影响的行数print '查看转帐事务前的余额'select * from bankgo /**//*--开始事务--*/begin transactiondeclare @errorSum int    --定义变量,用于累计事务执行过程中的错误/**//*--转帐--*/update bank set currentMoney=currentMoney-800 where customerName=’张三'set @errorSum=@errorSum+@@error    --累计是否有错误update bank set currentMoney=currentMoney+800 where customerName=’李四'set @errorSum=@errorSum+@@error --累计是否有错误 […]

龙生   23 Mar 2011
View Details

注意那些容易被忽略的SQL注入技巧

导读:下面我要谈到一些Sqlserver新的Bug(注入),这些都是从长期的工作中总结出来的经验,现在拿出来与大家一起分享,希望能够对大家有所帮助。 1.关于Openrowset和Opendatasource 可能这个技巧早有人已经会了,就是利用openrowset发送本地命令。通常我们的用法是(包括MSDN的列子)如下: select * from openrowset('sqloledb',’myserver';’sa';",’select * from table') 可见(即使从字面意义上看)openrowset只是作为一个快捷的远程数据库访问,它必须跟在select后面,也就是说需要返回一个recordset 。 那么我们能不能利用它调用XP_cmdshell呢?答案是肯定的! select * from openrowset('sqloledb',’server';’sa';",’set fmtonly off exec master.dbo.XP_cmdshel l "dir c:\"') 必须加上setfmtonlyoff用来屏蔽默认的只返回列信息的设置,这样XP_cmdshell返回的output集合就会提交给前面的select显示,如果采用默认设置,会返回空集合导致select出错,命令也就无法执行了。 那么如果我们要调用sp_addlogin呢,他不会像XP_cmdshell返回任何集合的,我们就不能再依靠fmtonly设置了,可以如下操作: select * from openrowset('sqloledb',’server';’sa';",’select "OK!" exec master.dbo.sp_addlogin Hectic') 这样,命令至少会返回select OK!’的集合,你的机器商会显示OK!,同时对方的数据库内也会增加一个Hectic的账号,也就是说,我们利用select 'OK!’的返回集合欺骗了本地的select请求,是命令能够正常执行,通理sp_addsrvrolemember和opendatasource也可以如此操作!至于这个方法真正的用处,大家慢慢想吧。 2.关于Msdasql两次请求的问题 不知道大家有没有试过用msdasql连接远程数据库,当然这个api必须是sqlserver的管理员才可以调用,那么如下: select * from openrowset('msdasql',’driver={sql server};server=server;address=server,1433;uid=sa;pwd=;database=master;network=dbmssocn',’s elect * from table1 select * from table2′) 当table1和table2的字段数目不相同时,你会发现对方的sqlserver崩溃了,连本地连接都会失败,而系统资源占用一切正常,用pskill杀死 sqlserver进程后,如果不重启机器,sqlserver要么无法正常启动,要么时常出现非法操作,我也只是碰巧找到这个bug的,具体原因我还没有摸透,而且很奇怪的是这个现象只出现在msdasql上,sqloledb就没有这个问题,看来问题不是在于请求集合数目和返回集合数目不匹配上,应该还是msdasql本身的问题,具体原因,大家一起慢慢研究吧。 3.可怕的后门 以前在网上看到有人说在 sqlserver上留后门可以通过添加triger、jobs或改写sp_addlogin和sp_addsrvrolemember做到,这些方法当然可行,但是很容易会被发现。不知道大家有没有想过sqloledb的本地连接映射。呵呵,比如你在对方的sqlserver上用sqlserver的管理员账号执行如下的命令: select * from openrowset('sqloledb',’trusted_connection=yes;data source=Hectic',’set fmtonly off exec master..XP_cmdshell "dir c:\"') 这样在对方的sqlserver上建立了一个名为Hectic的本地连接映射,只要sqlserver不重启,这个映射会一直存在下去,至少我现在还不知道如何发现别人放置的连接映射,好了,以上的命令运行过后,你会发现哪怕是sqlserver没有任何权限的guest用户,运行以上这条命令也一样能通过!而且权限是 localsystem!(默认安装)呵呵!这个方法可以用来在以被入侵过获得管理员权限的sqlserver上留下一个后门了。以上的方法在 sqlserver2000 sqlserver2000SP1上通过! 另外还有一个猜测,不知道大家有没有注意过windows默认附带的两个dsn,一个是localserver一个是msqi,这两个在建立的时候是本地管理员账号连接sqlserver的,如果对方的 sqlserver是通过自定义的power user启动,那么sa的权限就和power user一样,很难有所大作为,但是我们通过如下的命令: select * from openrowset ('msdasql',’dsn=locaserver;trusted_connection=yes',’set fmtonly off execmaster..XP_cmdshell "dir c:\"') 应该可以利用localserver的管理员账号连接本地sqlserver然后再以这个账号的权限执行本地命令了,这是后我想应该能突破sa那个power user权限了。现在的问题是sqloledb无法调用dsn连接,而msdasql非管理员不让调用,所以我现在正在寻找guest调用msdasql […]

龙生   23 Mar 2011
View Details
1 36 37 38 40