数据库管理—SQL主要知识及相关应用.ppt
数据库管理SQL主要知识及相关应用主要知识及相关应用内 容 o一、一、SQL Server基础应用基础应用o 1、SQL Server主要知识o 2、SQL事件探测器o 3、SQL查询分析器o 4、SQL管理(企业管理器)o 5、基本SQL语句o二、SQL Server数据库维护数据库维护o 1、数据库损坏的检测和修复o 2、数据库优化11/19/20222HwadeeSQL Server主要知识oSQL Server工具和实用程序o1.企业管理器o2.服务管理器o3.查询分析器o4.事件探查器o6.数据定义语言(DDL)o7.数据操纵语言(DML)o8.存储过程、视图的定义返回上级11/19/20223HwadeeSQL Server主要知识企业管理器企业管理器o企业管理器是基于一种新的被称为微软管理控制台(Microsoft Management Console)的公共服务器管理环境,它是SQL Server中最重要的一个管理工具。企业管理器不仅能够配置系统环境和管理SQL Server,而且由于它能够以层叠列表的形式来显示所有的SQL Server对象,因而所有SQL Server对象的建立与管理都可以通过它来完成。o利用企业管理器可以完成的操作有利用企业管理器可以完成的操作有o管理SQL Server 服务器;建立与管理数据库;建立与管理表、视图、存储过程、触发程序、角色、规则、默认值等数据库对象,以及用户定义的数据类型;备份数据库和事务日志、恢复数据库;复制数据库;设置任务调度;设置警报;提供跨服务器的拖放控制操作;管理用户帐户;建立Transact-SQL命令语句以及管理和控制SQL Mail11/19/20224HwadeeSQL Server主要知识o查询分析器(查询分析器(Query Analyzer)oSQL Server 2000新的图形化查询分析器用于输入和执行Transaction-SQL语句,并且迅速查看这些语句的结果,以分析和处理数据库中的数据。这是一个非常实用的工具,对掌握SQL语言,深入理解SQL Server的管理工作有很大帮助。oSQL Server 分析器(分析器(Profiler)-事件探查器事件探查器o是一个图形化的管理工具,用于监督、记录和检查SQL Server 数据库的使用情况。对系统管理员来说,它是一个连续实时地捕获用户活动情况的间谍。11/19/20225HwadeeSQL Server主要知识oSQL Server 服务管理器是在服务器端实际工作时最有用的实用程序,其界面如图1-21所示。服务管理器用来启动、暂停、继续和停止数据库服务器的实时服务,其提供的服务包括:SQL Server、SQL Server Agent、MSDTC(Microsoft Distributed Transaction Coordinator,微软分布式事务协调器),microsoft search。11/19/20226HwadeeSQL Server主要知识o存储过程的概念oSQL Server提供了一种方法,它可以将一些固定的操作集中起来由SQL Server数据库服务器来完成,以实现某个任务,这种方法就是存储过程。o在SQL Server中存储过程分为两类:即系统提供的存储过程和用户自定义的存储过程。o图 表-视图o图表(又称关系图)是SQL Server中一类特殊的数据库对象,它提供给用户直观地管理数据库表的方法。通过图表,用户可以直观地创建、编辑数据库表之间的关系,也可以编辑表及其列的属性。11/19/20227HwadeeSQL事件探测器o1、SQL查询探测器的使用oSQL查询探测器,只有在安装了SQL Server 后才可以使用;安装MSDE不能使用该工具。o事件探查器的作用是用于跟踪SQL的执行脚本,这是用于实际中最常使用的判断问题原因的方法。11/19/20228HwadeeSQL事件探测器oSQL查询探测器的设置(1)一般地,数据列和筛选两个属性不需要设置一般地,数据列和筛选两个属性不需要设置11/19/20229HwadeeSQL查询探测器的设置(2)11/19/202210HwadeeSQL查询探测器的设置(3)11/19/202211HwadeeSQL查询探测器的设置(4)11/19/202212HwadeeSQL事件探测器oSQL查询探测器的使用11/19/202213HwadeeSQL事件探测器o跟踪SQL基本分析方法:o1.找出有效的SQLo2.把SQL语句放到SQL查询分析器中执行o3.重现错误提示,分析错误原因o4.如果不重现错误,则分析取数语句是否正确,所得结果是否正确o一般地:o如果执行语句能重现错误,则比较简单。只需要判断语句是否合法,where后的条件是否正确11/19/202214HwadeeSQL查询分析器o查询分析器的使用方法查询分析器的使用方法oMicrosoft SQL Server 2000 SQL 查询分析器是一种图形工具,您可以使用它进行以下操作:o1、创建查询和其它 SQL 脚本,并针对 SQL Server 数据库执行它们。(“查询”窗口)o2、由预定义脚本快速创建常用数据库对象。(模板)o3、快速复制现有数据库对象。(对象浏览器脚本功能)o4、在参数未知的情况下执行存储过程。(对象浏览器过程执行功能)o5、调试存储过程。(T-SQL 调试程序)o6、调试查询性能问题。(显示执行计划、显示服务器跟踪、显示客户统计、索引优化向导)o7、在数据库内定位对象(对象搜索功能),或查看和使用对象。(对象浏览器)o8、快速插入、更新或删除表中的行。(“打开表”窗口)o9、为常用查询创建键盘快捷方式。(自定义查询快捷方式功能)o10、向“工具”菜单添加常用命令。(自定义“工具”菜单功能)o可以从“启动”菜单直接运行 SQL 查询分析器,或从 SQL Server 企业管理器内运行它。这也是平时应用SQL过程中使用最多的一个工具。11/19/202215HwadeeSQL查询分析器o启动o在SQL Servers的窗口中,选择或输入需要连接的SQL服务器的名称或IP。“.”特指本机。o在“连接使用”处选择SQL安装时设置的登录方式及登录用户、密码11/19/202216HwadeeSQL查询分析器o登陆窗口通过通过“工具工具”-“选项选项”设置,可以设置一些其他的参数设置,可以设置一些其他的参数11/19/202217HwadeeSQL查询分析器o在SQL 的查询分析器,经常会用到一些快捷键操作:oCTRL+T:执行结果以文本格式输出oCTRL+D:执行结果以表格格式输出oCTRL+E:执行选择的SQL语句oCTRL+F5:对选定的SQL语句进行语法检查oF5:执行选择的SQL语句oF4:对象搜索oF8:在左边显示数据库对象窗口oF1:在线帮助oShift+F1:在选择一个SQL命令或关键字后,按这个组合键,可以调出对应的帮助信息oAlter+F1:在选择一个数据库表名后,按这个组合键,可以直接输出该对象的结构内容。11/19/202218HwadeeSQL查询分析器o在SQL查询分析器,可以有多种方法来打开一个数据库实体,并对它进行操作。o最常用的,就是在DB后的下拉式窗口选择o其中:选择详细,可以看到更详细的信息,如11/19/202219HwadeeSQL查询分析器o使用USE命令。用法为:use 数据库实体o然后选定后按F5或执行键执行即可o 不管用何种方式,当选择了数据库实体后,在标题中都会显示所选择数据库实体的名称11/19/202220HwadeeSQL查询分析器o执行结果o在一个数据库中查询另外一个数据库的内容,用法为:oSelect*from DATABASENAME.table_nameo如:11/19/202221HwadeeSQL管理o3、SQL Server管理oSQL server 管理,只有在安装了SQL Server 后才可以使用;安装MSDE不能使用该工具o通过SQL Server管理器,可以完成对SQL Server数据库的备份、恢复、删除、附加、拆离等数据库维护;也可以完成表设计、数据修改、数据表的导入导出等许多功能,如图:11/19/202222HwadeeSQL管理oSQL server 安装后,存在一个默认的组“SQL Server组”和该组下的一个SQL注册”(local)(Windows NT)”。o所有SQL服务和管理对象,都必须存在于相应的SQL组下的有效注册里。oSQL组是一个基于一定管理目的的分类,而SQL Server注册则是指本机的SQL Server要连接管理的具体的SQL Server服务器。Local特指本机。所有SQL Server数据库实体,都必须依赖于一个有效的SQL Server注册。o通过建立SQL组,可以为不同的管理目的划分相应的SQL Server 管理类别,o并且可以实现 子类别的管理。11/19/202223HwadeeSQL管理o通过SQL Server注册,可以实现一个SQL服务器连接许多其他实际存在的SQL服务器。o注册成功后,在选定的SQL Server组下会增加相应的SQL注册名,o在SQL Server注册中可以进行各项数据库管理的操作。11/19/202224HwadeeSQL管理o数据库备份o1、选择需要备份的数据库实体,如图Ao2.、在所有任务中,选择“还原数据库”,并指定路径和文件名即可可以为备份生成的文件取任意的文件名返回上级11/19/202225Hwadeeo数据库恢复o1、在企业管理器的控制台中选择“数据库”o2.、在所有任务中,选择“备份数据库”,并选择数据来源,一般都是“从设备”o3、在“还原为数据库”后给出的数据库实体名,一般为现有系统中的第一个数据库实体名,因此一定是修改为实际的数据库实体名,否则还 原数据将把现有数据覆盖。11/19/202226HwadeeSQL管理o数据库恢复返回上级11/19/202227HwadeeSQL管理oK3相关问题o在中间层中不能恢复备份的帐套,现象如图:11/19/202228HwadeeSQL管理o账套不能在中间层恢复是由于账套对应的数据库实体的逻辑文件名和物理文件名不同导致,请修改SQL SERVER属性中服务器设置页选择允许对系统目录直接进行修改(如图1所示),然后修改该实体的系统数据表sysfile1中的name字段实体名等于filename字段实体名(如图2所示),最后再将允许对系统目录直接进行修改改回。修改后即可正常备份恢复。11/19/202229HwadeeSQL管理o图111/19/202230HwadeeSQL管理数据库分离1、选择需要分离的数据库实体。2.、在所有任务中,选择“分离数据库”3、如果只是要清除该数据库的使用信息,可能通过“清除”实现。数据库的分离和附加,经常结合应用,是重建数据库日志文件的常用手段和方法。此外,在中间层中删除账套时经常提示该账套还在使用,此时在“清除”并不退出这个界面的同时,再在中间层中删除账套,则可以顺利删除。11/19/202231HwadeeSQL管理o数据库附加1、在企业管理器的控制台中选择“数据库”2.、在所有任务中,选择“附加数据库”,并选择数据来源3、选择附加的数据库实体文件(mdf文件),并指定数据库所有者4、如果日志文件(Ldf文件)不存在,数据库会自动创建11/19/202232HwadeeSQL管理o数据库收缩o1、选择需要收缩的数据库实体。o2、在所有任务中,选择“收缩数据库”o结转新账套后,账套的数据库大小不变,需要在SQLSERVER的企业管理器中进行数据库的收缩处理。可以运行dbcc updateusage(0)后再收缩。11/19/202233HwadeeSQL管理o数据表维护o展开数据库后,可以在表中实现如图的维护操作11/19/202234HwadeeSQL管理表设计1、选择需要修改的表2、在右键功能中,选择“表设计”,可以对表属性进行修改11/19/202235HwadeeSQL管理表数据查询1、选择需要查看数据的表。2、在右键功能中,选择“打开表”,选择返回的数据行方式,可以对表的数据进行查询11/19/202236HwadeeSQL管理o创建表SQL脚本o1、选择需要生成SQL创建脚本的表。o2.、在所有任务中,选择“生成SQL脚本”,按以下设置:11/19/202237HwadeeSQL管理表触发器的维护1、选择需要维护触发器的表。2、在所有任务中,选择“管理触发器”,看到具体的触发器及内容:11/19/202238HwadeeSQL管理o数据导入导出(DTS)o数据的导入与数据的导出操作方法相同,以两个数据库之间导出某张表为例o1、选择导出数据的表。o2、在所有任务中,选择“导出数据”11/19/202239HwadeeSQL管理11/19/202240Hwadee基本SQL语句oSQL常用命令及函数:o常见的SQL命令有:select、update、delete、insert o各SQL命令经常与其他SQL关键字组成条件,从而形成一组具有针性的有效的SQL语句。如select经常与where联用,起到限制目标范围的作用。o在所有SQL命令中,如果数据对象的数据类型为非数值的,则必须加上单引号。如果给定的值与对应字段的数据类型不一致,在执行时SQL会报错。o在SQL命令中,|、-等具体有特殊用途,一般不可用于具体的数据中。否则会造成SQL语句执行出错。o如果SQL命令中存在语法错误,在执行时SQL会报错。o这些命令都是对表中的数据进行操作。11/19/202241Hwadee基本SQL语句o常用函数:oMax:求最大值Min:求最小值oAvg:返回在某一集合上对数值表达式求得的平均值。oCount:返回集合中项目的数量,Count(*):返回符合查询中指定的搜索条件的总行数,而不消除重复值。oABS:求绝对值oCONVERT:将某种数据类型的表达式显式转换为另一种数据类型o其他常用函数,可以通过F1随时在帮助中查找。o常用关键字oADD、ALTER、FROM、JOIN、SET、LIKE、GROUP11/19/202242Hwadee基本SQL语句oSelect的作用是查询数据。在所有SQL命令中,Select是被用的最多最频繁也是最复杂的一个命令。o通过Select,可以实现根据一定的条件查询数据,可以实现将几个相同数据类型查询结果形成一个结果集,可以实现将查询的结果产生一张数据表,可以实现从另一个数据库中查询数据等等11/19/202243Hwadee基本SQL语句o它的语法结构一般是:o-1、查询指字段oSelect 字段1,字段2,字段3.From 表名 where 条件o-2、查询所有字段-*表示该表中的所有字段oSelect *From 表名 where 条件o-如查询科目表oSelect Fdc,Faccountid from t_accountoSelect Fdc,Faccountid from t_account where fnumber=1001oSelect*from t_account where fnumber=1001o而where则是为了限制查询操作的范围。11/19/202244Hwadee基本SQL语句o-3、结构查询结果形成一个新的表,语法为:oSelect 字段 into 新表名 from 表名 where 条件o如:产生temp_001 表中的数据oSelect Faccountid,Fnumber,Fname,Fdc into temp_001 from t_accounto-4、在当前数据库中从另一个数据库中查询数据,设另外一个数据库实体为XXXoSelect*from xxx.t_account-需要注意的是,XXX后是两个小数点而不是一个oSelect*from AIS20040422090158.t_item11/19/202245Hwadeeo-5、多张个关联起来查询特定的数据,如:o-其作用:查询出当前期间的卡片的最后一次变动内码、原值、卡片内码、当期折旧odeclare Fyear int,Fperiod int-定义类型为整数型的变量值oselect Fyear=fvalue from t_systemprofile where Fcategory=fa and fkey=currentyear-将查询的变量赋给Fyearoselect Fperiod=fvalue from t_systemprofile where Fcategory=fa and fkey=currentperiod-将查询的变量赋给Fperiodoselect c.falterid,b.FOrgVal,a.fassetid,a.fdepr基本SQL语句11/19/202246Hwadee基本SQL语句ofrom t_fabalance a join t_fabalcard b on a.fbalid=b.fbalidoleft join t_facard c on c.fassetnumber=b.fassetnumberoleft join t_faalter d on d.fassetid=a.fassetid and d.falterid=c.falteridowhere a.fyear=Fyear and a.fperiod=Fperiodoand c.falterid=(select max(falterid)from t_faalter where fassetid=a.fassetid)o-注意上述语句中用到的别名。当多个表关联时为方便操作一般都会用到别名11/19/202247Hwadee基本SQL语句o-6、将查询出的字段名另外的字段名显示oselect fassetnumber as 卡片代码,fassetname 卡片名称 from t_facardo-其中,关键字as可要可不要,但中间必须至少有一个空格。o-7、给查询出的结果赋予字段名oselect sum(Fendbalance)from t_balance-无字段名oselect sum(Fendbalance)Fendbal from t_balance 11/19/202248Hwadee基本SQL语句o-8、结合函数进行分组计算oselect Fyear,fperiod,sum(fdepr)Fdepr from t_fabalance ogroup by Fyear,fperiod-按Fyear,fperiod字段进行分组计算oorder by Fyear,fperiod-按Fyear,fperiod字段排序o-注:order by 要放在语句的最后,它的作用是按指定字段进行排序ogroup by:是按指定字段进行分组求后,分组的字段必须包括select后的字段名。11/19/202249Hwadeeo9、查找表中的重复值记录o select 主键1,主键2,主键n,count(*)from 表 group by 主键1,主键2,主键n Having count(*)1,如:oselect count(*)as 重复记录行,FYear,FPeriod,FAccountID,FDetailID,FCurrencyIDofrom t_balance ogroup by FYear,FPeriod,FAccountID,FDetailID,FCurrencyID having count(*)1o-其中:在group by 后要包括查询表中判断数据记录为重复的所有字段,一般为表的主键或索引,他们应该与select 后的字段名、字段顺序一致。o这种方法多用于系统不能在某表中插入重复键的情况,如总账的结账。基本SQL语句11/19/202250Hwadee基本SQL语句o10、利用select语句产生一个具有自动递列(即种子列)的表oselect identity(int,1,1)as Fid-identity(数据类型,开始值,递增值),必须与into语句一起使用o,faccountid,fnumber,fname,fgroupid,fdcointo temp_001 from t_account order by fnumbero-就会看到FID的值是从1开始的自动递增的。o11、返回唯一的记录值oSelect distinct *from t_account11/19/202251Hwadee基本SQL语句o12、联合:通过Union或union all将两个或更多查询的结果组合为单个结果集o其中:union是将相同结果联合起来,去掉重复记录;union all则是将所有记录联合起来,包括重复值。如oselect 1 as ttounionoselect 2 as ttounion oselect 1 as tt11/19/202252Hwadee基本SQL语句o13、利用select命令进行计算oSelect 5*1243oselect forgvalp+forgvalinc-forgvaldec as Fendbal from t_fabalance11/19/202253Hwadee基本SQL语句oUpdate的作用是更新表中的字段值,可实现数据的成批更新o其语法结构为:oUpdate 表名 set 字段名=值 where 条件o注:在update的set后的=表示把右边的值赋予于左边的字段,但不表示等于的意思。o但如果赋予的值在更新后存在与表中的索引或主键冲突,则更新命令将执行不成功。11/19/202254Hwadee基本SQL语句o1、更新指定的数据oUpdate t_account set Fdc=1 where fnumber=1601o2、更新全部数据oUpdate t_balance set Fdebit=011/19/202255Hwadee基本SQL语句oDelete是一个删除数据的命令,其语法结构为:oDelete from table where o如:oDelete from t_accountoDelete from t_account where faccountid=100111/19/202256Hwadee基本SQL语句oINSERT into 语句可给表添加一个或多个新行。INSERT 语句在简单的情况下有如下形式:oINSERT INTO table_or_view(column_list)data_valueso此语句将使 data_values 作为一行或者多行插入已命名的表或视图中。column_list 是由逗号分隔的列名列表,用来指定为其提供数据的列。如果没有指定 column_list,表或者视图中的所有列都将接收数据。o如果 column_list 没有为表或视图中的所有列命名,将在列表中没有命名的任何列中插入一个 NULL 值(或者在默认情况下为这些列定义的默认值)。在列的列表中没有指定的所有列都必须允许 null 值或者指定的默认值。oInsert into 与insert 等效,不过习惯上都使用insert into。11/19/202257Hwadee基本SQL语句oInsert Into是一个插入数据的命令,其语法结构为:oInsert Into table(field1,field2,.)oValues(value1,value2,)o其作用:o要求:o1、Insert Into table(field1,field2,.)中字段的个数和顺序,必须与Values(value1,value2,)中的一致。o2、Values中的值的数据类型,必须与table中的字段的数据类型一致。o3、如果要插入表中的字段具有默认值,并且插入的数据也是默认值,则可以不出现在insert into语句中。如当itemdetail表中丢失Fdetailid=0的记录时可以使用oinsert into t_itemdetail(Fdetailid,Fdetailcount)values(0,0)o因为其他列的默认值都=011/19/202258Hwadee基本SQL语句o3、如果某列是Identity列(种子列或称自动递增列),则不需要指定该列,SQL会自动为其计算递增值。oselect identity(int,1,1)Fid,faccountid,fnumber,fname,fgroupid,fdcointo temp_001 from t_account order by fnumberoselect*from temp_001 oinsert into temp_001(faccountid,fnumber,fname,fgroupid,fdc)ovalues(2604,1101,TTT,101,1)-并没有为Fid指定值,并查询时它已经有新值了。11/19/202259Hwadee基本SQL语句o4、如果values中的值是非数据字类型时,必须用单引号将之括起来o5、insert into还可以与select结合起来使用,而不使用values关键字,如oinsert into temp_001(faccountid,fnumber,fname,fgroupid,fdc)oselect 2604,1101,TTT,101,1oinsert into temp_001(faccountid,fnumber,fname,fgroupid,fdc)oselect faccountid,fnumber,fname,fgroupid,fdc ofrom AIS20050615140703.t_account order by fnumbero-只要select后的字段顺序、字段类型与insert into中的保持一致即可。这是最常使用的一种方法。通过这种方式,可以一次性在将符合条件的内容全部插入表中,而使用values的格式,一次只能插入一条数据。11/19/202260Hwadee基本SQL语句o在实际中,经常会遇到需要对表的结构进行修改,如修改表中的字段类型、禁用表中的触发器等。o这些常用的命令有:oAlter table,drop table 等等11/19/202261Hwadee基本SQL语句oDrop TABLEo删除表定义及该表的所有数据、索引、触发器、约束和权限规范。任何引用已除去表的视图或存储过程必须通过 DROP VIEW 或 DROP PROCEDURE 语句显式除去。语法:o-删除表 DROP TABLE table_nameo-删除视图 DROP VIEW VIEW_nameo-删除存储过程 DROP PROCEDURE PROCEDURE_nameo-删除触发器 DROP TRIGGER TRIGGER_nameo-删除索引 DROP index table_name.index_nameo删除后,所有该表、视图中的数据全部丢失。11/19/202262Hwadee数据库损坏的检测和修复oSQL SERVER数据库的检测数据库的检测oSQL SERVER提供了数据库检测的命令,可用DBCC CHECKDB对数据库中各个对象的分配及结构的正确性进行检测,并可通过一参数控制,将所有的错误信息显示出来。其语法如下:oDBCC CHECKDB o (database_name,NOINDEX|REPAIR_ALLOW_DATA_LOSS o|REPAIR_FASTo|REPAIR_REBUILDo o )WITH ALL_ERRORMSGS|NO_INFOMSGS11/19/202263Hwadee数据库损坏的检测和修复o参数说明:odatabase_name代表被检测的数据库实体名;oNOINDEX指非系统表的非聚族索引不检测;oREPAIR_ALLOW_DATA_LOSS|REPAIR_FAST|REPAIR_REBUILD 指直接修复发现的错误,其中REPAIR_ALLOW_DATA_LOSS代表,若此错误不能修复时,系统将直接删除相关数据。带此三个参数的任一个时,数据库必须处于单用户模式,可在Enterprise Manager中的数据库属性中设置;11/19/202264Hwadee数据库损坏的检测和修复oALL_ERRORMSGS代表将检测到的错误信息全部显示出来,否则,对于每张表最多只显示200条错误信息;oNO_INFOMSGS代表隐藏所有的信息及占用空间的报告。o经过检测,对于错误的对象,将以OBJECT ID的形式报告具体出错的信息,可根据OBJECT ID到系统表sysobjects中查找到相关的表,即NAME。11/19/202265Hwadee数据库损坏的检测和修复SQL SERVER问题数据库的修复问题数据库的修复o经过数据库检测后,可针对出现的问题采取相应的措施进行处理。如通过检测后,发现对象的物理存放存在问题,可用DBCC CHECKALLOC来进行修复:oDBCC CHECKALLOC(database_name|REPAIR_REBUILD )WITH ALL_ERRORMSGS|NO_INFOMSGSo若是非系统对象的索引出错,则可用DBCC DBREINDEX进行修复:oDBCC DBREINDEX(database.owner.table_name,index_name,fillfactor )WITH NO_INFOMSGSo以上两种情况,也可直接使用DBCC CHECKDB(db_name,repair_rebuild)来修复。11/19/202266Hwadee数据库损坏的检测和修复o具体应用说明ouse masterodeclare databasename varchar(255)oset databasename=AIS20021231161327-一定要手工输入o-执行一般性修复还存在问题时,进行允许数据丢失的修复o-允许数据丢失的修复要求在单用户下进行,此时请退出中间层,客户端,sql的其他模块o-所有功能退出,在查询分析器master里设置数据库为单用户oexec sp_dboption databasename,Nsingle,Ntrue 11/19/202267Hwadee数据库损坏的检测和修复o-在查询分析器master里,进行修复数据库odbcc checkdb(databasename,REPAIR_ALLOW_DATA_LOSS)odbcc checkdb(databasename,REPAIR_REBUILD)o-还原数据库状态oexec sp_dboption databasename,Nsingle,Nfalse11/19/202268Hwadee数据库损坏的检测和修复o单独修复表o现象如下:o服务器:消息 8929,级别 16,状态 1,行 4o对象 ID 2:在文本 ID 2432106496 中发现错误,该文本的所有者是由 RID=(1:520:2)id=352720309 and indid=2 标识的数据记录。o-查询fid对应的表oselect *from sysindexes where id=35272030911/19/202269Hwadee数据库损坏的检测和修复o-修复表odbcc checktable(t_FuncControl)o-修复表(允许丢失)odeclare databasename varchar(255)oset databasename=AIS20040410151558-一定要在此手工输入oexec sp_dboption databasename,Nsingle,Ntrue odbcc checktable(t_FuncControl,REPAIR_ALLOW_DATA_LOSS)odbcc checktable(t_FuncControl,REPAIR_REBUILD)oexec sp_dboption databasename,Nsingle,Nfalse o-重建表索引odbcc dbreindex(ICStockBillEntry)11/19/202270Hwadee数据库损坏的检测和修复oSQL Server数据库为什么易损坏呢?数据库为什么易损坏呢?o以下是微软提供的一些可能引起数据库损坏的原因及一些预防措施:o操作问题,包括冷起动机器、热拔硬盘、删除一些数据库文件;o硬件问题,包括磁盘控制器的问题;o操作系统问题,包括与系统相关的一些致命错误。o预防措施:预防措施:o1、定期/不定期执行CHKDSK(不带参数),以检测硬盘物理结构并修复一些CHKDSK报告的问题;o2、常备份数据。11/19/202271Hwadee数据库损坏的检测和修复o数据库重建事务日志修复o请遵照如下步骤来试图重建数据库事务日志.o注意:由于事务日志丢失,数据库可能有没有提交的数据.o注:都要替换成真实的数据库名字o步骤1:创建一个新的数据库,命名为原来数据库的名字.o步骤2:停止SQL Servero步骤3:把老数据库的MDF文件替换新数据库的相应的MDF文件,并把LDF文件删除11/19/202272Hwadee数据库损坏的检测和修复o步骤4:o重新启动SQL Server 服务,然后运行如下命令:o Use Mastero Goo sp_configure allow updates,1o reconfigure with overrideo Goo begin trano update sysdatabases set status=32768 where name=odb_nameo -Verify one row is updated before committingo commit tran11/19/202273Hwadee数据库损坏的检测和修复o步骤5:o停止SQL然后重新启动SQL Server 服务,然后运行如下命令:o DBCC TRACEON(3604)o DBCC REBUILD_LOG(db_name,c:mssql7datadb_name_log.LDF)o Goo步骤6:o停止SQL然后重新启动SQL Server 服务,然后运行:o use mastero update sysdatabases set status=8 where name=db_nameo Goo sp_configure allow updates,0o reconfigure with overrideoGo11/19/202274Hwadee数据库损坏的检测和修复o步骤7:o运行dbcc checkdb(db_name)检查数据库的完整性.11/19/202275Hwadee数据库损坏的检测和修复ooK3K3系统表损坏的处理方法系统表损坏的处理方法系统表损坏的处理方法系统表损坏的处理方法 o一、一、K3数据库中三张重要的系统表数据库中三张重要的系统表o sysobjects:在数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在表中占一行。o sysindexes:数据库中的每个索引和表在表中各占一行。o syscolumns:每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行。o 这三张表用ID(表ID)字段关联。这三张系统表一旦损坏,与之对应数据库对象将无法访问,其作用相当于DOS中的“文件分配表”。11/19/202276Hwadee数据库损坏的检测和修复o二、系统表损坏的症状二、系统表损坏的症状o 用 DBCC CHECKDB 携带任何参数都无法修复数据库,也就是说:DBCC CHECKDB对这个帐套根本不起作用;o 无法执行如下操作:o select*from sysobjects 或select*from sysindexes o 或select*f