仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 846|回复: 8
打印 上一主题 下一主题

[学习教程] SQL Server 2005 触发器使用

[复制链接]
变相怪杰 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:19:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
对于insert和delete,event中包含了插入/删除的记录的所有字段的值(太爽了。。)http://www.ckuyun.com/happybird0353/archive/2008/06/30/1232507.html
SQLServer2005触发器使用
SQLServer2005增添功效之一就是数据界说言语(DDL)触发器。在SQLServer7.0和2000中,我们利用数据操纵言语(DML)触发器,当INSERT,UPDATE大概DELETE语句被实行的时分实行一段SQL语句或存储历程,它们只能用于表或视图。
  在SQLServer2005中,我们能够在DDL语句上创建一个触发器来实行任何操纵。触发器的感化局限能够是数据库层或是服务器层。DDL触发器经常使用在数据库布局要变动的时分你希冀的某个举措被实行。
  让我们在数据库上创建一个触发器制止任何用户Create,Alter和Drop表或存储历程。我们假定我们有一个数据库叫DDLTrTest,这个数据库中有一个表(MyTable)和一个存储历程(Usp_QueryMyTable)。
  用上面的语句创立数据库,表和存储历程。
USE[MASTER]
GO
IFEXISTS(SELECTNAMEFROMSYS.DATABASESWHERENAME=NDDLTRTEST)
DROPDATABASE[DDLTRTEST]
GO
CREATEDATABASEDDLTRTEST
GO
USE[DDLTRTEST]
GO
IFEXISTS(SELECT*FROMSYS.OBJECTSWHEREOBJECT_ID=OBJECT_ID(N[DBO].[MYTABLE])
ANDTYPEIN(NU))
DROPTABLE[DBO].[MYTABLE]
GO
CREATETABLEMYTABLE(IDINT,NAMEVARCHAR(100))
GO
INSERTINTOMYTABLESELECT1,A
INSERTINTOMYTABLESELECT2,B
INSERTINTOMYTABLESELECT3,C
INSERTINTOMYTABLESELECT4,D
INSERTINTOMYTABLESELECT5,E
INSERTINTOMYTABLESELECT6,F
GO
USE[DDLTrTest]
GO
IFEXISTS(SELECT*FROMsys.objectsWHEREobject_id=
OBJECT_ID(N[dbo].[usp_querymytable])
ANDtypein(NP,NPC))
DROPPROCEDURE[dbo].[usp_querymytable]
GO
CREATEPROCUSP_QUERYMYTABLE
AS
SELECT*FROMMYTABLE
GO
  我们再创立一个上面如许的DDL触发器STOP_DDL_on_Table_and_PROC。
CREATETRIGGERSTOP_DDL_on_Table_and_PROC
ONDATABASE
FORCREATE_TABLE,DROP_TABLE,
ALTER_TABLE,CREATE_PROCEDURE,
ALTER_PROCEDURE,DROP_PROCEDURE
AS
SELECTEVENTDATA().value
((/EVENT_INSTANCE/TSQLCommand/CommandText)[1],
nvarchar(max))
PRINTYouarenotallowedtoCREATE,ALTERandDROP
anyTablesandProcedures
ROLLBACK;
  这里我们利用了一个SQLServer2005供应的新函数EVENTDATA()来捕捉SQL语句。
  如今我们实验用上面这个命令来给Mytable增添一个列。
AlterTableMyTableAddXINT
  了局就会如许:
AlterTableMyTableAddXINT
(1row(s)affected)
YouarenotallowedtoCREATE,ALTERandDROPanyTablesandProcedures
Msg3609,Level16,State2,Line1
Thetransactionendedinthetrigger.Thebatchhasbeenaborted.
  让我们实验删除表MyTable
DropTableMyTable
  了局将会如许:
DropTableMyTable
(1row(s)affected)
YouarenotallowedtoCREATE,ALTERandDROPanyTablesandProcedures
Msg3609,Level16,State2,Line1
Thetransactionendedinthetrigger.Thebatchhasbeenaborted.
  让我们来实验创立一个存储历程
CREATEPROCEDUREUSP_QUERYMYTABLE2AS
SELECTTOP100*FROMMyTable
  了局将会如许
CREATEPROCEDUREUSP_QUERYMYTABLE2AS
SELECTTOP100*FROMMYTABLE
(1row(s)affected)
YouarenotallowedtoCREATE,ALTERandDROPanyTablesandProcedures
Msg3609,Level16,State2,ProcedureUSP_QUERYMYTABLE2,Line3
Thetransactionendedinthetrigger.Thebatchhasbeenaborted.
STOP_DDL_on_Table_and_PROC这个DDL触发器只是使用在数据库DDLTrTest。在其他数据库上Create,Alter和Drop都能够实行。
  这些触发器能够用上面的命令来停用,启用大概删除。
DISABLETRIGGERSTOP_DDL_ON_TABLE_AND_PROC
ONDATABASE
GO
ENABLETRIGGERSTOP_DDL_ON_TABLE_AND_PROC
ONDATABASE
GO
DROPTRIGGERSTOP_DDL_ON_TABLE_AND_PROCONDATABASE
GO
  假如你想把这个触发器的感化局限从数据库层改动到服务器层,你能够像上面如许把ONDATABASE改成ONALLSERVER。这个触发器就制止用户
  实行Create,Alter和Drop数据库的操纵。
CREATETRIGGERSTOP_DDL_on_Table_and_PROC
ONALLSERVER
FORCREATE_DATABASE,ALTER_DATABASE,DROP_DATABASE
AS
PRINTYouarenotallowedtoCREATE,ALTERandDROPanyDatabases
ROLLBACK;
  如今,我们再来试一下创立,修正和删除一个数据库。
USEMASTER
GO
CREATEDATABASETEST
GO
ALTERDATABASEDDLTRTESTMODIFYFILE
(
NAME=DDLTRTEST,
FILENAME=D:DDLTRTEST.MDF)
GO
USEMASTER
GO
DROPDATABASEDDLTRTEST
GO
  了局以下:
YouarenotallowedtoCREATE,ALTERandDROPanyDatabases
Msg3609,Level16,State2,Line1
Thetransactionendedinthetrigger.Thebatchhasbeenaborted.
Thefile"DDLTRTEST"hasbeenmodifiedinthesystemcatalog.
Thenewpathwillbeusedthenexttimethedatabaseisstarted.
YouarenotallowedtoCREATE,ALTERandDROPanyDatabases
Msg3609,Level16,State2,Line1
Thetransactionendedinthetrigger.Thebatchhasbeenaborted.
YouarenotallowedtoCREATE,ALTERandDROPanyDatabases
Msg3609,Level16,State2,Line1
Thetransactionendedinthetrigger.Thebatchhasbeenaborted.
  服务器层级的触发器能够用上面的命令来停用,启用大概删除。
DISABLETRIGGERSTOP_DDL_ON_TABLE_AND_PROC
ONALLSERVER
GO
ENABLETRIGGERSTOP_DDL_ON_TABLE_AND_PROC
ONALLSERVER
GO
DROPTRIGGERSTOP_DDL_ON_TABLE_AND_PROCONALLSERVER
GO
总结
  这篇文章次要探究了SQLServer2005的新特征DDL触发器和EVENTDATA()函数。
MySQL的海豚标志的名字叫“sakila”,它是由MySQLAB的创始人从用户在“海豚命名”的竞赛中建议的大量的名字表中选出的。获胜的名字是由来自非洲斯威士兰的开源软件开发者AmbroseTwebaze提供。
飘飘悠悠 该用户已被删除
沙发
发表于 2015-1-18 12:54:48 | 只看该作者
在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。
若天明 该用户已被删除
板凳
发表于 2015-1-26 20:56:29 | 只看该作者
SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。
灵魂腐蚀 该用户已被删除
地板
发表于 2015-2-4 21:31:47 | 只看该作者
备份方面可能还是一个老大难的问题。不能单独备份几个表总是感觉不爽。灵活备份的问题不知道什么时候才能解决。
兰色精灵 该用户已被删除
5#
发表于 2015-2-10 17:50:30 | 只看该作者
你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。
小女巫 该用户已被删除
6#
发表于 2015-3-1 14:26:35 | 只看该作者
不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?
活着的死人 该用户已被删除
7#
发表于 2015-3-10 20:02:46 | 只看该作者
换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的
山那边是海 该用户已被删除
8#
发表于 2015-3-17 10:33:45 | 只看该作者
SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。
小妖女 该用户已被删除
9#
发表于 2015-3-24 08:15:32 | 只看该作者
如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-4 10:23

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表