1、SQL数据库学习笔记与心得 SQL数据库学习笔记与心得 SQL数据库学习笔记与心得 0961140107 SQL是市场占有率最大的数据库之一,是信息化社会的产物,是整理、查询、分析数据的强有力工具。我对于SQL数据库的学习是在实验与探索之中度过的。 下面将我本学期所学的主要知识简单总结如下: 共分四大块:一、数据库基本原理;二、SQL标准语言;三、数据库设计;四、数据库安全。 一、数据库基本原理 数据库技术是计算机领域中发展最快的技术之一。数据模型是数据库系统的核心和基础。常用的数据模型有层次模型、网状模型、关系模型、面向对象模型、对象关系模型。其中关系模型是目前最重要的一种数
2、据模型。关系数据库是我们需要掌握的重点。 关系模型中常用的关系操作包括:查询操作和插入、删除、修改操作两大部分。关系的查询表达能力很强,是关系操作中最主要的部分。 二、SQL标准语言 SQL(StructuredQueryLanguage),即结构化查询语言,是关系数据库的标准语言。SQL标准语言从1986年公布以来随着数据库技术的发展不断发展,不断丰富。 SQL功能动词 数据定义CREATE,DROP,ALTER数据查询SELECT 数据操纵INSERT,UPDATE,DELETE数据控制GRANT,REVOKE SQL之所以能够为用户和业界所接受,并成为国际标准,是因为它是一
3、个综合的、功能极强同时又简洁易学的语言。SQL集数据查询、数据操纵、数据定义 林巧和数据控制功能于一体。有如下特点:1)综合统一;2)高度过程化;3)面向集合的操作方式;4)以同一种语法结构提供多种使用方式;5)语言简洁,易学易用。 SQL的数据定义语句: 创建删除修改表CREATETABLEDROPTABLEALTERTABLE视图CREATEVIEWDROPVIEW索引CREATEINDEXDROPINDEX 数据库查询是数据库的核心操作。也是数据库学习的重点和难点。SQL提供了SELECT语句进行数据库的查询,该语句具有灵活的使用方式和丰富的功能。其一般格式为: SELECT[
4、ALL|DISTINCT]FROM[,]…[WHERE] [GROUPBY[HAVING]][ORDERBY[ASC|DESC]]; SELECT语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。 (一)、单表查询 1、选择表中的若干列:2、选择表中的若干元组; 2)查询满足条件的元组。WHERE子句常用的查询条件有3、ORDERBY子句。4、聚集函数。5、ORDERBY子句(二)、连接查询 1、等值与非等值连接查询;2、自然连接;3、外连接;4、复合条件连接。(三)、嵌套查询1、带有IN谓语的子查询;2、带有比较运算符的子查询;3、带有ANY(SOME)或ALL谓
5、语的子查询;4、带有EXISTS谓词的子查询。 (四)、集合查询。 数据的更新操作有三种:向表中添加若干行数据、修改表中的数据和删除表中的若干行数据。 三、数据库设计 数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求 数据库设计的基本步骤: 1、数据库设计的准备工作;2、数据库设计的过程(六个阶段):1)需求分析阶段;2)概念结构设计阶段;3)逻辑结构设计阶段;4)数据库物理设计阶段;5)数据库实施阶段;6)数据库运行和维护阶段. 四、数据库安全 数据库的安全性是指保护数据库,
6、防止因用户非法使用数据库造成数据泄露、更改或破坏。课本中讲述了三类计算机系统安全性问题:技术安全类、管理安全类和政策法律类。 如何控制数据库的安全性?其常用的方法有:1)用户标识和鉴定2)存取控制;3)视图;4)审计;5)密码存储. 数据库的完整性:即数据的正确性和相容性防止不合语义的数据进入数据库。例如:学生的年龄必须是整数,取值范围为14--29;学生的性别只能是男或女;学生的学号一定是唯一的;学生所在的系必须是学校开设的系; 以上是我对SQL数据库重点知识的理解。通过学习本课程和上机实验,我了解了数据库的概念及其重要性,还有其今后的发展方向,这将有利于我今后更好地把握时代之脉搏。
7、 数据库 一、数据库基础知识 1、发展阶段 萌芽期(文件系统)初级阶段(层次模型和网状模型)主要代表为IBM公司的IMS(信息管理系统)中级阶段(关系型数据库)主要代表为甲骨文公司Oracle,微软SQLServer和IBM的DB2高级阶段(关系对象型数据库)2、数据模型 层次模型:结构型数据库主要数据模型,代表数据库为IMS 网状模型:构成网状数据库的主要数据模型 关系模型:采用二维表结构采用关系模型组织数据查询效率有时不高面向对象模型:3、数据库系统结构(1)用户级数据库:外模式(2)概念机数据库:模式(3)乌力吉数据库:内模式,最接近数据的物理存储与组织级别4、数据库三模式(
8、1)外模式:模式的子集,应用程序都是和外模式打交道(2)模式:(3)内模式:只有一个内模式 5、数据库的二级映像(1)外模式/模式映像:保障物理独立性(2)模式/内模式映像:保证逻辑独立性6、关系模型完整性约束实体完整性(所有主属性都不能取空值);参照完整性(多个表之间);用户自定义的完整性7、SQL:(结构化查询语言)T-SQL:SQLServer,包括数据定义语言,数据操作语言,数据查询语言,数据控制语言PL_SQL:Oracle,声明,执行体开始,异常处理,执行体结束。二、SQLServer数据库基础1、系统数据库:包括Resource数据库(只读数据库)、master数据库、msdb
9、数据库、tempdb数据库、model数据库(数据库模板);系统数据库存储在隐藏的系统表中2、用户数据库:数据库的存储机构包括逻辑存储结构和物理存储结构SQLServer数据文件类型:主数据文件(mdf文件,只能有一个)、辅助数据文件(ndf,可以没有,也可以有多个)文件、日志文件(ldf,记录对数据库记录的操作,至少有一个,可以有多个);数据存储的基本单位是“页”,一个页的大小为8Kb,一个区有8个页。(1)创建数据库名称遵循规则:第一个字符必须是字母或“_”“@”“#”;数据库名称不能是Transaction-SQL的保留字;不允许嵌入空格或其他特殊字符。 USEmaster ifex
10、ists(select*fromsysdatabaseswherename="mytest")dropdatabasemytestcreatedatabasemytestonprimary( name="mytest", filename="D:\\ProgramFiles\\SQLServerData\\SQLServerData\\Data\\mytest.mdf",size=5MB,maxsize=100MB,filegrowth=15%),( name="mytest1", filename="D:\\ProgramFiles\\SQLServerData\\SQLServer
11、Data\\Data\\mytest1.mdf",size=5MB,maxsize=100MB,filegrowth=15%)logon(name="mytest_log", filename="D:\\ProgramFiles\\SQLServerData\\SQLServerData\\Data\\mytest_log.ldf",size=2MB,filegrowth=1MB) Go (2)删除数据库 DROPDATABASE数据库名(3)收缩数据库 手动收缩和自动收缩 3、数据表数据完整性:实体完整性约束,表中不能存在相同的数据项;域完整性,给定列的输入内容具有有效性;引用完
12、整性,保存表之间的定义关系;自定义完整性主键:一个表只能有一个主键,可以没有主键,选择时,要确保最少性和稳定性外键:确保子表中的数据对应主表中的主键或者唯一键常用数据类型: 数字类型:int,float,decimal(必须制定范围和精度)文本类型:char,varchar,nvarchar,textBit数据类型:bool 日期时间类型:datatime货币型数据:money(1)创建数据表(2)删除数据表USETrainingBase go ifexists(select*fromsysobjectswherename="Trainee")droptableTraineecreat
13、etableTrainee() TraineeNointNOTNULL, TraineeNamenvarchar(50)notnull,Sexbitnotnull,GradeIDintnotnull,Phonenvarchar(50)null,Addressnvarchar(255)null,BornDatedatetimenotnull,Emailnvarchar(50)null, IdentityCardvarchar(18)notnull (3)创建删除约束主键约束:主键值必须唯一ALTERTABLETraineeADDCONSTRANINTPK_TraineePRIMARYKE
14、Y(TraineeNo) 非空约束: ALTERTABLETrainee ADDCONSTRANINTPK_TraineePRIMARYKEY(TraineeNo)唯一约束: ALTERTABLETrainee ADDCONSTRANINTUQ_IdentityCardUNIQUE(IdentityCard)检查约束: ALTERTABLETrainee ADDCONSTRANINTCK_BornDateCHECK(BornDate>’1980-1-1’) 默认约束: ALTERTABLETrainee ADDCONSTRANINTDF_AddressDEFAULT(‘地址
15、不详’)forAddress外键约束: ALTERTABLETrainee ADDCONSTRANINTFK_GradeFOREIGNKEY(GradeId)REFERENCEGradeId4、SQLServer身份验证(1)Windows身份验证(更安全)(2)SQLServer身份验证(Windows身份验证改为SQLServer身份验证的方式:首先,属性更改,然后改安全性中的内容)5、访问权限对数据库服务器控制权限对数据库中数据控制权限添加用户6、导入导出数据7、数据库优化(1)调整数据库结构的设计(2)调整应用程序机构设计(3)调整数据库SQL语句(4)调整服务器内存分配避免多表连
16、接查询使用同一的SQL语句规范 批量导入数据时,设置恢复模式为“大容量日志恢复模式”,导入前禁用索引。 一、T_SQL 1、运算符算术运算符:+、-、*、/,%赋值运算符:=比较运算符:,=,!=,=逻辑运算符:AND,OR,NOT2、表操作插入:一般插入一行,INSERTINTOGrade[GradeName]VALUES("实习阶段"), 可用关键字DEFAULT表示用默认值 修改:可更新一行数据,也可更新多行数据,也可能一行数据都不更新,UPDATE表明SET(字段名)=更新值[WHERE更新条件]UPDATEResultSETTraineeResult=TraineeResu
17、lt+5WHERETraineeResult<90ANDSubjectNO=2ANDExamDate=‘201*-2-15’ 删除:DELETE[FROM]表名WHERE,删除数据行数与WHERE删除条件确定的行数相关,删除有外键关系的数据时,必须先把外键表中的数据删除掉:DELETEFROMTraineeWHERETraineeName=‘张庆艳’,TRUNCATETABLE表名,数据不能恢复,效率更高,删除所有行数,但不删除表结构、索引、关系等,不能删除有外键的表3、数据查询(1)简单的查询语句:全部查询:SELECT*FROM表名(尽量少使用,效率比较低);条件查询:SELECT[字段
18、名,字段名,字段名]FROM表名[WHERE查询条件]使用别名:SELECT列名AS列的别名FROM表名;SELECT列名列的别名FROM表名;SELECT列的别名=列名FROM表名(使用中文别名时,可不用引号,但不能使用全角引号;使用的英文别名超过两个单词时,必须使用引号将别名括起来)查询中使用常量列:SELECT姓名=TraineeName,地址=Address,‘河北新龙’AS实习地点FROMTrainee查询空值:SELECT[字段名]FROM表名WHERE字段名IS(NOT)NULL限制查询返回的行数:SELECTTOP数量字段名FROM表名WHERE条件;按百分比SELECTTOP
19、数量PERCENT字段名FROM表名WHERE条件顺序排列查询结果:查询语句ORDERBY字段名DESD/ASC (2)查询中使用函数:字符串函数: 日期函数: 数学函数: 系统函数: (3)模糊查询:通配符:替代字符,通配符必须加上LIKE LIKE:仅与字符数据类型联合使用 BETWEEN…AND:包含起始值和终止值,起始值不能大于终止值IN(NOTIN):查询匹配的记录,SELECTTraineeNameAS实习生姓名FROMTraineeWHEREAddressIN(‘北京市海淀区’,‘广州’,‘上海虹桥’) 聚合函数:基于列进行计算SUM:求和,用于数字类型的列AVG
20、求平均值,所有数字的平均值MAX()和MIN():最值COUNT():求行数;COUNT(*),检索所有列;COUNT(1),检所使用列;COUNT(列名)检索指定列非空的行数分组查询:使用GROUPBY子句实现分组统计,HAVING,对分组进行筛选SELECTSubjectNo,AVG(TraineeResult)AS课程平均成绩FROMResultGROUPBYSubjectNoHAVINGAVG(TraineeResult)>=60 (4)创建新表:SELECTINTO,新表必须不存在SELECTTrainee.TraineeName,Trainee.Address,Trainee.
21、EmailINTONewAddressListFROMTraineeWHERE11(使查询条件不成立)查询示例: SELECT*FROMTraineeASAWHEREA.TraineeNoIN(SELECTB.TraineeNoFROMResultBWHEREB.TraineeResult>80 ANDB.Subject=(SELECTC.SubjectNoFROMSubjectCWHEREUPPER(C.SubjectName)=’SQLSERVER’)) SELECT*FROMTraineeA JOINResultBONA.TraineeNo=B.TraineeNoJOINSubj
22、ectCONC.SubjectNo=B.SubjectNoWHEREUPPER(C.SubjectName)=‘SQLServer’ANDB.TraineeResult>80 4、多表查询(1)内联接:从两个或两个以上的表组合中挑选出符合联接条件的数据,如果数据无法满足联接条件则将其丢弃,在内联接中,参与联接的表的地位是平等的。 SELECT表名1.字段名,…,表名2.字段名,…FROM表名1,表名2WHERE表名1.字段名=表名2.字段名 SELECTTrainee.TraineeName,Result.SubjectNo,Result.ExamDate,Result.TraineeR
23、esultFROMTrainee,ResultWHERETrainee.TraineeNo=Result.TraineeNoSELECT表名1.字段名,…,表名2.字段名,…FROM表名1,表名2INNERJOIN表名2ON表名1.字段名=表名2.字段名 SELECTTrainee.TraineeName,Result.SubjectNo,Result.ExamDate,Result.TraineeResultFROMTraineeINNERJIONResultON(Trainee.TraineeNo=Result.TraineeNo) (2)外联结:外联结中参与联接的表有主从之分,以主表
24、的每行数据匹配从表的数据列,将符合联接条件的数据直接返回到结果集中;对那些不符合联接条件的列,将被填上NULL值后再返回到结果集中。 左外联接LEFTJOIN==LEFTOUTERJOIN SELECTT.TraineeName,R.SubjectNo,R.TraineeResultFROMTrainee(主表)ASTLEFTJOINResultASRONT.TraineeNo=R.TraineeNo 右外联接RIGHTJOIN==RIGHTOUTERJOIN SELECTT.TraineeName,R.SubjectNo,R.TraineeResultFROMTraineeASTRI
25、GHTJOINResult(主表)ASRONT.TraineeNo=R.TraineeNo(3)交叉连接5、使用Union合并多个查询结果所有查询的列数和列的顺序必须相同;要合并的数据类型必须相同,至少也要可以转换合并的查询结果集的字段名称以第一个查询结果的字段名称为名,其他的查询集的字段名称会被忽略SELECT查询语句1UNION[ALL]SELECT查询语句2三、数据查询安全性和性能优化1、SQL注入:将SQL代码插入到应用程序的输入参数中,之后,SQL代码将被传递到数据库执行,从而达到对应用程序的攻击目的。原理:检测注入点判断数据库类型传递恶意代码上传木马,盗取账号,获取管理员权限,发现
26、Web目录防范:限制错误信息的输出;使用参数命令传递参数;使用存储过程;限制输入长度;URL重写技术;传递参数尽量不用字符串2、SQL优化:低效SQL危害:系统响应变慢(8秒定律);死锁;客户失去信心,软件失败根源:硬件原因;没有建索引,或者SQL没有走索引;SQL过于复杂;频繁访问数据库SQL执行原理:解释解析优化编译执行优化SQL语句:完善开发管理;检测SQL查询的效率查询SQL语句查询时间 SETSTATISTICSIOONSETSTATASTICSTIMEON 清楚缓存 DBCCDROPCLEANBUFFERSDBCCFREEPROCCACHE SQL优化:避免对索引字段进行数
27、值操作;使用Top语句限制返回的数据集;SELECT字段需要多少提取多少;ORDERBY后跟的尽量是索引字段;使用存储过程优化。四、T-SQL程序1、变量全局变量:先声明,后赋值,必须以@作为标记前缀:DECLARE@variable_nameDateType;使用SET或者SELECT为变量赋值,SET一般用于赋给变量指定的数据常量,不支持多个变量赋值和表达式返回多个值,表达式未返回值时,变量被赋NULL值;SELECT从表中查询数据,然后赋给变量,支持多个变量赋值,在返回多个值时,将返回最后一个值赋给变量,在表达式未返回值时,变量保持原值。SET语句执行效率比SELECT语句要高局部变量:
28、必须与@@标志作为前缀 2、数据类型转换使用CAST转换数据类型:CAST(expression(有效表达式)ASdata_type[(length)])SELECTGradeIdAS‘阶段’,CAST(COUNT(GradeId)ASCHAR(2))+‘人’AS人数FROMTraineeGROUPBYGradeId使用CONVERT转换数据类型:CONVERT(data_type[(length)],expression,[style])3、逻辑控制语句:顺序结构控制语句:BEGIN-END语句BEGIN {Sql_statement}END 分支结构控制语句:IF-ELSE语句和CA
29、SE-END语句IF(Boolean-expression) {sql_statement}ELSE {sql_statement} CASE WHEN条件1THEN结果1WHEN条件2THEN结果2[ELSE其他结果]END 循环控制语句:WHILE语句WHILE(Boolean_expression)BEGIN{Sql_statement|statement_blockBREAK|CONTINUE } END4、批处理:包含一个或多个SQL语句的组,从应用程序一次性地发送到SQLServer执行,GO是批处理的标志,GO命令和SQL语句不能在同一行里,必须单起一行,表示SQL
30、Server将这些T-SQL语句编译为一个执行单元,提高执行效率:SQLServer规定,如果是建库、建表语句、以及存储过程和视图等,必须在语句末尾添加添加GO批处理标志5、联合查询 6、子查询:SELECT(UPDATE、INSERT、DELETE)FROM表1WHERE列1运算符(子查询),嵌套查询先从最内层子查询开始分析,子查询可以嵌套在SQL语句中任何表达式出现的位置子查询语句必须放置在括号内,将子查询与比较运算符联合使用,必须保证子查询返回的值不能多于一个SELECTTraineeNo,TraineeName,Sex,BornDate,AddressFromTraineeWHERE
31、BornDate>(SELECTBornDateFROMTraineeWHERETraineeName=‘Lily’)IN、NOTIN子查询:IN后面的子查询可以返回多条记录,常用IN替换等于(=)的比较子查询 SELECTTraineeNameFROMTraineeWHERETraineeNoIN(SELECTTraineeNoFROMResultWHERESubjectNo= ( SELECTSubjectNoFROMSubjectWHERESubjectName=‘SQLServer’)ANDTraineeResult) EXISTS:常用与IFEXISTS(子查询),结果非空则
32、EXISTS返回true,否则返回false相关子查询:父查询对子查询产生影响ALL、ANY、SOME子查询:ALL:父查询中大于子查询中所有记录 SELECTSubjectName科目名称,ClassHour学时FROMSubjectWHEREClassHuor>ALL( SELECTAVG(ClassHour)FROMSubjectGROUPBYGradeId) SOME、ANY:父查询中大于子查询中任意一条记录即可 SELECTSubjectName科目名称,ClassHour学时FROMSubjectWHEREClassHuor>ALL( SELECTAVG(ClassHou
33、r)FROMSubjectGROUPBYGradeId) 8、事务处理事务:一系列的人物组成的逻辑工作单元,这个逻辑单元中的所有任务必须作为一个整体要么全部完成,要么全部失败,保证数据完整性和数据可恢复性。事务特性:原子性,事务的各步操作是不可分的;一致性,但事务完成时,数据必须处于一致状态;隔离性,事务必须是独立的,不应以任何方式依赖于或影响其他事务;永久性,事务完成后,他对数据库的修改被永久保持,事务日志能够保持事务的永久性;开始事务:BEGINTRANSACTION;提交事务:COMMITTRANSACTION;回滚事务:ROLLBACKTRANSACTION;编写事务原则:事务尽量简
34、短;事务访问的数据量尽量最少;查询数据时尽量不要使用事务;在事务处理过程中尽量不要出现等待用户输入的操作嵌套事务:事务的内部可以包含其他事务;忽略内层事务的COMMIT语句,只提交外层事务的COMMIT语句;事务的分类:显式事务;隐式事务;自动提交事务锁与事务: 五、视图与索引1、视图:将多个物理数据表抽象为一个逻辑数据表,命名规范:V_视图名,创建视图名:CREATEVIEW视图名ASSELECTstudentNo,stuNameFROMWHEREGrade=1[WITHCHECKOPTION],强制针对视图执行的修改都必须符合查询语句中设置的条件。删除视图,DROPVIEW视图名;更新视
35、图,ALTERVIEW视图名;加密视图:CREATEVIEW视图名WITHENCRYPTIONASSELECTstudentNo,stuNameFROMWHEREGrade=1[WITHCHECKOPTION]基本原则:2、索引:提高查询性能,但是影响插入操作性能聚集索引:索引的键值的逻辑顺序决定了表中相应行的物理顺序,一个表中只能有一个聚集索引;适用于范围查询,使用运算符(如BETWEEN、>、<等)返回一系列的值,查询连续的值,返回大型结果集,在Orderby或Groupby子句中指定的列的索引非聚集索引:一个表中有多个非聚集索引,不返回大型结果集的查询,经常包含在查询的搜索条件中的列逻辑
36、分类:主键索引,系统为主键自动创建的索引,是聚集索引;唯一索引,不允许具有索引值相同的行,禁止重复的索引或键值;组合索引,多个列组合在一起作为索引,适用于多列经常在一起作为查询条件;全文索引,一般为文本数据创建索引,主要用于在大量文本文字中搜索字符串,效率大大高于Like关键字的效率(全文索引需开启SQLFull_textFilterDaemonLauncher服务,且必须有唯一的列,只能用于字符型或Image类型的列,全文目录用于存储全文索引,全文索引)创建索引:唯一索引,CREATEUNIQUENONCLUSTEREDINDEXidx_idCardONTrainee(IdentityCar
37、d);组合索引,CREATENONCLUSTEREDINDEXinx_computeredONRESULT(TrainNo,SubjectNo) 删除索引:DROPINDEX表名.索引名;一般先删除非聚集索引,再删除聚集索引查看索引:[exec]sp_helpindex表名称;使用系统视图SELECT*FROMsys.indexesWHEREobject_id=OBJECT_ID(获取表的ID)(‘Trainee’)维护索引:ALTERINDEX索引名ON表名REBUILD|REORGANISE;使用系统函数查看索引碎片程度,sys.dm_db_index_physical_stats;逻辑
38、碎片百分比 六、存储过程优点:模块化程序设计;执行速度快、效率高;减少网络流量;具有良好的安全性;分类:系统存储过程,以“SP_”开头;扩展存储过程,以“XP_”开头;用户自定义存储过程,分为T_SQL存储过程,CLR存储过程(创建类库项目,输出简单字符串,编译文件,登录到数据库,创建存储过程,以“usp_”开头)常用系统存储过程: 扩展存储过程,只能添加在master数据库中用户自定义存储过程Ifexists(select*fromsysobjectswherename=‘usp_query_book’)Dropprocusp_query_bookGo --无参数 Createpro
39、cusp_query_book2as Select*fromBooksgo --有参数 Createprousp_query_book@numoutput(输出参数),@total(输出参数)asgo 执行存储过程:execusp_query_book declare@numexecusp_query_book@num,100示例: ifexists(select*fromsysobjectswherename="usp_query_subject")go createprocusp_query_subject( @CourseNumintoutput,@HourNuminto
40、utput,@GradeNamevarchar(50))as ifLEN(@GradeName)>0begin print"----该级别下开设科目信息如下----"selectGradeName,SubjectName,ClassHourfromGrade leftjoinsubjectonGrade.GradeId=Subject.GradeIDwhereGradeName=@GradeName select@CourseNum=COUNT(SubjectNo),@HourNum=SUM(ClassHour)fromGrade innerjoinSubjectonGrade.Gr
41、adeID=Subject.GradeIDwhereGradeName=@GradeName return1 dropprocusp_query_subject endelsego return注意事项:在存储过程中,可以包含CREATETABLE语句,但不能包含CREATEPROCEDURE和CREATEVIEW语句;在存储过程中可以声明和使用局部变量;在存储过程中,可以创建和使用临时表;存储过程可以嵌套调用,被调用的存储过程可以使用调用的存储过程中的对象。存储过程的安全与性能优化主要是扩展存储过程,如xp_cmdshell存储过程,可以执行系统命令编写安全扩展存储过程新建类库程序
42、 然后,将类库文件拷贝到安装目录的VC目录下,使用命令提示生成密钥文件输入:snkhelperkey.snk(密钥名) 编译类库文件,生成动态链接库,输入:csc/t:library/keyfile:helperkey.snkExtendPro.cs(类库名称) 注册动态链接库,输入:regasm/tlb:ExtendPro.tlbExtendePro.dll/codebase生成.tlb文件 在SQLServer中利用OLE自动化存储过程调用dll文件首先,创建对象, Declare@Objectint--返回创建的对象Declare@hrint--过程返回值 Declare@re
43、trurnvarchar(255)---dll方法返回值 Declare@srcvarchar(255),@descvarchar(255)---过程的错误原因、描述 Exec@hr=sp_OACreate‘命名空间.类名’,@ObjectoutputIf@hr0BeginExecsp_OAGetErrorInfo@Object,@srcoutput,@descoutputSelecthr=convert(varbinary(4),@hr),Source=@src,Description=@descreturnend 调用方法, Exec@hr=sp_OAMethod@Object,’
44、方法名’,@descoutputIf@hr0BeginExecsp_OAGetErrorInfo@Object,@srcoutput,@descoutputSelecthr=convert(varbinary(4),@hr),Source=@src,Description=@descreturnend 销毁实例 Exec@hr=sp_OADestroy@ObjectIf@hr0BeginExecsp_OAGetErrorInfo@Object,@srcoutput,@descoutputSelecthr=convert(varbinary(4),@hr),Source=@src,Descr
45、iption=@descreturnend 启用与禁用ole自动化存储过程的方法(第二个参数为1时启用,为0时禁用,禁用时,要先保持Sp_configure‘showadvancedoptions’,1的状态,禁用Sp_configure‘oleautomationprocedures’,0;) Sp_configure‘showadvancedoptions’,1Go ReconfigureGo Sp_configure‘oleautomationprocedures’,1Go Reconfigurego 创建加密存储过程语法:createprocwithencryptionas
46、 七、触发器触发器时数据库服务器发生事件时,自动执行的特殊存储过程。作用:强制业务规则;强化约束;跟踪变化;级联运行种类:DML触发器,包括对表或视图发出update、insert或delete语句,又分为after触发器和insteadof触发器;DDL触发器,主要是以create、alter和drop开头的语句修改和删除:alter语句和drop语句1、创建after触发器:createtrigger触发器名称on表名for(after)delete,insert,updateassql语句例1、删除: createtriggerEmployee_Delete onEmployeef
47、ordeleteasinsertintoEmployeeOLDselect*fromdeleted 例2、更新:CreatetriggerBank_UpdateOnBankForupdateAs (ifupdate()可以检测列是否被修改)Declare@beforeMoneyMoney,@afterMoneyMoneySelect@beforeMoney=CurrentMoneyfromdeletedSelect@afterMoney=CurrentMoneyfrominsertedIfABS(@afterMoney-@beforeMoney)>201*0BeginRollbacktra
48、nEnd例3、插入:CreatetriggerBorrow_InsertOnBorrowForinsertAs Declare@countint Select@count=BookCountfromBook WhereBookId=(selectBookIdfromInserted)If@count>0UpdateBooksetBookCount=BookCount-1WhereBookId=(selectBookIdfrominserted)ElseRollbacktran 2、创建insteadof触发器,适用于表或视图:createtrigger触发器名on表名 instead
49、ofdelete,insert,updateassql语句例:createtriggervw_Book_Borrow_Insteadof_DeleteOnvw_Book_BorrowInsteadofdeleteAsDeletefromBorrowBookIdin(selectBookIdfromdeleted)3、DML触发器加密:createtrigger触发器名onwithencryption表名4、DDL触发器:特殊触发器,他是在响应数据定义语言(DDL)语句时触发,仅在DDL语句后才会触发,无法作为insteadof触发器使用DDL语句:create、alter、drop语法:createtrigger触发器名on(allserver或database)for表名assql语句 九、数据库设计设计步骤:需求分析阶段;概要设计阶段;详细设计阶段实体关系模型:实体、属性、关系、映射基数(一对一、一对多、多对多)、实体关系图(E-R图) 三大范式:第一范式:确保每列的原子性,每列都是不可再分的最小数据单元第二范式:必须满足第一范式,目标是确保表中的每列都和主键相关第三范式:满足第二范式,主键外的其他列和主键直接相关优化数据库结构:分离用户数据库与系统数据库;创建数据库表分区;创建垂直分表(分离大文本字段);创建水平分表






