关于视图创建触发器

java_008 2011-01-10 02:41:12
当视图中增加数据时,为什么不能通过触发器推送到另一张表里?
...全文
591 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
java_008 2011-02-02
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 liuyyuns 的回复:]
引用 27 楼 java_008 的回复:
引用 26 楼 liuyyuns 的回复:
你可以考虑用物化视图

物化视图好做么?

物化视图也很简单,你先把两张表抽出一个物化视图,然后在物化视图上面再建立触发器,就可以达到实时的更新了。
[/Quote]

物化视图有简单demo没,那个dblink有点复杂了吧
java_008 2011-02-02
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 upc05070000 的回复:]
你在视图中增加触发器可以 但是向表1中insert 不会触发视图中的触发器
你可以把触发器建在表1中,然后从视图中取数据往表2里推
不过要处理的就是 往表1中增加数据,视图中不一定也会增加,这个要根据你的视图和表1的关系做处理
[/Quote]

这个如何推?需要做一个死循环来查找把?
liuyyuns 2011-01-29
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 java_008 的回复:]
引用 26 楼 liuyyuns 的回复:
你可以考虑用物化视图

物化视图好做么?
[/Quote]
物化视图也很简单,你先把两张表抽出一个物化视图,然后在物化视图上面再建立触发器,就可以达到实时的更新了。
UPC子夜 2011-01-29
  • 打赏
  • 举报
回复
你在视图中增加触发器可以 但是向表1中insert 不会触发视图中的触发器
你可以把触发器建在表1中,然后从视图中取数据往表2里推
不过要处理的就是 往表1中增加数据,视图中不一定也会增加,这个要根据你的视图和表1的关系做处理
liuyyuns 2011-01-29
  • 打赏
  • 举报
回复
http://liuys.javaeye.com/admin/blogs/899399
java_008 2011-01-28
  • 打赏
  • 举报
回复
table1----》view
没人回答我问题么?
我就是想把VIEW中的数据送到表中,但是触发器触发的是table1,然后将view中的数据推送到table2中,可以用触发器实现么?
操作时候不操作view的。。
java_008 2011-01-12
  • 打赏
  • 举报
回复
[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;

或者用触发器更本行不通的?
java_008 2011-01-12
  • 打赏
  • 举报
回复
[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;

或者用触发器更本行不通的?
java_008 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 liuyyuns 的回复:]
你可以考虑用物化视图
[/Quote]
物化视图好做么?
java_008 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 lxyzxq2008 的回复:]
SQL code

--test1表
CREATE TABLE test.test1
(
ID NUMBER(2,0) NOT NULL,
MONEY NUMBER(10,0),
CONSTRAINT YYQ2_INDEX1 PRIMARY KEY (ID……
[/Quote]
只需执行insert into test1 values(1,1);
如果只建view的触发器
--执行后:test1,viewTest中都插入了一条数据,test2中并没有插入数据。

不需要执行insert into viewTest values(2,2);
--执行后,test1,test2,viewTest中都插入了一条数据

目的就是想对test1表操作,然后处理转换testView,将testView的内容推送到test2中。
视图中的数据时通过表1自动增加的,这样没法推送到表二中么?

liuyyuns 2011-01-11
  • 打赏
  • 举报
回复
你可以考虑用物化视图
lxyzxq2008 2011-01-11
  • 打赏
  • 举报
回复

--解决的办法,恐怕你现在的做法要修改了。
--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表中插入数据。


lxyzxq2008 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 java_008 的回复:]

引用 28 楼 lxyzxq2008 的回复:
引用 24 楼 java_008 的回复:

引用 23 楼 wkc168 的回复:

-- Create table
create table TEST1
(
ID NUMBER,
NAME VARCHAR2(20),
PASSWORD VARCHAR2(20)
)

-- Create ……
[/Quote]我明白你的意思,但是你的view的触发器,只有你作用于view时才会触发,
也就是说:insert into test1 values(...) --这个是插入test1表,所以不会触发。
必须这样子 insert into test1_view values(...) --这样子才可以触发view的触发器。
/
心中的彩虹 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 java_008 的回复:]
引用 28 楼 lxyzxq2008 的回复:
引用 24 楼 java_008 的回复:

引用 23 楼 wkc168 的回复:

-- Create table
create table TEST1
(
ID NUMBER,
NAME VARCHAR2(20),
PASSWORD VARCHAR2(20)
)

-- Create table
crea……
[/Quote]



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 22

SQL> select * from test2
2 /

ID NAME PASSWORD
---------- -------------------- --------------------
22 22 22





java_008 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 lxyzxq2008 的回复:]
引用 24 楼 java_008 的回复:

引用 23 楼 wkc168 的回复:
[/Quote]
-- 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 ONLY

create 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中插入数据就好了。。
lxyzxq2008 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 java_008 的回复:]

引用 23 楼 wkc168 的回复:
引用楼主 java_008 的回复:
当视图中增加数据时,为什么不能通过触发器推送到另一张表里?


你这个视图中的列必须是没做任何处理才能写触发器


我的试图使通过表1处理过的试图。。就是表1要增加数据,然后将试图中的数据推送到表2中,没法实现么?
[/Quote]你如果只操作test1表的话,那就是以前说的,在你的view中建立一个触发器,向test2中插入数据就可以了啊!
你想test1表中插入了一条数据,你的view中就增加了一条数据,然后会触发你view的触发器,会向test2表中插入一条数据,不就行了吗?
为神马你那里总是不行呢?
这样:你把你的test1表,view,test2表,以及触发器都贴过来,我给你改下~
java_008 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 wkc168 的回复:]
引用楼主 java_008 的回复:
当视图中增加数据时,为什么不能通过触发器推送到另一张表里?


你这个视图中的列必须是没做任何处理才能写触发器
[/Quote]

我的试图使通过表1处理过的试图。。就是表1要增加数据,然后将试图中的数据推送到表2中,没法实现么?
心中的彩虹 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 java_008 的回复:]
当视图中增加数据时,为什么不能通过触发器推送到另一张表里?
[/Quote]

你这个视图中的列必须是没做任何处理才能写触发器
nxd395239299 2011-01-10
  • 打赏
  • 举报
回复
根据你的触发器:
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)
lxyzxq2008 2011-01-10
  • 打赏
  • 举报
回复
有两个触发器,test1和view都有
加载更多回复(20)

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧