建立触发器:
在a,b表都建立。
当向a插入的时候,查询b里是否有相同的。如果有就返回错误。
当向b插入的时候,查询a里是否有相同的。如果有就返回错误。

解决方案 »

  1.   

    小弟对trigger还不是太了解。楼上dx能否将 trigger例子放出,给小弟参考一下?谢谢!!!
      

  2.   

    使用sequence。两个表的bm都从此sequence中取得。
      

  3.   

    如果你不能改变表结构的话
    而且bm又不是有规律的数据
    那只有往a表插只前先判断另一表中是不是存在了(select...),这样是抛出异常是人为的
    要是必须要提示“违反唯一约束性”的话
    你就先insert into b
    if 成功
      rollback
    else 
      抛出异常
    insert into a
    commit
      

  4.   

    1.根据大家所说些一个触发器
    触发器的使用见后面
    2.建立一张表.c. c里面只有一项bm主建
    a,b表的bm均为c表的外键
    完a,b表插值前,先往c表里插入bm.一旦有重复因为bm值唯一故肯定会报错插入不成功.如果没有重复则插完c的bm后再插入a表或者b表
    创建触发器
    创建触发器前应考虑下列问题: CREATE TRIGGER 语句必须是批处理中的第一个语句。将该批处理中随后的其它所有语句解释为 CREATE TRIGGER 语句定义的一部分。
    创建触发器的权限默认分配给表的所有者,且不能将该权限转给其他用户。
    触发器为数据库对象,其名称必须遵循标识符的命名规则。
    虽然触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建触发器。
    虽然不能在临时表或系统表上创建触发器,但是触发器可以引用临时表。不应引用系统表,而应使用信息架构视图。有关更多信息,请参见信息架构视图。
    在含有用 DELETE 或 UPDATE 操作定义的外键的表中,不能定义 INSTEAD OF 和 INSTEAD OF UPDATE 触发器。
    虽然 TRUNCATE TABLE 语句类似于没有 WHERE 子句(用于删除行)的 DELETE 语句,但它并不会引发 DELETE 触发器,因为 TRUNCATE TABLE 语句没有记录。
    WRITETEXT 语句不会引发 INSERT 或 UPDATE 触发器。 
    创建触发器时需指定: 名称。
    在其上定义触发器的表。
    触发器将何时激发。
    激活触发器的数据修改语句。有效选项为 INSERT、UPDATE 或 DELETE。多个数据修改语句可激活同一个触发器。例如,触发器可由 INSERT 或 UPDATE 语句激活。
    执行触发操作的编程语句。 
    多个触发器
    一个表中可有同类型的多个 AFTER 触发器,前提条件是它们的名称各不相同;每个触发器可以执行多个函数。但是,每个触发器只能应用于一个表,而单个触发器可应用于三个用户操作(UPDATE、INSERT 和 DELETE)的任何子集。一个表只能有一个给定类型的 INSTEAD OF 触发器。触发器权限和所有权
    CREATE TRIGGER 权限默认授予定义触发器的表所有者、sysadmin 固定服务器角色成员以及 db_owner 和 db_ddladmin 固定数据库角色成员,并且不可转让。如果在某个视图上创建 INSTEAD OF 触发器,则所有关系链将断开(如果视图所有者不同时拥有视图和触发器所引用的基表)。对于不属于视图所有者的基表,表所有者必须单独地将必要的权限授予正阅读或更新该视图的任何人。如果同一用户拥有视图和基础基表,则视图和基础基表必须授予其他用户视图的权限,而非个别基表的权限
      

  5.   

    在A表建立触发器:
    Create or Replace Trigger A Before Insert A.bm on A for each Row
    declare
      num number;
      db_error exception;
    begin
      select count(*) into num from B where B.bm = :new.bm;
      if num = 0 then
          insert into B(bm,...) values(bm,....);
      else
          raise db_error; 
      end if;
      exception
         when db_error then
           raise_application_error (-20001,'error'); 
    end
    /B上的触发器和A差不多,改一下就可以拉!
      

  6.   

    谢谢各位了!!!现在问题基本已经解决了,我的触发器是这样写的:
    create or replace trigger a_bi
    before insert on a for each row
    declare
    i number(10);
    begin
    if inserting then
    select count(*) into i from b
    where b.bm=:new.bm;
    if i > 0 then
    raise_application_error(-20001,'b表中已經存在相同的bm的信息,不能添加');
    end if;
    end if;
    end;
    /