MS SQL Server常见经典问题汇集整理
2009-11-17 22:56
295 查看
MS SQL Server常见经典问题汇集整理
SQL Server 2000中全文检索的使用 引言 微软的SQL Server数据库是一个在中低端企业应用中占有广泛市场的关系型数据库系统,它以简单、方便、易用等特性深得众多软件开发人员和数据库管理人员的钟爱。但SQL Server 7.0以前的数据库系统由于没有全文检索功能,致使无法提供像文本内容查找此类的服务,成为一个小小的遗憾。从SQL Server 7.0起,到如今的SQL Server 2000终于具备了全文检索功能,使用户可以高效地检索存储在数据库char、varchar、text、ntext、nchar、nvarchar等数据类型列中的文本数据。 建立全文索引 在进行全文检索之前,必须先建立和填充数据库全文索引。为了支持全文索引操作,SQL Server 7.0新增了一些存储过程和Transact-SQL语句。使用这些存储过程创建全文索引的具体步骤如下(括号内为调用的存储过程名称): 1. 启动数据库的全文处理功能(sp_fulltext_ database);; 2. 建立全文检索目录(sp_fulltext_catalog); 3.在全文检索目录中注册需要全文索引的表(sp_fulltext_table); 4. 指出表中需要全文检索的列名(sp_fulltext_ column);; 5. 为表创建全文索引(sp_fulltext_table);; 6. 填充全文检索目录(sp_fulltext_catalog)。 下面举例说明如何创建全文索引,在本例中,对Test数据库Book表中Title列和Notes列建立全文索引。 use test //打开数据库 //打开全文索引支持,启动SQL Server的全文搜索服务 execute sp_fulltext_database ‘enable’ //建立全文检索目录ft_test execute sp_fulltext_catalog ‘ft_test’, ‘create’ 为Title列建立全文索引数据元,pk_title为Book表中由主键所建立的唯一索引,这个参数是必需的。 execute sp_fulltext_table ‘book’,‘create’, ‘ft_test’,‘pk_title’ //设置全文索引列名 execute sp_fulltext_column ‘book’, ‘title’, ‘add’ execute sp_fulltext_column ‘book’,‘notes’, ‘add’ //建立全文索引 execute sp_fulltext_table ‘book’, ‘activate’ //填充全文索引目录 execute sp_fulltext_catalog ‘ft_test’, ‘start_full’ 至此,全文索引建立完毕。 进行全文检索 SQL Server 2000提供的全文检索语句主要有CONTAINS和FREETEXT。CONTAINS语句的功能是在表的所有列或指定列中搜索:一个字或短语;一个字或短语的前缀;与一个字相近的另一个字;一个字的派生字;一个重复出现的字。 CONTAINS语句的语法格式为: CONTAINS({column | *}), <contains_search _condition> ) 其中,column是搜索列,使用“*”时说明对表中所有全文索引列进行搜索。Contains_search_ condition 说明CONTAINS语句的搜索内容,其语法格式为: {<simple_term>|<prefix_term>|<proximity_term>|<generation_term>|<weighted_term>}[{{AND|AND NOT|OR}<contains_search_condition>}] [...n] 下面就simple_term和prefix_term参数做简要说明: simple_term是CONTAINS语句所搜索的单字或短语,当搜索的是一个短语时,必须使用双引号作为定界符。其格式为: {‘word’|“ phrase”} prefix_term说明CONTAINS语句所搜索的字或短语前缀,其格式为: {“word*” | “phrase*”} 例如,下面语句检索Book表的Title列和Notes列中包含“database”或“computer”字符串的图书名称及其注释信息: select title, notes from book where contains(tilte, ‘database’) or contains(notes,‘database’) or contains(title,‘computer’) or contains(notes,‘computer’) FREETEXT语句的功能是在一个表的所有列或指定列中搜索一个自由文本格式的字符串,并返回与该字符串匹配的数据行。所以,FREETEXT语句所执行的功能又称做自由式全文查询。 FREETEXT语句的语法格式为:FREETEXT({column | * },‘freetext_string’) 其中,column是被搜索列,使用“*”时说明对表中的所有全文索引列进行搜索。Freetext_string参数指出所搜索的自由文本格式字符串。 例如,下面语句使用FREETEXT语句搜索Book表中包含“Successful Life”字符串的数据行: select title, notes from book where freetext(*,‘Successful Life’)
一、背景 一旦系统正常运行以后,系统维护最主要工作就是数据安全与可恢复性。本方案(以下提到的数据库均指微软的Sql Server7.0或以上数据库)主要探讨数据库备份与恢复。 一般的数据备份解决方案无非是以下三种:(1)、磁带备份;(2)、双机热备份;(3)、手工备份。作为一般的中小型政府部门和企业采用磁带备份,代价太高,性能价格比不高;普遍采用的可能是双机热备份方案,但是用户可能依然不放心,还需要手工备份,把数据存放到一个与外界断绝联系的可控环境中,这种情况是普通存在的。所以作为双机热备份方案的辅助方案或者在条件限制的情况下,作为双机热备份的替代方案,有必要整理出一套手工备份方案。 二、设计思路 Sql Server数据库本身提供非常方便强大的备份功能(DTS),可以以向导的方式引导用户备份到本地局域网的机器或者远程的机器上,但是现在出现一个问题:就是一旦数据库大了的话,本地局域网备份速度可以接受,可是远程备份,尤其是拨号上网,速度就可能慢,一旦时间过长,网络可能断掉,又得重新备份,能否提出一种方案充分利用Sql Server数据库本身已有的备份功能(DTS),同时又解决备份速度慢的问题,考虑到数据库备份文件的可压缩比率非常高,可以直接对备份文件进行压缩操作,是否更有效率? 下面是设计思路,最后定型取决于两种方式效率的高低。 第一步:利用Sql Server本身带有的备份功能(DTS)把数据库全部或者差额定时备份到某个目录,一旦备份成功,这时候在指定的备份目录下有.bak文件存在; 第二步:利用公司自开发的解压缩组件RichZip把.bak文件压缩成另一个文件.zip文件,RichZip的压缩比等同于WinZip; 第三步:通过Http协议下载.zip文件到本地,按照不同的项目和日期保存; 第四步:如果需要恢复,把.zip文件解压缩成.bak文件,然后再用Sql Server的工具把备份文件恢复; 需要实验解决的几个问题: 1、在同一环境下,直接使用Sql Server的备份工具与这种方案所需要的时间哪一个更长?是否在不同量级里面有不同的结果? 2、是自己利用组件开发一个基于http协议的下载程序,还是直接采用其它的共享下载工具是否更有效率?比如说NetAnts(网络蚂蚁)或者其它下载工具。 说明: 1、该方案只在微软平台上做过实际操作:操作系统Window NT4.0或者以上(推荐使用Win2000),数据库Sql Server6.5或者以上(推荐使用Sql7.0)。 三、实际情况 3.1 实验结果 3.1.1 实验一结果:无论在哪种连接环境下,局域网还是拨号上网,直接使用Sql Server的备份工具与本方案的效率差距都比较大,只是由于数据库小时,直接使用Sql Server的备份工具比本方案方便一些。 以下是一些简单的、不完整的实际操作数据,仅供参考。 操作环境:联想56K调制解调器,上网速度52K,通过SysGate上网,平均3K左右。 库名 备份文件大小 压缩文件大小 下载时间 Sql备份工具 本方案 SoftEnterPrise 27970Kb 2109Kb(13.26倍) 没有耐心等待,强行中断 12分钟 SoftProduct 10265Kb 739Kb(13.89倍) 18分钟 3分钟 SoftProductHz 11948Kb 930Kb(12.85倍) 25分钟 5分钟 实际操作过程中是使用网络蚂蚁下载的,三个库的备份文件一共50MB,压缩后一共不到4MB;使用Sql备份工具,至少需要一个小时左右,而使用要方案最多不超过20分钟,这中间的效率是不可比拟的,还不包括在使用Sql备份工具时如果断网造成的延时。 3.1.2 实验二结果:建议使用专门的下载工具,如网络蚂蚁或者其它下载工具,是基于如下考虑:A、专门的下载工具功能强大,提供断点续传、多线程、定时下载等许多功能;B、许多用户都会使用,而且非常熟练,不需要再培训;C、比较稳定,如果自己要开发下载程序的话,一个是功能不强大,另外需要一段相当长的测试时间,需要投入时间与精力,不合算。如果是因为集成或者产品化的原因,可以考虑做一个相对简单的下载程序,与其它应用结合,或者开发一个管理备份文件的程序,管理起来比较方便。 3.2 服务器配置及源码 3.2.1 服务器端配置 3.2.1.1 Sql Server的配置: -先建立Device(设备); -然后备份具体的数据库到Device(设备)中,可以选择备份的时间及备份的方式; 重复上述操作,直到做好所有需要备份的数据库配置。 注意事项: 1、 备份文件存在的目录不要让用户能通过Http协议访问到; 2、 根据实际需要选择全额备份还是差额备份以及定时操作; 3、 如果系统备份以后,备份目录下就会出现.bak文件。 3.2.1.2 虚拟目录的配置 -为备份系统建立一个虚拟目录,如BackUp,一定要加上挑战反应,不允许匿名访问,这样访问时就需要输入系统管理员的用户名和密码,增强安全性。 3.3 源码 实现思路:为了保护数据的安全性,在3.2.1.2中要把备份系统的虚拟目录设成不允许匿名访问,需要系统管理员的密码;另外在3.2.1.1注意事项中1提到的不让备份文件存在的目录让用户能通过Http协议访问到,需要在生成下载文件后临时生成一个虚拟目录,下载完毕后再删除掉,确保安全。 一共包括四个文件,BackSet.asp、BuildvDir.asp、DelvDir.asp、BackList.asp。 -BackSet.asp:选择要建立临时下载虚拟目录的站点,同时临时给定下载虚拟目录的名称; - BuildvDir.asp:根据BackSet.asp文件给定的站点和虚拟目录名称,建立虚拟目录; -DelvDir.asp:删除在BackSet.asp文件给定的站点中的虚拟目录; -BackList.asp:压缩备份文件,建立对应的被压缩后备份文件的下载链接;, 3.3.1 BackSet.asp文件解释 3.3.1.1 源码 … <body bgcolor="#EEEEEC"> <center> <font size=4>生成或者删除**项目备份数据库虚拟目录</font> </center> <hr size=1> <br> <center> <form name="BackForm" method="Post"> <table border=1 width=70%> <tr> <td width=40% align=center> <font size=2> 请选择要使用的站点名称: </font> </td> <td> <select Name="WebSiteIndex"> <% dim ObjServer dim obj3W dim sServerName set ObjService=GetObject("IIS://" & Request.ServerVariables("SERVER_NAME") & "/W3SVC") for each obj3w in objservice if IsNumeric(obj3w.Name) then sServerName=Obj3w.ServerComment if Instr(sServerName,"管理 WEB 站点") =0 then sServerName=obj3w.Name & "-" & Obj3w.ServerComment %> <option value="<%=obj3w.Name%>"><%=sServerName%> <% end if end if next set ObjService=Nothing %> </select> </td> </tr> <tr> <td width=40% align=center> <font size=2> 请输入备份操作的虚拟目录名称: </font> </td> <td> <input Type=text name="vDir" value="SrrdBackUp" size=42> </td> </tr> </table> <br> <br> <input type=button Name="Build" value="生成虚拟目录"> <input type=button Name="Del" value="删除虚拟目录"> </form> </center> </body> </html> <script language=vbs> Sub Build_Onclick() '生成临时虚拟目录 if Trim(document.BackForm.vDir.value)="" then msgbox "请输入虚拟目录名称!",16,"错误" exit sub else document.BackForm.action="BuildvDir.asp" document.BackForm.submit end if end sub Sub Del_Onclick() '删除临时生成的虚拟目录 if Trim(document.BackForm.vDir.value)="" then msgbox "请输入虚拟目录名称!",16,"错误" exit sub else document.BackForm.action="DelvDir.asp" document.BackForm.submit end if end sub </script> … SQL脚本生成的一些BUG Sql Server 的脚本生成有不少漏洞,经常由它生成的脚本运行起来却有错误。下面举例说明: 1、并没有根据sysdenpends的依赖关系生成SQL代码,而是根据“优先级”(呵呵,所谓的优先级)来生成。 比如:他认为view的优先级就要比function高。 那么,我写了下面的测试程序,形成如下的依赖关系:fnT1 <-- vwT1 <-- fnT2 就是,view vwT1处于依赖的中间。 ------------------------------------ Create function fnT1() Returns Integer As begin Return 123 end go Create view vwT1 As Select aa=dbo.fnT1() Go Create function fnT2() Returns Table As Return (Select * From vwT1) Go ------------------------------------- 运行到数据库之后,用Enterprise生成SQL代码。(选项不一样,会有所不同,我没有选数据库和用户的) ----------------------------------------------------------------------------------- if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[fnT1]') and xtype in (N'FN', N'IF', N'TF')) drop function [dbo].[fnT1] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[fnT2]') and xtype in (N'FN', N'IF', N'TF')) drop function [dbo].[fnT2] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[vwT1]') and OBJECTPROPERTY(id, N'IsView') = 1) drop view [dbo].[vwT1] GO SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO Create view vwT1 As Select aa=dbo.fnT1() GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO Create function fnT1() Returns Integer As begin Return 123 end GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO Create function fnT2() Returns Table As Return (Select * From vwT1) GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO ----------------------------------------------------------------------------- 呵呵,一眼你就可以看出来了,建立view要比建立function先。而不是根据依赖关系建立…… 毫无疑问,将会得到如下的错误:(这个错误可真严重!害得我好惨……) --------------------------------------------------- 服务器: 消息 208,级别 16,状态 1,过程 vwT1,行 4 对象名 'dbo.fnT1' 无效。 服务器: 消息 208,级别 16,状态 1,过程 fnT2,行 5 对象名 'vwT1' 无效。 --------------------------------------------------- 2、作业脚本。 这个我就不说了,bug还不是很严重,主要是中文“--”注释符的问题,英文版我没有测试过,不过猜想应当没有这个bug。 大家可以试试看。 3、还有一个SP的问题。 大家看过我的精华里面有spGetIDStr和spAnalyseStrList了吧,关系是后者依赖于前者。可是spGetIDStr我并没有调用任何的表。 因此,每当运行Sql Server生成的脚本的时候,总是报告(大概是这样的信息): ------------------------------------------------------------------------ spGetIDStr并不存在,无法在sysdepends里建立依赖关系,存储过程spAnalyseStrList仍然建立。 -------------------------------------------------------------------------- 无论我手工修改他的建立顺序还是什么的,用它生成的脚本就是有错。呵呵,这个破微软! 这里,再看看第三个bug,看我下面的测试程序: (原理:当sp没有对表或视图等数据库对象有依赖关系的时候,sp被别的sp引用的时候也将无法建立依赖关系) 形成依赖关系:spB1 <--- spA1 ------------------------------------------------------------------------ Create Proc spB1 As Return 11 Go Create proc spA1 As Begin Declare @i int Exec @i=spB1 Return @i*2 End Go ------------------------------------------------------------------------- 生成的脚本就为: ------------------------------------------------------------------------- if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[spA1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[spA1] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[spB1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[spB1] GO SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO Create proc spA1 As Begin Declare @i int Exec @i=spB1 Return @i*2 End GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO Create Proc spB1 As Return 11 GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO
|
相关文章推荐
- 《MS SQL Server 2000管理员手册》系列——36. 解决常见的效能问题
- MS sqlserver 部分问题解决技巧
- 黑马程序员-关于ms sqlserver 内置函数整理
- SQL Server补丁安装常见问题(更新)
- MS SQL Server查询优化方法 查询速度慢的原因很多,常见如下几种
- ms sql server 2005 select guid返回null的问题
- 解决MS SQL Server 2005 无法远程连接问题
- 奇怪的问题:UTF-8中字符串空格存入 ms sql server的text字段中会显示为?
- MS SQL Server 2005 数据库损坏之数据恢复绝对经典
- 统计相邻相同行数量 - MS-SQL Server / 疑难问题
- java连接ms sql server各类问题解析
- SQL Server Express常见问题及解决办法
- win7下安装ms sql server 2005 manamgement studio报错29506问题
- ms sql server 的模式问题
- win7下安装ms sql server 2005 manamgement studio报错29506问题
- 彻底解决Ms sql server 2000中的最大流水号的生成问题
- ms sql server占CPU过高的问题
- 解决MS SQL Server 死锁的问题
- JBOSS4.0.5+EJB3.0+MS SQLSERVER中文乱码问题
- win7下安装ms sql server 2005 manamgement studio报错29506问题 .