当视图中增加数据时,为什么不能通过触发器推送到另一张表里?

解决方案 »

  1.   

    当然可以。instead of 触发器就是干这个的。
      

  2.   


    create or replace trigger trg_ins_upd
      instead of update or insert or delete on view_name
    begin
      if inserting then
        insert into table_a...;
      elsif updating then
          update tab.....
      elsif deleting then
             delete from table_a ...;
      end if;
    end;
    ...
    --下面是你的具体操作内容
    --需要注意的是:这样的触发器只有在操作你的view是才会被触发,操作实体表并不会被触发!
      

  3.   

    test1-->view1
    当视图1增加某数据时,将此数据推到表2
    test1字段id,name,password
    test1_view字段id,name,password
    test2字段id,name,password
    carete or replace trigger test_trigger
    instead of insert on test1_view
    for each row 
    begin 
     insert into test2 select t.id,t.name,t.password from test1_view t where t.id =:NEW.ID;
    end;接着执行insert into test002 values ('111','111','111');
    这样test1和test1_view都可以进入数据,test2数据没进不去。。
      

  4.   

    是记录日志的,所以只有insert就可以了。。
      

  5.   


    test002是那个表?
    是另外一个表。。test1_view是用test1表做的一个视图create or replace view test1_view as select * from test1
      

  6.   


    test002是另外一个表。。test1_view是用test1表做的一个视图create or replace view test1_view as select * from test1
      

  7.   


    test1和test2字段是一样的。。
      

  8.   


    test1-->view1
    当视图1增加某数据时,将此数据推到表2
    test1字段id,name,password
    test1_view字段id,name,password
    test2字段id,name,password
    carete or replace trigger test_trigger
    instead of insert on test1_view
    for each row  
    begin  
     insert into test2 select t.id,t.name,t.password from test1_view t where t.id =:NEW.ID;
    end;接着执行insert into test001 values ('111','111','111');
    这样test1和test1_view都可以进入数据,test2数据没进不去。。是这样的。刚才写错了。。
      

  9.   

    你可以这样啊,你的view数据增加是,在触发器中,增加你的test1的数据,随着test1表的数据增加,test2表中也会因为触发器而增加。我给你写了个例子,你看下~
      

  10.   


    --test1表
    CREATE TABLE test.test1
    (
        ID                             NUMBER(2,0) NOT NULL,
        MONEY                          NUMBER(10,0),
        CONSTRAINT YYQ2_INDEX1 PRIMARY KEY (ID) USING INDEX
            ENABLE
    )
    PCTFREE 10
    MAXTRANS 255
    TABLESPACE KANRI
    STORAGE(INITIAL 1M NEXT 1M MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 BUFFER_POOL DEFAULT)
    NOCACHE
    LOGGING
    /--test2表
    CREATE TABLE test.test2
    (
        ID                             NUMBER(1,0) NOT NULL,
        NAME                           VARCHAR2(20),
        SID                            NUMBER(2,0)
    )
    PCTFREE 10
    MAXTRANS 255
    TABLESPACE KANRI
    STORAGE(INITIAL 1M NEXT 1M MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 BUFFER_POOL DEFAULT)
    NOCACHE
    LOGGING
    /--view表(假设view表的元表是test1)
    CREATE OR REPLACE VIEW test.viewTest
        (ID,MONEY)
    AS
    SELECT "ID","MONEY" FROM test1
    /--test1表的触发器
    DECLARE
    BEGIN
      IF INSERTING THEN
        INSERT INTO test2
        VALUES
              (
               :NEW.ID,
               'TEST',
               0
              );
      END IF;
      IF UPDATING THEN
        UPDATE test2
           SET
               ID           = :NEW.ID,
               NAME         = 'TEST'
         WHERE
               ID           = :OLD.ID         ;
      END IF;
    END;--view的触发器
    begin
      if inserting then
        INSERT INTO test1
        VALUES
              (
               :NEW.ID,
               :NEW.MONEY
              );
      elsif updating then
        UPDATE test1
           SET
               ID           = :NEW.ID,
               MONEY         = :NEW.MONEY
         WHERE
               ID           = :OLD.ID         ;
      end if;
    end;--创建OKinsert into test1 values(1,1);
    --执行后:test1,test2,viewTest中都插入了一条数据insert into viewTest values(2,2);
    --执行后,test1,test2,viewTest中都插入了一条数据--你参照该下你的,是不是这个意思!
      

  11.   

    你的触发器对应的是test1_view然而你向test001表里插入数据 是不会触发事件的吧!
      

  12.   

    有两个触发器,test1和view都有
      

  13.   

    根据你的触发器:
    carete or replace trigger test_trigger
    instead of insert on test1_view
    for each row   
    begin   
     insert into test2 select t.id,t.name,t.password from test1_view t where t.id =:NEW.ID;
    end;应该只有向test1_view视图中插入数据的时候,才会向test2表插入数据
    而且插入语句:insert into test2 select t.id,t.name,t.password from test1_view t where t.id =:NEW.ID应该改成 insert into test2 values(:NEW.ID,:NEW.NAME,:NEW.PASSWORD)
      

  14.   

    只需执行insert into test1 values(1,1);
    如果只建view的触发器
    --执行后:test1,viewTest中都插入了一条数据,test2中并没有插入数据。不需要执行insert into viewTest values(2,2);
    --执行后,test1,test2,viewTest中都插入了一条数据目的就是想对test1表操作,然后处理转换testView,将testView的内容推送到test2中。
    视图中的数据时通过表1自动增加的,这样没法推送到表二中么?
      

  15.   

    你如果只操作test1表的话,那就是以前说的,在你的view中建立一个触发器,向test2中插入数据就可以了啊!
    你想test1表中插入了一条数据,你的view中就增加了一条数据,然后会触发你view的触发器,会向test2表中插入一条数据,不就行了吗?
    为神马你那里总是不行呢?
    这样:你把你的test1表,view,test2表,以及触发器都贴过来,我给你改下~
      

  16.   

    -- Create table
    create table TEST1
    (
      ID       NUMBER,
      NAME     VARCHAR2(20),
      PASSWORD VARCHAR2(20)
    )-- Create table
    create table TEST2
    (
      ID       NUMBER,
      NAME VARCHAR2(20),
      PASSWORD VARCHAR2(20)
    )为表1创建视图:
    CREATE OR REPLACE VIEW TEST1_VIEW AS
    SELECT ID,NAME,PASSWORD FROM TEST1
    WITH READ ONLYcreate or replace trigger test_trigger
    instead of  insert on test1_view
    FOR EACH ROW
    begin
    INSERT INTO test2 VALUES (:NEW.ID,:NEW.NAME,:NEW.PASSWORD);
    END;
    执行SQL语句
    insert into test1 values ('22','22','22');
    就会报错。。要不就是表2没有插入数据。。
    如果执行instert into test1,能在test2中插入数据就好了。。
      

  17.   


    SQL> create table TEST1
      2  (
      3    ID NUMBER,
      4    NAME VARCHAR2(20),
      5    PASSWORD VARCHAR2(20)
      6  )
      7  /表已创建。SQL> create table TEST2
      2  (
      3    ID NUMBER,
      4    NAME VARCHAR2(20),
      5    PASSWORD VARCHAR2(20)
      6  )
      7  /表已创建。SQL> CREATE OR REPLACE VIEW TEST1_VIEW AS
      2  SELECT ID,NAME,PASSWORD FROM TEST1  
      3  /
    ---去掉只读的属性 ,像这种视图则可以插入  ,(对列名没做任何修饰 以及没有函数等)
    视图已创建。SQL> ed
    已写入 file afiedt.buf  1  create or replace trigger test_trigger
      2  instead of insert on test1_view
      3  FOR EACH ROW
      4  begin
      5  INSERT INTO test2 VALUES (:NEW.ID,:NEW.NAME,:NEW.PASSWORD);
      6  INSERT INTO test1 VALUES (:NEW.ID,:NEW.NAME,:NEW.PASSWORD);
      7* END;
    SQL> /触发器已创建
    SQL> insert into TEST1_VIEW values ('22','22','22')
      2  /已创建 1 行。SQL> commit
      2  /提交完成。SQL> select * from test1
      2  /        ID NAME                 PASSWORD
    ---------- -------------------- --------------------
            22 22                   22SQL> select * from test2
      2  /        ID NAME                 PASSWORD
    ---------- -------------------- --------------------
            22 22                   22
      

  18.   

    我明白你的意思,但是你的view的触发器,只有你作用于view时才会触发,
    也就是说:insert into test1 values(...)   --这个是插入test1表,所以不会触发。
    必须这样子 insert into test1_view values(...) --这样子才可以触发view的触发器。
    /
      

  19.   


    --解决的办法,恐怕你现在的做法要修改了。
    --1.在你的test1表中创建触发器,触发器向test2表中插入数据,这种情况应该可以满足你现在的做法
       insert into test1 values(...)
       --test2表的数据也会变化--2.在你的view中创建触发器,但是你使用插入语句时应该用这个
       insert into test1_view values(...)--目前,只知道这两种解决方法,你的意思是想这样子(在test1表中插入数据,
    ------然后会自动生成到test1_view中,然后触发test1_viewe的触发器,
    ---------将test1_view中的数据插入到test2表中。)是不是这个意思?
    --只是这个貌似实现不了,还是向view中插入数据,然后你在触发器中可以分别向test1,test2表中插入数据。
      

  20.   

    [Quote=引用 32 楼 lxyzxq2008 的回复:]
    SQL code(在test1表中插入数据,
    ------然后会自动生成到test1_view中,然后触发test1_viewe的触发器,
    ---------将test1_view中的数据插入到test2表中。)
    就是这个意思,
    因为view1是经过处理的,是test1和别的好多表联合起来生成的一张试图,我想的是test1中插入数据时候,直接把数据从view1中推送到test2中。我换做以下方式是不是可以实现我想要的表呢?
       create or replace trigger test_trigger
       instead of insert on test1_view
       FOR EACH ROW
       BEGIN
       INSERT INTO test2 VALUES (:NEW.ID,'','');
       UPDATE test2 SET NAME=(SELECT NAME FROM xxx WHERE ID=:NEW.ID );
       END;或者用触发器更本行不通的?
      

  21.   

    [Quote=引用 32 楼 lxyzxq2008 的回复:]修改下楼上的代码。。将test1_view改为test1
    (在test1表中插入数据,
    ------然后会自动生成到test1_view中,然后触发test1_viewe的触发器,
    ---------将test1_view中的数据插入到test2表中。)
    就是这个意思,
    因为view1是经过处理的,是test1和别的好多表联合起来生成的一张试图,我想的是test1中插入数据时候,直接把数据从view1中推送到test2中。我换做以下方式是不是可以实现我想要的表呢?
      create or replace trigger test_trigger
      instead of insert on test1
      FOR EACH ROW
      BEGIN
      INSERT INTO test2 VALUES (:NEW.ID,'','');
      UPDATE test2 SET NAME=(SELECT NAME FROM xxx WHERE ID=:NEW.ID );
      END;或者用触发器更本行不通的?
      

  22.   

    table1----》view
    没人回答我问题么?
    我就是想把VIEW中的数据送到表中,但是触发器触发的是table1,然后将view中的数据推送到table2中,可以用触发器实现么?
    操作时候不操作view的。。
      

  23.   

    你在视图中增加触发器可以 但是向表1中insert 不会触发视图中的触发器
    你可以把触发器建在表1中,然后从视图中取数据往表2里推
    不过要处理的就是 往表1中增加数据,视图中不一定也会增加,这个要根据你的视图和表1的关系做处理
      

  24.   

    http://liuys.javaeye.com/admin/blogs/899399
      

  25.   


    物化视图有简单demo没,那个dblink有点复杂了吧