情况如下:表A
A B C D
1..
2..
3..
1..
1..
2..表B
列A 列B
1 A
2 B
3 C如果对表A有插入,更新行为
当C=1130时 把B列更新成表B中 A值相对应的B的值。
如果修改表A 把列A 值更改,列B相对应的值 也会变化,如果在表B中没有相匹配的 则为空值 ''
把B列的值更新表A数据大概在2-3W条记录 其中C=1130的大概5000条
A B C D
1..
2..
3..
1..
1..
2..表B
列A 列B
1 A
2 B
3 C如果对表A有插入,更新行为
当C=1130时 把B列更新成表B中 A值相对应的B的值。
如果修改表A 把列A 值更改,列B相对应的值 也会变化,如果在表B中没有相匹配的 则为空值 ''
把B列的值更新表A数据大概在2-3W条记录 其中C=1130的大概5000条
A B C D
1 A 1130
2 B 1130
3 C 1130
1 A 1131表乙
A B
1 A
2 B
3 C如果我在表甲中插入INSERT INTO 表甲(A,C) SELECT 1,1130
因为C=1130 所以表甲中的列B 就会更新成 表乙中 A=1 的B值同样 如果我更新表甲第一条记录 把A值 改成 2,因为C=1130 那么对应的B值就变成表乙中的A=2对应的 B值
但是第最后一条记录,因为C=1131 所以对列A的更新 不产生效果。
CREATE TRIGGER iustr5 ON [dbo].[p_ProductTab]
FOR INSERT, UPDATE
ASif exists(select * from inserted where int3=1139 )
beginif update(appellation)
begin
update p_ProductTab
set str5=isnull((select f2 from p_appellationofz where f1=substring(p_producttab.appellation,2,4) ),'')
where id in(select id from inserted where int3=1139)
endend
如果是INSERT的话,是不会执行下面的那个UPDATE语句的。
update 是先把 deleted 删除 然后把 inserted 插入
我开始也觉得 如果insert的话不会插入 可是实际操作时发现直接插入的数据也被更新了
--触发器定义中的 IF UPDATE (列名)子句可用来确定 INSERT 或 UPDATE 语句是否影响到表中的一个特定列。
--无论何时,当列被赋值时,该子句即为 TRUE。
CREATE TRIGGER iustr5 ON [dbo].[p_ProductTab]
FOR INSERT, UPDATE
AS
if exists(select * from inserted where int3=1139 )
begin
if update(appellation)
begin
update a
set str5=isnull((select f2 from p_appellationofz where f1=substring(b.appellation,2,4)),'')
from p_ProductTab a,inserted b
--加上条件限制。
where a.id=b.id and a.int3=b.int3 and b.int3=1139
end
end
on 表或视图
forafterinstead of --操作时机
insert,update,delete
as
sql语句作业: (要求:在northwind表中建立2个表:cust_test和order_test) cust_test: CustomerID char(5) PK order_test:
CustomerID char(5)--对应关系
Custcity Orderid PK
Custname OrderNames
CStatus int OStatus int --状态
Cstorage int Orders int --定购量和库存量
Cdate date Odate date--日期
作业1: 在cust_test表中建立删除触发器,实现上述2表的级联删除。作业2: 在order_test表建立insert触发器,当向order_test表插入一行,如果cust_test表中对应 记录status值为1,说明处于准备状态不能写入该数据。答案1:use northwindgo
create trigger cust_orders_del1
on Cust_test
after delete
as
delete from order_test
where CustomerID in
(select CustomerID from deleted)
go答案2:use northwind
go
create trigger cust_orders_ins2
on order_test
after insert
as
if (select cstatus from cust_test,inserted where
cust_test.customerid=inserted.customerid)=1
begin
print 'The Goods is being processed'
rollback transaction
end
go图形化操作触发器
11.3 查看触发器情况 图形化操作结合T-SQL命令 (1)sp_helptrigger 触发器名 查看触发器的名称,拥有者和五个布尔值supdate,isdelete,isinsert,isafter,isinsteadof(2)sp_helptext 触发器名查看文本信息(3)设置某一触发器的无效和重新有效无效:
use northwind
alter table 表名
disable trigger 触发器名 重新有效:
use northwind
alter table 表名
enable trigger 触发器名(4)删除触发器use northwind
drop trigger 触发器名,触发器名作业3: 在order_test表上建立一个插入触发器,在添加一个订单时,减少cust_test表的相应货物的记录的库存量。作业4: 在order_test表上建立一个插入触发器,规定订单日期(Odate)不能手工修改。作业5: 要求订购的物品一定要在仓库中有的,并且数量足够。例6: 在order_test表上建立一个插入触发器,同时插入多行数据时,要求订购的物品一定要在仓库中有的。答案3:use northwind
go
create trigger cust_orders_ins3
on order_test
after insert
as
update cust_test set cstorage=cstorage-inserted.orders
from cust_test,inserted
where cust_test.customerid=inserted.customerid答案4:use northwind
go
create trigger orderdateupdate
on order_test
after update
as
if update (odate)
begin
raiserror('Error',10,1)
rollback transaction
end答案5: use northwind
go
create trigger order_insert5
on order_test
after insert
as
begin
if(select count(*)
from cust_test,inserted
where cust_test.customerid=inserted.customerid)=0
begin
print 'No entry in goods for your order'
rollback transaction
end
if(select cust_test.cstorage from cust_test,inserted
where cust_test.customerid=inserted.customerid)<
(select inserted.orders from cust_test,inserted
where cust_test.customerid=inserted.customerid)
begin
print 'No enough entry in goods for your order'
rollback transaction
end
end答案6: use northwind
go
create trigger order_insert6
on order_test
after insert
as
if
(select count(*) from cust_test,inserted
where cust_test.customerid=inserted.customerid)<>@@rowcount--可以在触发器逻辑中使用 @@ROWCOUNT 函数以区分单行插入和多行插入。
begin
delete order_test from order_test,inserted
where order_test.orderid=inserted.orderid and
inserted.customerid not in (select customerid from cust_test)
end
print @@rowcount Transact-SQL 参考SET ROWCOUNT 使 Microsoft? SQL Server? 在返回指定的行数之后停止处理查询。
语法
SET ROWCOUNT { number @number_var }参数number @number_var是在停止给定查询之前要处理的行数(整数)。 注释 建议将当前使用 SET ROWCOUNT 的 DELETE、INSERT 和 UPDATE 语句重新编写为使用 TOP 语法。有关更多信息,请参见 DELETE、INSERT 或 UPDATE。 对于在远程表和本地及远程分区视图上执行的 INSERT、UPDATE 和 DELETE 语句,忽略 SET ROWCOUNT 选项设置。 若要关闭该选项(以便返回所有的行),请将 SET ROWCOUNT 指定为 0。 说明 设置 SET ROWCOUNT 选项将使大多数 Transact-SQL 语句在已受指定数目的行影响后停止处理。这包括触发器和 INSERT、UPDATE 及 DELETE 等数据修改语句。ROWCOUNT 选项对动态游标无效,但限制键集的行集和不感知游标。使用该选项时应谨慎,它主要与 SELECT 语句一起使用。如果行数的值较小,则 SET ROWCOUNT 替代 SELECT 语句 TOP 关键字。SET ROWCOUNT 的设置是在执行或运行时设置,而不是在分析时设置。 权限 SET ROWCOUNT 权限默认授予所有用户。 示例 SET ROWCOUNT 在指定的行数后停止处理。在下例中,注意有 x 行满足预付款少于或等于 $5,000 的条件;但是,从更新所返回的行数中可以看出并非所有的行都得到处理。ROWCOUNT 影响所有的 Transact-SQL 语句。 USE pubsGO
SELECT count(*) AS Cnt
FROM titles
WHERE advance >= 5000
GO下面是结果集: Cnt
-----------
11
(1 row(s) affected)
现在,将 ROWCOUNT 设置为 4,并更新预付款等于或大于 $5,000 的所有行。
SET ROWCOUNT to 4.
SET ROWCOUNT 4
GO
UPDATE titles
SET advance = 5000
WHERE advance >= 5000
GO
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sqlove/archive/2008/04/01/2236387.aspx