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是才会被触发,操作实体表并不会被触发!
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数据没进不去。。
是记录日志的,所以只有insert就可以了。。
test002是那个表? 是另外一个表。。test1_view是用test1表做的一个视图create or replace view test1_view as select * from test1
test002是另外一个表。。test1_view是用test1表做的一个视图create or replace view test1_view as select * from test1
test1和test2字段是一样的。。
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数据没进不去。。是这样的。刚才写错了。。
--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中都插入了一条数据--你参照该下你的,是不是这个意思!
你的触发器对应的是test1_view然而你向test001表里插入数据 是不会触发事件的吧!
有两个触发器,test1和view都有
根据你的触发器: 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)
只需执行insert into test1 values(1,1); 如果只建view的触发器 --执行后:test1,viewTest中都插入了一条数据,test2中并没有插入数据。不需要执行insert into viewTest values(2,2); --执行后,test1,test2,viewTest中都插入了一条数据目的就是想对test1表操作,然后处理转换testView,将testView的内容推送到test2中。 视图中的数据时通过表1自动增加的,这样没法推送到表二中么?
-- 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中插入数据就好了。。
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
我明白你的意思,但是你的view的触发器,只有你作用于view时才会触发, 也就是说:insert into test1 values(...) --这个是插入test1表,所以不会触发。 必须这样子 insert into test1_view values(...) --这样子才可以触发view的触发器。 /
--解决的办法,恐怕你现在的做法要修改了。 --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表中插入数据。
[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;或者用触发器更本行不通的?
[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;或者用触发器更本行不通的?
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是才会被触发,操作实体表并不会被触发!
当视图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数据没进不去。。
test002是那个表?
是另外一个表。。test1_view是用test1表做的一个视图create or replace view test1_view as select * from test1
test002是另外一个表。。test1_view是用test1表做的一个视图create or replace view test1_view as select * from test1
test1和test2字段是一样的。。
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数据没进不去。。是这样的。刚才写错了。。
--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中都插入了一条数据--你参照该下你的,是不是这个意思!
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)
如果只建view的触发器
--执行后:test1,viewTest中都插入了一条数据,test2中并没有插入数据。不需要执行insert into viewTest values(2,2);
--执行后,test1,test2,viewTest中都插入了一条数据目的就是想对test1表操作,然后处理转换testView,将testView的内容推送到test2中。
视图中的数据时通过表1自动增加的,这样没法推送到表二中么?
你想test1表中插入了一条数据,你的view中就增加了一条数据,然后会触发你view的触发器,会向test2表中插入一条数据,不就行了吗?
为神马你那里总是不行呢?
这样:你把你的test1表,view,test2表,以及触发器都贴过来,我给你改下~
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中插入数据就好了。。
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
也就是说:insert into test1 values(...) --这个是插入test1表,所以不会触发。
必须这样子 insert into test1_view values(...) --这样子才可以触发view的触发器。
/
--解决的办法,恐怕你现在的做法要修改了。
--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表中插入数据。
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;或者用触发器更本行不通的?
(在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;或者用触发器更本行不通的?
没人回答我问题么?
我就是想把VIEW中的数据送到表中,但是触发器触发的是table1,然后将view中的数据推送到table2中,可以用触发器实现么?
操作时候不操作view的。。
你可以把触发器建在表1中,然后从视图中取数据往表2里推
不过要处理的就是 往表1中增加数据,视图中不一定也会增加,这个要根据你的视图和表1的关系做处理
物化视图有简单demo没,那个dblink有点复杂了吧