对于select操作能建立触发器吗?

时间:2021-11-03 05:02:14
对于select操作能建立触发器吗?我想在对某个表上实现:一有select操作就执行一个过程,可以用trigger实现吗?要是不行有别的办法吗?

27 个解决方案

#1


select可以啊

#2


触发器是针对insert,update,delete的,你的要求不可以使用触发器实现。

#3


你需要执行的这个过程是作什么的呢?

#4


不好意思,看错了,看成insert了。嘿嘿

#5


nicholaz(欲上青天揽明月) :
差点误人子弟!:)

#6


是啊!真是不好意思!:)

#7


是想进行一些控制,看它是否符合我的要求

#8


那你可以使用视图,角色,权限,还有一个叫……哎呀忘了

#9


不行吧,我就是需要用自己定义的安全策略加在你说的那些方法之上,
所以才需要获得这个访问,现在就是没办法控制,oracle 有这样的接口吗

#10


你是要对用户所能查看的数据进行控制,我说的那些还有安去策略是可以满足需要的。不知道你要进行什么样的控制?

#11


因为我现在做的程序要求这样,你有没办法实时获得select的信息,包括
操作者,操作对象,操作对象的owner等。
我要用操作者的信息与对象的信息进行比较,

#12


說的不清楚,好像沒有這個觸發器來實現這個功能。能不能換一種方法
去做這個程序

#13


那你可以使用审计audit

#14


完全可以在应用程序级控制,何必在数据库级控制呢!!???

#15


这是因为大家都想死死挖掘oracle的东西

#16


select 实现trigge功能是可以的!

比如要关注那些人查询过那些数据!

方法:
使用 view 来代替表
在view中用一个函数来表示  列
在这个函数中使用  自治事务 (pragma定义)
在这个事务中完成你想要做的操作






#17


大虾快说具体一点

#18


学习ing

#19


大虾是不是说用触发器实现oracle的内部审计?
但这是在需要非常详细的审计信息时用的。

#20


需要解释清楚的是:这个实现方式跟 trigger 没有关系!

create view ........  select funcA() a,... from xxx........

在该函数 FuncA 中:
因为在函数中本身是不能有dml操作的,但我们可以这样实现,参考下面的 存储过程的实现


SQL> select * from test1;

A B
---------- --------------------
1 1
3 3
2 2

SQL> 
SQL> CREATE or replace PROCEDURE insert_test 
2 as
3 PRAGMA AUTONOMOUS_TRANSACTION;
4 BEGIN
5 insert into test1 values(6,6);
6 rollback;
7 END;
8 /

过程已创建。

SQL> begin
2 insert into test1 values(5,5);
3 insert_test;
4 commit;
5 end;
6 /

PL/SQL 过程已成功完成。

SQL> select * from test1;

A B
---------- --------------------
1 1
3 3
2 2
5 5

SQL>

这样在函数中可以进行dml操作并提交或者回退
然后前台查询的人的信息于是被保留在了数据库中

#21


原来是这样的。我还以为触发器真的能对select触发呢!

#22


但我怎么觉得结果不对,没有包括6,6?

#23


如果您直接用 select 语句肯定不行,
但是您可以用 update your_table set your_col=your_col where your_condition return into your_variable;
这样,你既可以得倒 select 出来的数据,还能在此句话上触发触发器事件。

#24


biti_rainy,你说的方法是说在建立视图时引用自己编写的函数吗?
那么,岂不是在对视图进行任何操作的时候都会调用这个函数,而不只select.
我如下做了,发现在操作视图时自治的那个事务被执行了好多遍:
create or replace procedure sqltct
as
   pragma  autonomous_transaction;
begin 
  insert into number_test
  values(7,'wo');
  commit;
end;
create or replace function sel_check(name in varchar2)
return varchar2
is
begin
   sqltct;
   return name;
end;
create view v_teacher(name,id)
as
select sel_check(name),id from teacher;

结果:
select * from v_teacher;
得到返回结果后
在select * from number_test;
得到的结果中有14行“7 wo”,为什么执行了一个select却在number_test
中插入了14行呢

#25


这个问题又涉及到另外一个问题了

那就是你对这个视图的操作
可以建立 instead of trigger  处理dml
并且,在函数中要判断,发现是select (或者满足你所期望的条件的时候)才做这个操作,是dml(不满足条件的时候) 则不执行这个自制事务


当然,这种要求除非是对那种高度机密的信息追踪记录
做起来比较麻烦



#26


学习,学习!

#27


呵呵,如果不select funcA()这一列就无法记录了.
建议还是用audit.

#1


select可以啊

#2


触发器是针对insert,update,delete的,你的要求不可以使用触发器实现。

#3


你需要执行的这个过程是作什么的呢?

#4


不好意思,看错了,看成insert了。嘿嘿

#5


nicholaz(欲上青天揽明月) :
差点误人子弟!:)

#6


是啊!真是不好意思!:)

#7


是想进行一些控制,看它是否符合我的要求

#8


那你可以使用视图,角色,权限,还有一个叫……哎呀忘了

#9


不行吧,我就是需要用自己定义的安全策略加在你说的那些方法之上,
所以才需要获得这个访问,现在就是没办法控制,oracle 有这样的接口吗

#10


你是要对用户所能查看的数据进行控制,我说的那些还有安去策略是可以满足需要的。不知道你要进行什么样的控制?

#11


因为我现在做的程序要求这样,你有没办法实时获得select的信息,包括
操作者,操作对象,操作对象的owner等。
我要用操作者的信息与对象的信息进行比较,

#12


說的不清楚,好像沒有這個觸發器來實現這個功能。能不能換一種方法
去做這個程序

#13


那你可以使用审计audit

#14


完全可以在应用程序级控制,何必在数据库级控制呢!!???

#15


这是因为大家都想死死挖掘oracle的东西

#16


select 实现trigge功能是可以的!

比如要关注那些人查询过那些数据!

方法:
使用 view 来代替表
在view中用一个函数来表示  列
在这个函数中使用  自治事务 (pragma定义)
在这个事务中完成你想要做的操作






#17


大虾快说具体一点

#18


学习ing

#19


大虾是不是说用触发器实现oracle的内部审计?
但这是在需要非常详细的审计信息时用的。

#20


需要解释清楚的是:这个实现方式跟 trigger 没有关系!

create view ........  select funcA() a,... from xxx........

在该函数 FuncA 中:
因为在函数中本身是不能有dml操作的,但我们可以这样实现,参考下面的 存储过程的实现


SQL> select * from test1;

A B
---------- --------------------
1 1
3 3
2 2

SQL> 
SQL> CREATE or replace PROCEDURE insert_test 
2 as
3 PRAGMA AUTONOMOUS_TRANSACTION;
4 BEGIN
5 insert into test1 values(6,6);
6 rollback;
7 END;
8 /

过程已创建。

SQL> begin
2 insert into test1 values(5,5);
3 insert_test;
4 commit;
5 end;
6 /

PL/SQL 过程已成功完成。

SQL> select * from test1;

A B
---------- --------------------
1 1
3 3
2 2
5 5

SQL>

这样在函数中可以进行dml操作并提交或者回退
然后前台查询的人的信息于是被保留在了数据库中

#21


原来是这样的。我还以为触发器真的能对select触发呢!

#22


但我怎么觉得结果不对,没有包括6,6?

#23


如果您直接用 select 语句肯定不行,
但是您可以用 update your_table set your_col=your_col where your_condition return into your_variable;
这样,你既可以得倒 select 出来的数据,还能在此句话上触发触发器事件。

#24


biti_rainy,你说的方法是说在建立视图时引用自己编写的函数吗?
那么,岂不是在对视图进行任何操作的时候都会调用这个函数,而不只select.
我如下做了,发现在操作视图时自治的那个事务被执行了好多遍:
create or replace procedure sqltct
as
   pragma  autonomous_transaction;
begin 
  insert into number_test
  values(7,'wo');
  commit;
end;
create or replace function sel_check(name in varchar2)
return varchar2
is
begin
   sqltct;
   return name;
end;
create view v_teacher(name,id)
as
select sel_check(name),id from teacher;

结果:
select * from v_teacher;
得到返回结果后
在select * from number_test;
得到的结果中有14行“7 wo”,为什么执行了一个select却在number_test
中插入了14行呢

#25


这个问题又涉及到另外一个问题了

那就是你对这个视图的操作
可以建立 instead of trigger  处理dml
并且,在函数中要判断,发现是select (或者满足你所期望的条件的时候)才做这个操作,是dml(不满足条件的时候) 则不执行这个自制事务


当然,这种要求除非是对那种高度机密的信息追踪记录
做起来比较麻烦



#26


学习,学习!

#27


呵呵,如果不select funcA()这一列就无法记录了.
建议还是用audit.