|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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提供。 |
|