给你看看SQL SERVER处自带的例子吧,和你说的要求差不多.
触发器本身维护两个特殊表:inserted 和 Deleted,删除记录时,deleted表记录被删除的记录,新增记录时,inserted表记录新增的记录;修改记录时,deleted表记录修改前的记录,inserted表记录修改后的记录.
A. 使用 AFTER INSERT 触发器
下列示例假设在 pubs 数据库中存在一个名为 newsale 的表。以下是 newsale 的 CREATE 语句:CREATE TABLE newsale
(stor_id char(4),
ord_num varchar(20),
date datetime,
qty smallint,
payterms varchar(12),
title_id tid)如果希望检查正在尝试插入的每条记录,conditionalinsert 触发器会逐行对插入进行分析,然后删除在 titles 表中没有 title_id 的行。CREATE TRIGGER conditionalinsert
ON sales
AFTER INSERT AS
IF
(SELECT COUNT(*) FROM titles, inserted
WHERE titles.title_id = inserted.title_id) <> @@ROWCOUNT
BEGIN
DELETE sales FROM sales, inserted
WHERE sales.title_id = inserted.title_id AND
inserted.title_id NOT IN
(SELECT title_id
FROM titles)
PRINT 'Only sales records with matching title_ids added.'
END当插入了不可接受的标题时,事务并不回滚;相反,触发器会删除不需要的行。这种删除已插入行的能力取决于引发触发器时处理发生的先后顺序。首先,将行插入 sales 表和 inserted 表中,然后激发触发器。如果要对触发器进行测试,在 newsale 表中插入四行。其中两行的 title_ids 与 titles 表中已有的任何 title_ids 均不匹配。newsalestor_id ord_num 日期 qty payterms title_id
------- -------- ------------------- --- -------- --------
7066 QA7442.3 Jul 25 1995 8:35AM 75 Net 30 PS1372
7066 QA7442.3 Jul 24 1995 8:35AM 75 Net 60 BU7832
7067 D4482 Jul 27 1995 12:00AM 10 Net 30 PSxxxx
7131 N914008 Jul 27 1995 12:00AM 20 Net 30 PSyyyy
第二步,将 newsale 中的数据插入 sales 表中。语句是这样的:INSERT sales
SELECT * FROM newsaleTitle_ids PSxxxx 和 PSyyyy 在 titles 表中没有匹配项,conditionalinsert 触发器即从 sales 和 inserted 表中将它们删除。
触发器本身维护两个特殊表:inserted 和 Deleted,删除记录时,deleted表记录被删除的记录,新增记录时,inserted表记录新增的记录;修改记录时,deleted表记录修改前的记录,inserted表记录修改后的记录.
A. 使用 AFTER INSERT 触发器
下列示例假设在 pubs 数据库中存在一个名为 newsale 的表。以下是 newsale 的 CREATE 语句:CREATE TABLE newsale
(stor_id char(4),
ord_num varchar(20),
date datetime,
qty smallint,
payterms varchar(12),
title_id tid)如果希望检查正在尝试插入的每条记录,conditionalinsert 触发器会逐行对插入进行分析,然后删除在 titles 表中没有 title_id 的行。CREATE TRIGGER conditionalinsert
ON sales
AFTER INSERT AS
IF
(SELECT COUNT(*) FROM titles, inserted
WHERE titles.title_id = inserted.title_id) <> @@ROWCOUNT
BEGIN
DELETE sales FROM sales, inserted
WHERE sales.title_id = inserted.title_id AND
inserted.title_id NOT IN
(SELECT title_id
FROM titles)
PRINT 'Only sales records with matching title_ids added.'
END当插入了不可接受的标题时,事务并不回滚;相反,触发器会删除不需要的行。这种删除已插入行的能力取决于引发触发器时处理发生的先后顺序。首先,将行插入 sales 表和 inserted 表中,然后激发触发器。如果要对触发器进行测试,在 newsale 表中插入四行。其中两行的 title_ids 与 titles 表中已有的任何 title_ids 均不匹配。newsalestor_id ord_num 日期 qty payterms title_id
------- -------- ------------------- --- -------- --------
7066 QA7442.3 Jul 25 1995 8:35AM 75 Net 30 PS1372
7066 QA7442.3 Jul 24 1995 8:35AM 75 Net 60 BU7832
7067 D4482 Jul 27 1995 12:00AM 10 Net 30 PSxxxx
7131 N914008 Jul 27 1995 12:00AM 20 Net 30 PSyyyy
第二步,将 newsale 中的数据插入 sales 表中。语句是这样的:INSERT sales
SELECT * FROM newsaleTitle_ids PSxxxx 和 PSyyyy 在 titles 表中没有匹配项,conditionalinsert 触发器即从 sales 和 inserted 表中将它们删除。
FOR INSERT
AS
BEGIN
if exists(select 1 from inserted where 批号 not in (select 批号 from 库存表))
return
INSERT 表 SELECT * FROM inserted
END
楼主的意思除了大力说得以外还有:
当发生错误的时候还可以将错误记录到Error表中,
下面是在大力的基础上做的一些增加CREATE TRIGGER 名 on 表
FOR INSERT
AS
BEGIN
if exists(select 1 from inserted where 批号 not in (select 批号 from 库存表))
return
INSERT 表 SELECT * FROM inserted
if exists(select 1 from inserted where 批号 in (select 批号 from 库存表))
return
INSERT 表(errors) SELECT * FROM inserted
END
inserted表储存的既然是修改前的记录,那么商品目录中没有的商品批号怎么会保存在
这个表里面??
begin
---返回没有批号的记录集
select * from 上传数据表 where 批号 not in (...))
return -1
end--正常操作
insert ...
select ...return 0
inserted表储存的既然是修改后的记录,那么商品目录中没有的商品批号就是因该
不会发生修改那这个记录怎么会保存在
这个表里面??
我的商品表包含编码(c7),数量(i),批号(c20),失效期(d),购进价(m)
提交的表包含 货单号(c20),药品编码(c7),数量(i),批号(c20)
我希望做的存储过程是这样的
将记录提交时,存储过程将修改商品表中编码,与批号与被提交记录的药品编码和批号
一致的记录,如果提交记录中出现商品表中没有相一致的记录,则触发触发器过程,将
该记录存储到error表中,然后报警,用户确认后,继续执行存储过程
--提交批号正常的商品
update 商品表 set 数量=l.数量+r.数量
from 商品表 l,提交表 r
where l.编码=r.药品编码 and l.批号=r.批号--生成错误表
insert into 错误表(货单号,药品编码,批号,数量)
select 货单号,药品编码,批号,数量
from 提交表
where 药品编码 +'-' +批号
not in (select 编码 +'-'+ 批号 from 商品表)