
呵呵,看到你的这个问题了,回答一下,希望能给你增加印象。
由于sqlserver
没有oracle中的行级触发器的概念,触发器如下:
create
trigger
[tc2]
on
[dbo][teacher]
for
insert,update
as
if
(select
salary
from
inserted)<3000
update
teacher
set
salary=3000
and
tid=
(select
tid
from
inserted)
说明:当你插入数据的时候,这条数据是存放在inserted表中的,在这个表中把teacher表的主键得到(假如是tid)然后把这个主键信息加到where
条件上,这样就能起到只更新插入的那一条数据的效果了,否则会出现更新了全表的问题。
---
以上,希望对你有所帮助。
两者的具体区别在于:DML触发器是为了响应DELETE,UPDATE,INSERT语句;DDL触发器是为了响应CREATE、ALTER、DROP等任何一条修改数据库结构的语句。今天我们只讨论DML触发器。根据触发器的处罚时间点来分,触发器分为“后触发器”、“替代型触发器”。后触发器是DELETE、UPDATE、INSERT语句运行后触发的SQL语句;替代性触发器是一发出DELETE、UPDATE或者INSERT语句时,数据库不执行DELETE、UPDATE或者INSERT语句,而直接执行触发器中的SQL语句;从性能上来分析,应该是替代型触发器比较优秀。(因为无论如何,后触发型触发器都必须执行DELETE、UPDATE或者INSERT动作,转而执行触发器中的SQL,而替代型触发器直接执行SQL语句)。根据触发器的处罚动作来分,触发器可分为INSERT触发器、DELETE触发器。UPDATE触发器可以看作是INSERT触发器和DELETE触发器的综合。最近在做项目的时候遇到一个问题,就是在查找记录的时候输入关键字找出满足条件的记录。一开始是每一个字段一个关键字,后面感觉有的查找的时候会涉及到6个甚至更多的字段,感觉在查找的时候相当困难。网上找了很久,想找到一种能够不需要指定字段就可以全表搜索的方法,可惜一直没找到,最后找到一个折中的办法:在每一个表中定义一个字段,这个字段存储其他所有字段的和,然后查找的时候就只要匹配这个字段就行了。下面是实现思路:因为在每条数据插入和修改的时候需要往这个字段中插入值或者是更新这个字段,而如果靠代码来控制的话会非常麻烦:你必须时时刻刻记得在哪里插入数据了,又在哪里修改了数据。最后想到了触发器,直接在数据库中建立一个触发器。触发器语句如下:Create trigger [GECOAssets_Trigger]on [dbo][GECOAssets] forinsert,updateasUpdate GECOAssets SetSumText=isnull(SourceID,'') +'∩'+isnull(SourceName,'')+'∩'+isnull(StateNow,'')+'∩'+isnull(BuyDepartment,'')+'∩'+isnull(Factory,'')+'∩'+isnull(SourceType,'')+'∩'+isnull(BackInfo,'')这样原本以为已经大功告成了,最后测试的时候发现,只要插入一条数据,或者表中的某个字段的值发生改变,所有的SumText的值都会被重新更新或者插入,当数据量很大的时候或者数据更新插入很频繁的时候,势必给数据库造成很大的压力。这时我突然想起了当初学Orace的时候老师讲过的行级触发器,于是百度、谷歌找了很久,最后得出的结论是:MS SQLServer不支持行级触发器。这下让我很受打击啊,毕竟自己觉得还不错的方法就这样被终结了,心情极度郁闷。不过,不抛弃不放弃是我的座右铭,于是死磕继续百度、谷歌,最后发现,在插入和更新数据的时候,会有一个表叫做inserted,而这个表会存储你更新时候的数据,这样,我灵光一闪:那这个表中肯定就会存储这条记录的ID值,只要能取到ID的值,想必就可以指定更新某一条记录了,也就可以实现行级触发器的效果了,我抱着试试看的心态把触发器改成了如下:Alter trigger [GECOAssets_Trigger]on [dbo][GECOAssets] forinsert,updateasUpdate GECOAssets Set+'∩'+isnull(SourceType,'')+'∩'+isnull(BackInfo,'') where ID in (select ID from inserted) 果不其然,完美地实现了行级触发器的效果,至此就可以全表不指定字段(当然还是需要指定SumText字段的)搜索了,感觉虽然不是什么完美的解决方案,但是毕竟还是比较理想的实现了想要的效果。
目测语法是 Oracle 数据库的语法。
那么, 如果这个where aptitudecompanyid=com_baseid;条件获得上面执行的com_baseid怎么获取啊?
可以通过 :oldid 或者 :newid 来获取。
例如:
SQL> CREATE OR REPLACE TRIGGER BeforeUpdateTest
2 BEFORE UPDATE ON test_trigger_table
3 FOR EACH ROW
4 BEGIN
5 dbms_outputput_line('BEFORE UPDATE');
6 dbms_outputput_line('Old Name = ' || :oldname);
7 dbms_outputput_line('New Name = ' || :newname);
8 END;
9 /
Trigger created
SQL>
SQL> UPDATE test_trigger_table SET name = 'XYZ' WHERE id = 1;
BEFORE UPDATE
Old Name = ABC
New Name = XYZ
UPDATE 其实就是执行一次 DELETE *** 作和一次 INSERT *** 作。
在 UPDATE 触发器,触发后旧数据放在 deleted 临时表,新数据放在 inserted 表,楼主只要查这两个表就可以解决问题了。
例子:
DECLARE @password VARCHAR(200)
SELECT @password = [Password] FROM deleted -- 查旧数据
IF( 略
--写得有点多,你只说了jifenlist插入时的情况,我还多写了jifenlist修改或删除的情况
--建表
create table jifenlist(
ID int identity(1,1) primary key,
UserId int,
Jifen int,
[Money] money,
Record varchar(250),
[Time] datetime,
Jifen_ int,
ip char(15),
Grow int
)
go
create table payming_day(
id bigint identity(1,1) primary key,
[uid] bigint not null,
jines float not null,
dates datetime not null
)
go
--建触发器
if exists(select name from sysobjects where name='trigger_tj' and type='tr')
drop trigger trigger_tj
go
create trigger trigger_tj on jifenlist after INSERT,DELETE,UPDATE as
begin
declare @ins int,@del int
select @ins=COUNT() from inserted
select @del=COUNT() from deleted
if(@ins>0 and @del=0) --jifenlist插入数据,payming_day对应累加或插入新的
begin
update payming_day set jines=jines+Jifen
from payming_day,inserted
where payming_dayuid=inserteduserid
and dates>=cast(GETDATE() as date)
and insertedJifen>0
if @@ROWCOUNT=0
insert into payming_day(uid,jines,dates)
select userid,jifen,[time] from inserted
end
if(@ins>0 and @del>0) --jifenlist修改数据,payming_day对应修改
begin
update payming_day set jines=jines-deletedJifen+insertedJifen
from payming_day,inserted,deleted
where payming_dayuid=inserteduserid
and payming_dayuid=deleteduserid
and dates>=cast(GETDATE() as date)
end
if(@ins=0 and @del>0) --jifenlist删除数据,payming_day对应修改
begin
update payming_day set jines=jines-Jifen
from payming_day,deleted
where payming_dayuid=deleteduserid
and dates>=cast(GETDATE() as date)
end
end
go
以上祝你成功!
sql触发器使用方法如下:
1、用来唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。
2、触发器是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动。
3、触发器是用来激活事件的,当对一个表进行 *** 作,就可以激活触发器进行执行事件。
4、触发器经常用于加强数据的完整性约束和业务规则等。
5、比如,一个灯的亮与不亮要靠手动或者声音来处罚执行,这就是触发器的原理。
以上就是关于sql如何查看表触发器信息:就是我想要看这个表有几个触发器 还有触发器的名字 用 语句实现!!全部的内容,包括:sql如何查看表触发器信息:就是我想要看这个表有几个触发器 还有触发器的名字 用 语句实现!!、MS SQL Server 全表搜索触发器语句怎么写、在Mysql中,如何在触发器中捕获当前执行的SQL语句等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)