给你看看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 表中将它们删除。

解决方案 »

  1.   

    CREATE TRIGGER 名 on 表
    FOR INSERT
    AS
    BEGIN
      if exists(select 1 from inserted where 批号 not in (select 批号 from 库存表))
        return
      INSERT 表 SELECT * FROM inserted
    END
      

  2.   

    大力写的很简单明了,但是还是缺少了一些东西
    楼主的意思除了大力说得以外还有:
    当发生错误的时候还可以将错误记录到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
      

  3.   

    恕小弟愚钝
    inserted表储存的既然是修改前的记录,那么商品目录中没有的商品批号怎么会保存在
    这个表里面??
      

  4.   

    哦,以下意见不一定需要认真考虑:这种情况最好不要用触发器,而是用存储过程实现上传记录功能:create proc ...as...if exists (select 1 from 上传数据表 where 批号 not in (...))
    begin
       ---返回没有批号的记录集
       select * from 上传数据表 where 批号 not in (...))
       return -1
    end--正常操作
    insert ...
    select ...return 0
      

  5.   

    不好意思刚才打错个字!
    inserted表储存的既然是修改后的记录,那么商品目录中没有的商品批号就是因该
    不会发生修改那这个记录怎么会保存在
    这个表里面??
      

  6.   

    使用更改语句update
    我的商品表包含编码(c7),数量(i),批号(c20),失效期(d),购进价(m)
    提交的表包含 货单号(c20),药品编码(c7),数量(i),批号(c20)
    我希望做的存储过程是这样的
    将记录提交时,存储过程将修改商品表中编码,与批号与被提交记录的药品编码和批号
    一致的记录,如果提交记录中出现商品表中没有相一致的记录,则触发触发器过程,将
    该记录存储到error表中,然后报警,用户确认后,继续执行存储过程
      

  7.   

    按照你的意思,批号不存在时是不会触发触发器的,而且你既然是用存储过程来提交退货的产品,完成可以直接在提交的储存过程中直接在错误表中生成记录:
    --提交批号正常的商品
    update 商品表 set 数量=l.数量+r.数量
    from 商品表 l,提交表 r
    where l.编码=r.药品编码 and l.批号=r.批号--生成错误表
    insert into 错误表(货单号,药品编码,批号,数量)
    select 货单号,药品编码,批号,数量
    from 提交表
    where 药品编码 +'-' +批号
     not in (select 编码 +'-'+ 批号  from 商品表)