养生 装修 购物 美食 感冒 便秘 营销 加盟 小吃 火锅 管理 创业 搭配 减肥 培训 旅游

数据库触发器的创建

时间:2024-10-17 22:17:02

触发器(trigger)是SQLserver提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。触发器可以从DBA_TRIGGERS,USER_TRIGGERS数据字典中查到。SQL3的触发器是一个能由系统自动执行对数据库修改的语句。

工具/原料

sqlserver

方法/步骤

1、触发器作用:a.触发器通常用于强制业务规则b.触发器是一种高级约束,可以定义比用CHECK约束更为复杂的约束c.可执行复杂的SQL语句(if/while/case)可引用其它表中的列d.触发器定义在特定的表上,与表相关不能直接调用的存储过程e.是一个事务(可回滚)ps:它是一种特殊的存储过程,也具备事务的功能,它能在多表之间执行特殊的业务规则.触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。

2、--创建触发器语法createtriggertrigger_nameon{table_name|view_name}{After|Insteadof}{insert|update|delete}as相应T-SQL语句

数据库触发器的创建

3、--触发器我们用银行转账作为例子--创建一张银行表createtablebank( 咯悝滩镞cardIdchar(9)primarykey,cu霜杼厮贿stomerNameCHAR(10),--顾客姓名 currentMoneyMONEYdefault(1)check(currentMoney>0)--当前余额)gocreatetabletransInfo( cardIdchar(9)referencesbank(cardId), transTypevarchar(10)notnull, transMoneyMONEYnotnull)goINSERTINTObank(cardId,customerName,currentMoney)VALUES('10010001','张三',1000)INSERTINTObank(cardId,customerName,currentMoney)VALUES('10010002','李四',1)go

4、createtriggertrig_TransontransInfoforinsertas declare@moneymoney declare@cardIdchar(9) select@cardId=cardId,@money=casetransTypewhen'支出'then-transMoneyelsetransMoneyendfrominserted updatebanksetcurrentMoney=currentMoney+@moneywherecardId=@cardId if(@@error>0) begin raiserror('交易失败',5,1) rollback end else begin print('交易成功') --commit endgo

数据库触发器的创建

5、执行触发器,在添加数据这个操作的时候insertintotransInfovalues('10010001','支取',200)insertintotransInfovalues('10010002','存入',20000)insertintotransInfovalues('10010002','支取',20001)

数据库触发器的创建

6、crea隋茚粟胫tetriggertrig_Bankonbankforupdateas declare@newMoneymoney d髫潋啜缅eclare@oldMoneymoney declare@moneymoney declare@cardIdchar(9) select@cardId=cardId,@newMoney=currentMoneyfrominserted select@oldMoney=currentMoneyfromdeleted set@money=abs(@newMoney-@oldMoney) if(@money>20000) begin raiserror('每笔交易金额不能超过20000元,交易失败',6,1) print('交易金额:'+convert(varchar(20),@money)) rollback end else begin print('交易成功!交易金额:'+convert(varchar(20),@money)) print('帐号:'+convert(varchar(20),@cardId)+'帐户余额:'+convert(varchar(20),@newMoney)) endgo

数据库触发器的创建

7、触发器--删除触发:deletebankwherecardId='10010003'

数据库触发器的创建

8、触发器触发时:系统自动在内存中创建deleted表或inserted表只读,不允许修改;触发器执行完成后,自动删除

数据库触发器的创建

© 一点知识