SQL Server2008触发器学习笔记
- 格式:doc
- 大小:91.00 KB
- 文档页数:9
Sqlserver2008学习笔记(自己总结)第一章SQL Server基础1、利用T-SQL语句创建数据库, 删除一个数据库, 更改数据库名称第二章T-SQL语句1、SQL 2008视频教程-数据库表常用术语数据表常用术语:关系:关系即二维表,每一个关系有一个关系名,就是表名。
表中的行,称之为记录表中的列,称之为字段或属性关联:是指不同数据库表之间的数据彼此联系的方式。
关键字:属性或属性的组合,可以用于维一标识一条记录。
外部关键字:如果表中的一个字段(即表中的列),不是本表中的关键字而是其它表的关键字,称之为外部关键字。
2、SQL 2008视频教程-系统数据库Master(主)Model(模型)Tempdb (临时数据库)Msdb(MS数据库)3、T-SQL创建数据库详解4、T-SQL语句3 (T-SQL语句浏览表格(教师表))Select * from 教师表 --表示浏览教师表里所有的信息*号是通配符,表示所有的意思执行Select * from 教师表结结果如下5、用T-SQL 语句在教师表里如何增加字段,删除某个字段,更新某个字段的内容(1)用T-SQL 语句在教师表里如何增加字段执行Select * from 教师表结结果如下(2)用T-SQL 语句在教师表里如何删除某个字段执行Select * from 教师表结结果如下(3)用T-SQL 语句在教师表里更新某个字段的内容执行Select * from 教师表结结果如下6、查询(重中之重!!!)(1) 查询要用到的三张表:(下面的所有操作都是基于这三张表)1.emp表(员工表 employee)2.dept表(部门表 department) 3.salgrade表(工资等级表)(2)对以上三张表查询操作(包括计算列,distinct,between,in,top,null,order by,模糊查询,聚合函数,group by,having,链接查询)注意distinct 的用法例子如下图:实例如下:注意 group by 与COMPUTE BY 的区别GROUP BY子句有个缺点,就是返回的结果集中只有合计数据,而没有原始的详细记录。
选择题物理设计逻辑设计概念设计物理设计阶段逻辑结构设计①数据库逻辑模式调整,确定文件、关系模式转化为关系表的组织与存取方式、评估物理模式;②需要考虑RAID级别、操作系统的文件管理机制、数据库管理系统支持的索引类型,不包括数据存储方式、路径的具体细节③需考虑设置合理的数据库管理系统参数和操作系统相关参数;④系统数据存储安全设计、数据分布设计、索引设计、系统配置;⑤分析与描述目标系统对响应时间、存储容量的要求;⑥着眼于数据库底层的物理存储与存取,与操作系统和硬件环境及数据库管理系统密切相关;⑦需要合理安排不同的存储介质,索引文件根据访问频率决定存储(高速磁盘或磁带),日志文件可以考虑存储在磁带中;①在E-R图基础上确定关系模式,设计视图和关系模式的完整性约束;②适当降低关系模式的规范化程度,可以减少查询过程中的JION操作;③当一个表的数据量超过一定的规模时,可以采用分割表的方法提高效率;数据库应用系统设计①数据分布设计;②数据库逻辑模式调整;③文件组织与存取设计;④安全模式设计;⑤确定系统配置;⑥物理模式评估①数据库逻辑结构设计;②数据库事务概要设计;③应用程序概要设计①将具有相同属性特征的同类抽象为实体集,用一个有意义的名词或名词短语为每一个实体集命名;②系统总体框架设计,每个实体集需要有唯一名字;③目标:描述清楚数据之间的关系、属性特征;定义和描述数据的约束等①数据库物理结构设计②数据库事务详细设计③应用程序详细设计物理设计阶段活动概念结构设计视图(外模式实现的方式之一)将查询命令和结果用虚拟表(临时表)保存起来:①提供安全性,表结构不允许修改;②提高数据处理效率数据库性能优化数据库性能优化① 增加派生性冗余列增加负担,但减少查询时JOIN 操作;根据业务需要调整相关查询或视图 ② 反规范化(适当降低关系模式规范化程度),可以减少查询过程中的JION 操作;处理后的数据表不一定满足第三范式要求, ③ 当一个表的数据量超过一定的规模时,可以采用分割表的方法提高效率; ④ 修改频繁使用的SQL 语句,提高其性能,可能会大幅度降低数据库的CPU 使用率 ⑤ 现阶段性能优化一般以软件为主要调优手段; ⑥ 服务器磁盘IO 出现写瓶颈时,可以考虑使用高速磁盘存储常用数据,低速磁盘存储不常用数据 ⑦ 根据应用系统运行情况完善应用功能,提高人员工作效率; ① 索引视图只能引用同一数据库中的基表,不能是其它标准视图; 视图返回的结果集的格式与基本表相同,所以可以在视图上再定义视图。
sql2008触发器语句摘要:1.SQL Server 2008 简介2.触发器的概念与作用3.SQL Server 2008 触发器语句的基本结构4.触发器语句的类型与应用场景5.触发器语句的示例与实践正文:【1.SQL Server 2008 简介】SQL Server 2008 是微软推出的一款关系型数据库管理系统,它提供了强大的数据存储、查询和处理功能,被广泛应用于企业级数据解决方案中。
【2.触发器的概念与作用】触发器(Trigger)是一种在对表执行某些操作(如插入、更新或删除数据)时自动执行的存储过程。
触发器可以帮助维护数据的完整性和一致性,简化应用程序的开发和维护。
【3.SQL Server 2008 触发器语句的基本结构】在SQL Server 2008 中,触发器语句的基本结构如下:```CREATE TRIGGER trigger_nameON table_nameFOR EVENT typeASBEGIN-- 触发器执行的操作END;```其中,`trigger_name`是触发器的名称,`table_name`是触发器所关联的表名,`type`表示触发器要监听的事件类型,如INSERT、UPDATE 或DELETE。
【4.触发器语句的类型与应用场景】根据触发器执行的操作不同,可以将触发器分为三类:1.INSERT 触发器:在向表中插入新数据时执行。
应用场景包括:数据验证、数据分页、数据备份等。
2.UPDATE 触发器:在更新表中数据时执行。
应用场景包括:数据验证、数据审计、数据同步等。
3.DELETE 触发器:在删除表中数据时执行。
应用场景包括:数据备份、数据审计、数据同步等。
【5.触发器语句的示例与实践】假设有一个名为`orders`的表,包含以下字段:`order_id`(订单编号)、`order_date`(订单日期)和`total_amount`(订单总金额)。
现在需要创建一个触发器,在向该表插入新数据时,计算订单总金额并与1000 进行比较,如果大于1000 则将订单日期更新为当前日期。
1.数据库引擎没有启动有两种启动方式:(1)开始->程序->Microsoft SQL Server 2008->SQL Server 2008外围应用配置器,在打开的界面单击"服务的连接的外围应用配置器",在打开的界面中找到Database Engine,单击"服务",在右侧查看是否已启动,如果没有启动可单击"启动",并确保"启动类型"为自动,不要为手动,否则下次开机时又要手动启动;(2)可打开:开始->程序->Microsoft SQL Server 2008->配置工具->SQL Server Configuration Manager,选中SQL Server 2008服务中SQL Server(MSSQLSERVER) ,并单击工具栏中的"启动服务"按钮把服务状态改为启动;使用上面两种方式时,有时候在启动的时候可能会出现错误[/b],不能启动,这时就要查看"SQL Server 2008配置管理器"中的SQL Server 2008网络配置->MSSQLSERVER协议中的VIA是否已启用,如果已启用,则把它禁止.然后再执行上述一种方式操作就可以了。
2.进行远程连接时,是否已允许远程连接.SQL Server 2008 在默认情况下仅限本地连接.我们可以手动启用远程连接.在上面第一种方式中,找到Database Engine,单击"远程连接",在右侧将"仅限本地连接(L)"改为"本地连接和远程连接(R)",并选中"同时使用TCP/IP和named pipes(B)".3.如果是远程连接,则还要查看连接数据库的语句是否正确,登录账户是否正确,密码是否正确等.我在一次局域网内连接数据库时,就要因为连接字符串出了问题,在局域网内一台机子连接另一台机子上数据库时,把Data Source=装有数据库的另一台机子的IP.我在连接数据库时总是出现上面的错误,查了好长时间,后来发现,IP没有正确到传到连接字符串,原来我在连接时,使用的是本地,即127.0.0.1,输入的IP没有传到连接字符串01 连接数据库Win7下,先打开SQLServer管理工具(开始菜单/所有程序/Microsoft sql server 2008/SQL Server Management Studio)会弹出“连接到服务器对话框”1 服务器类型:数据库引擎2 服务器名称:127.0.0.13 身份验证:Windows身份验证服务器名称也可以是“(local)”,“.”,“loacalhost”,当本机未安装网卡(驱动)时使用“(local)” 注意:不包括双引号身份验证也可以选择SQLServer 身份验证,要有sa用户密码链接成功后会在左侧“对象资源管理器”显示相关数据库02 新建数据库实例在这里我们使用图形化操作点击127.0.0.1左侧“+”号,右键数据库—新建数据库填上数据库名,点击完成,我们就已经在本机建立了一个数据库我这里为了学习用,建了一个数据库(ForStudy),起名字什么的最蛋疼了....接着新建表,看截图,点击新建表后会显示中央显示列信息我们可以在右侧“属性”框把名称改成自己的表名(默认Table_1)设置好列信息后,点击左侧工具栏中的钥匙图标可以在选中的列设置主键,如下Ctrl+S 保存即可在“对象资源管理器”,依次点击打开我们刚刚创建的表(我的是dbo.student)右键,编辑前200行,就可以向刚建的表添加信息了此时数据库中已经建好表,我们也可以对表进行增删改查各种操作在这里多说两句,表的设计很重要,在程序开发的工程中一定要先把数据库设计好否则,等到写代码的途中需要修改数据库的时候你会发现这是有多么的操蛋...03 使用查询语句操作表点击“新建查询”,在中央文本框输入我们查询语句,点击执行即可04 分离数据库文件分离数据库文件,以便在不同的主机中使用该数据库关闭之前的查询语句文本框,在“ForStudy”右键-任务-分离,显示分离对话框点击“确定”,这时我们已经把数据库文件从本机分离出去05 导入数据库能分离必然可以重新导入右键对象资源管理器里的“数据库”,点击“附加”在弹出的对话框中选择“添加”按钮,选择要添加的数据库文件(.mdf后缀的)比如我的是ForStudy.mdf,然后点击确定即可小技巧:使用sqlcmd修改sa密码:CMD下输入(原密码为123456新密码I2e456)sqlcmd 实用工具使用sqlcmd 实用工具,可以在命令提示符处、在SQLCMD 模式下的“查询编辑器”中、在Windows 脚本文件中或者在SQL Server 代理作业的操作系统(Cmd.exe) 作业步骤中输入Transact-SQL 语句、系统过程和脚本文件。
上机实训07存储过程和触发器学号______________姓名____________任务描述启动SQL server 2008,附加数据库xscjglDB,执行相应的操作。
任务描述对数据库xscjglDB中的表设置相关的规则。
设计过程1.创建成绩的规则(0分-100分)CREATE RULE cj_rule AS @cj BETWEEN 0 and 1002.将cj_rule规则绑定到成绩信息表的成绩字段上:EXEC sp_bindrule'cj_rule','成绩信息表.成绩'3.创建性别的规则,并绑定到学生信息表的性别列上。
Createrule xb_rule As @xb='男' or @xb='女'GoExec sp_bindrule 'xb_rule','学生信息表.性别'4.将cj_rule规则删除第一步:要解除绑定到成绩信息表的成绩列上的规则,可以使用下面SQL语句:EXEC sp_unbindrule'成绩信息表.成绩'第二步:解除规则的绑定后,就可以使用DROP RULE语句删除,其语法格式如下:DROP RULE cj_rule任务描述对数据库xscjglDB中创建的使用存储过程。
设计过程1.简单的存储过程proxs_list,用于显示学生信息:USE xscjgldbgoCREATEPROCEDURE proxs_listASSELECT 学号,姓名,性别FROM 学生信息表goexec proxs_list成果展示(裁图):2.下面的SQL语句创建一个存储过程xspjcj,当输入学生姓名时,显示学生的各科的平均成绩。
USE xscjglDBgocreate proc xspjcj@xm char(10)asselect AVG(成绩) from 学生信息表,成绩信息表where 学生信息表.学号=成绩信息表.学号and 学生信息表.姓名=@xmgoexec xspjcj‘郭俊’成果展示(裁图):3.下面的SQL语句创建了一个用于向班级信息表中插入记录的存储过程USE xscjglDBGOCREATE PROC pro_Addbj(@bjh nvarchar(255),@bjm nvarchar(255),@zy nvarchar(255),@yj float,@tea varchar(255))ASINSERT INTO 班级信息表VALUES(@bjh,@bjm,@zy,@yj,@tea)GOEXEC pro_Addbj 'bj1501','计算机班1501班','计算机网络',2015,'tc002'GoSelect * from 班级信息表成果展示(裁图):任务描述对数据库xscjglDB中创建的使用触发器。
SQLServer触发器学习笔记————————————————————————————————作者:————————————————————————————————日期:触发器一﹕触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。
所以触发器可以用来实现对表实施复杂的完整性约束。
二﹕SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。
这两个表由系统来维护﹐它们存在于内存中而不是在数据库中。
这两个表的结构总是与被该触发器作用的表的结构相同。
触发器执行完成后﹐与该触发器相关的这两个表也被删除。
Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。
Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。
三﹕Instead of 和After触发器SQL Server提供了两种触发器﹕Instead of 和After 触发器。
这两种触发器的差别在于他们被激活的操作﹕Instead of触发器用于替代引起触发器执行的T-SQL语句。
除表之外﹐Instead of 触发器也可以用于视图﹐用来扩展视图可以支持的更新操作。
After触发器在一个Insert,Update或Deleted语句之后执行﹐进行约束检查等动作都在After 触发器被激活之前发生。
After触发器只能用于表。
一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器﹐一个表的每个修改动作都可以有多个After触发器。
INSTEAD OF触发器被用于更新那些没有办法通过正常方式更新的视图。
通常不能在一个基于连接的视图上进行DELETE操作,可以编写一个INSTEAD OF DELETE触发器来实现删除。
可以访问那些如果视图是一个真正的表时已经被删除的数据行,它将把删除的行存储在deleted临时表中。
SQLServer(2008)中通过触发器进行数据同步的设置说明根据公司领导要求,为了减轻数据库服务器上的压力。
特将其中一部分数据分离出来,放到另外一台数据库服务器上。
因此需要对基础数据进行一个同步操作。
要进行数据同步,可以通过代码、触发器、日志复制等。
因为此处涉及到的数据量不大,且不方便修改程序代码。
所有采取的是Sql Server中触发器的一个同步。
下面就对触发器进行数据同步的一些配置做下说明:环境:Sql Server 2008Windows Server 20081.确定两台数据库服务器上要进行同步的数据库及表结构2.在作为数据源的数据库服务器上对应的表上创建触发器:(204.17是数据源服务器,201.17是要同步的服务器)例子中的触发器的作用是将102.1.204.17服务器上test数据库中user表中的数据同步到201.17上的表中去(触发条件是任何添加、修改、删除操作)。
3.启动两台服务器上的Distributed Transaction Coordinator服务(开始--运行--services.msc 回车,找到前面的这个服务--启动)4.MSDTCMSDTC设置windows server 2003设置:windows server 2008设置:5.检查防火墙。
可以关闭防火墙或把MSDTC加入例外。
6.检查两台服务器通信是否正常:a) telnet DbIP 135是否可以通;b) 然后相互Ping IP;c) 再ping 相互的NetBios名称(输入ping -a ip就可以看到对应的NetBios名称),还不通的话d) 可以修改%windir%/system32/etc/hosts,或%windir%/system32/etc/lmhost.sam去掉文件扩展名,进行DB 服务和IP的绑定即可,如下图所示:到这里通过触发器进行数据库分布式开发的环境就准备好了。
触发器一﹕触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。
所以触发器可以用来实现对表实施复杂的完整性约束。
二﹕SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。
这两个表由系统来维护﹐它们存在于内存中而不是在数据库中。
这两个表的结构总是与被该触发器作用的表的结构相同。
触发器执行完成后﹐与该触发器相关的这两个表也被删除。
Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。
Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。
三﹕Instead of 和After触发器SQL Server提供了两种触发器﹕Instead of 和After 触发器。
这两种触发器的差别在于他们被激活的操作﹕Instead of触发器用于替代引起触发器执行的T-SQL语句。
除表之外﹐Instead of 触发器也可以用于视图﹐用来扩展视图可以支持的更新操作。
After触发器在一个Insert,Update或Deleted语句之后执行﹐进行约束检查等动作都在After 触发器被激活之前发生。
After触发器只能用于表。
一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器﹐一个表的每个修改动作都可以有多个After触发器。
INSTEAD OF触发器被用于更新那些没有办法通过正常方式更新的视图。
通常不能在一个基于连接的视图上进行DELETE操作,可以编写一个INSTEAD OF DELETE触发器来实现删除。
可以访问那些如果视图是一个真正的表时已经被删除的数据行,它将把删除的行存储在deleted临时表中。
本次练习将通过具体的例子介绍如何使用INSTEAD OF触发器,使读者掌握INSTEAD OF 触发器的使用方法。
向student表中插入数据时,检查学号是否存在于student表中,如存在则进行插入操作,否则就不插入,具体语句如下所示:CREATE TRIGGER [checkid]ON dbo.studentINSTEAD OF insertASIF NOT EXISTS(SELECT * FROM dbo.studentWHERE ID=(SELECT ID FROM INSERTED))BEGINROLLBACK TRANSACTIONPRINT '要处理记录的学号不存在!'ENDELSEBEGININSERT NTO dbo.studentselect * from insertedPRINT '已经成功处理记录!'END执行以上代码后,然后,输入以下代码进行测试,代码如下:INSERT INTO dbo.student V ALUES(6,'史琳达','女',20,'006')四﹕触发器的执行过程如果一个Insert﹑update或者delete语句违反了约束﹐那幺After触发器不会执行﹐因为对约束的检查是在After触发器被激动之前发生的。
所以After触发器不能超越约束。
Instead of 触发器可以取代激发它的操作来执行。
它在Inserted表和Deleted表刚刚建立﹐其它任何操作还没有发生时被执行。
因为Instead of 触发器在约束之前执行﹐所以它可以对约束进行一些预处理。
五﹕使用T-SQL语句来创建触发器基本语句如下﹕create trigger trigger_nameon {table_name | view_name}{for | After | Instead of }[ insert, update,delete ]as sql_statement六﹕删除触发器:基本语句如下﹕drop trigger trigger_name七:查看数据库中已有触发器:-- 查看数据库已有触发器use jxcSoftware go select * from sysobjects where xtype='TR'-- 查看单个触发器exec sp_helptext '触发器名'八﹕修改触发器:基本语句如下﹕alter trigger trigger_nameon {table_name | view_name}{for | After | Instead of } [ insert, update,delete ]as sql_statement1、触发器实例Create Table Student(--学生表StudentID int primary key, --学号.... )Create Table BorrowRecord( --学生借书记录表BorrowRecord int identity(1,1), --流水号StudentID int , --学号BorrowDate datetime, --借出时间ReturnDAte Datetime, --归还时间... )用到的功能有:1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
这时候可以用到触发器。
对于1,创建一个Update触发器:Create Trigger truStudentOn Student --在Student表中创建触发器for Update --为什么事件触发As --事件触发后所要做的事情if Update(StudentID)beginUpdate BorrowRecordSet StudentID=i.StudentIDFrom BorrowRecord br ,Deleted d ,Inserted i --Deleted和Inserted临时表Where br.StudentID=d.StudentIDend理解触发器里面的两个临时的表:Deleted , Inserted 。
注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。
对于2,创建一个Delete触发器Create trigger trdStudentOn Studentfor DeleteAsDelete BorrowRecordFrom BorrowRecord br , Delted dWhere br.StudentID=d.StudentIDSQL触发器实例2USE MasterGOIF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = '卷烟库存表')DROP TABLE 卷烟库存表GOIF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U' AND NAME = '卷烟销售表')DROP TABLE 卷烟销售表GO--业务规则:销售金额= 销售数量* 销售单价业务规则。
CREATE TABLE 卷烟销售表( 卷烟品牌V ARCHAR(40) PRIMARY KEY NOT NULL,购货商V ARCHAR(40) NULL,销售数量INT NULL,销售单价MONEY NULL,销售金额MONEY NULL)GO--业务规则:库存金额= 库存数量* 库存单价业务规则。
CREATE TABLE 卷烟库存表( 卷烟品牌V ARCHAR(40) PRIMARY KEY NOT NULL,库存数量INT NULL,库存单价MONEY NULL,库存金额MONEY NULL)GO--创建触发器,示例1/* 创建触发器[T_INSERT_卷烟库存表],这个触发器较简单。
说明:每当[卷烟库存表]发生INSERT 动作,则引发该触发器。
触发器功能:强制执行业务规则,保证插入的数据中,库存金额= 库存数量* 库存单价。
注意:[INSERTED]、[DELETED]为系统表,不可创建、修改、删除,但可以调用。
重要:这两个系统表的结构同插入数据的表的结构。
*/IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'TR' AND NAME ='T_INSERT_卷烟库存表')DROP TRIGGER T_INSERT_卷烟库存表GOCREATE TRIGGER T_INSERT_卷烟库存表ON 卷烟库存表FOR INSERTAS--提交事务处理BEGIN TRANSACTION--强制执行下列语句,保证业务规则UPDATE 卷烟库存表SET 库存金额= 库存数量* 库存单价WHERE 卷烟品牌IN (SELECT 卷烟品牌from INSERTED)COMMIT TRANSACTIONGO/* 针对[卷烟库存表],插入测试数据:注意,第一条数据(红塔山新势力)中的数据符合业务规则,第二条数据(红塔山人为峰)中,[库存金额]空,不符合业务规则,第三条数据(云南映像)中,[库存金额]不等于[库存数量]乘以[库存单价],不符合业务规则。
第四条数据库存数量为0。
请注意在插入数据后,检查[卷烟库存表]中的数据是否库存金额= 库存数量* 库存单价。
*/INSERT INTO 卷烟库存表(卷烟品牌,库存数量,库存单价,库存金额)SELECT '红塔山新势力',100,12,1200 UNION ALLSELECT '红塔山人为峰',100,22,NULL UNION ALLSELECT '云南映像',100,60,500 UNION ALLSELECT '玉溪',0,30,0 GO--查询数据SELECT * FROM 卷烟库存表GO/*结果集RecordId 卷烟品牌库存数量库存单价库存金额-------- ------------ -------- ------- ---------1 红塔山新势力100 12.0000 1200.00002 红塔山人为峰100 22.0000 2200.00003 云南映像100 60.0000 6000.00004 玉溪0 30.0000 .0000(所影响的行数为 4 行)*/--触发器示例2/* 创建触发器[T_INSERT_卷烟销售表],该触发器较复杂。