老尸 发表于 2015-1-16 22:34:09

MSSQL网站制作之初学触发器

线上或者测试环境经常出现的误操作总是让DBA同学那么闹心。初学|触发器
这里只盘算解说四部分了,也就最复杂、最经常使用的四部分。

1、触发器。

界说:作甚触发器?在SQLServer内里也就是对某一个表的必定的操纵,触发某种前提,从而实行的一段程序。触发器是一个特别的存储历程。
罕见的触发器有三种:分离使用于Insert,Update,Delete事务。(SQLServer2000界说了新的触发器,这里不提)

我为何要利用触发器?好比,这么两个表:

CreateTableStudent(--先生表
StudentIDintprimarykey,--学号
....
)

CreateTableBorrowRecord(--先生借书纪录表
BorrowRecordintidentity(1,1),--流水号
StudentIDint,--学号
BorrowDatedatetime,--借出工夫
ReturnDAteDatetime,--偿还工夫
...
)

用到的功效有:
1.假如我变动了先生的学号,我但愿他的借书纪录仍旧与这个先生相干(也就是同时变动借书纪录表的学号);
2.假如该先生已卒业,我但愿删除他的学号的同时,也删除它的借书纪录。
等等。

这时候候能够用到触发器。关于1,创立一个Update触发器:

CreateTriggertruStudent
OnStudent
forUpdate
As
ifUpdate(StudentID)
begin

UpdateBorrowRecord
SetStudentID=i.StudentID
FromBorrowRecordbr,Deletedd,Insertedi
Wherebr.StudentID=d.StudentID

end

了解触发器内里的两个一时的表:Deleted,Inserted。注重Deleted与Inserted分离暗示触发事务的表“旧的一笔记录”和“新的一笔记录”。
一个Update的历程能够看做为:天生新的纪录到Inserted表,复制旧的纪录到Deleted表,然后删除Student纪录并写进新记录。

关于2,创立一个Delete触发器
CreatetriggertrdStudent
OnStudent
forDelete
As
DeleteBorrowRecord
FromBorrowRecordbr,Deltedd
Wherebr.StudentID=d.StudentID

从这两个例子我们能够看到了触发器的关头:A.2个一时的表;B.触发机制。
这里我们只解说最复杂的触发器。庞大的容后申明。
现实上,我不勉励利用触发器。触发器的初始计划头脑,已被“级联”所替换
在Windows中MySQL以服务形式存在,在使用前应确保此服务已经启动,未启动可用netstartmysql命令启动。而Linux中启动时可用“/etc/rc.d/init.d/mysqldstart"命令,注意启动者应具有管理员权限。

兰色精灵 发表于 2015-1-19 16:34:09

你可以简单地认为适合的就是好,不适合就是不好。

山那边是海 发表于 2015-1-27 17:20:20

对于微软系列的东西除了一遍遍尝试还真没有太好的办法

透明 发表于 2015-2-5 10:31:17

groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。

爱飞 发表于 2015-2-11 09:32:02

你可以简单地认为适合的就是好,不适合就是不好。

只想知道 发表于 2015-3-2 09:59:59

从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。

活着的死人 发表于 2015-3-11 03:11:35

一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)

蒙在股里 发表于 2015-3-17 19:44:33

多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。

若相依 发表于 2015-3-24 23:00:31

原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。
页: [1]
查看完整版本: MSSQL网站制作之初学触发器