oracle触发器获取sql
1. oracle触发器中定时执行sql
1.
关于Oracle
触发器中定时执行SQL
的问题,
Oracle触
发器只是在表中数据被更新
如Insert,update,delete
等情况下才会触发,不能做到定时,只是能是有变化时才会执行!
2.
要做到定时执行可使用Job
来完成
3.
数据已经完成插入,建议插入数据时,直接使用触发器
4.
例2:限制对Departments表修改(包括INSERT,DELETE,UPDATE)的时间范围,即不允许在非工作时间修改departments表。
CREATE OR REPLACE TRIGGER tr_dept_time
BEFORE INSERT OR DELETE OR UPDATE
ON departments
BEGIN
IF (TO_CHAR(sysdate,'DAY') IN ('星期六', '星期日')) OR (TO_CHAR(sysdate, 'HH24:MI') NOT BETWEEN '08:30' AND '18:00') THEN
RAISE_APPLICATION_ERROR(-20001, '不是上班时间,不能修改departments表');
END IF;
END;
2. Oracle中触发器有几种,用法与SQL Server一样吗谢谢
ORACLE触发器有以下两类:
1
语句级(Statement-level)触发器,在CREATE
TRIGGER语句中不包含FOR
EACH
ROW子句。语句级触发器对于触发事件只能触发一次,
而且不能访问受触发器影响的每一行的列值。一般用语句级触发器处理有关引起触发器触发的SQL语句的信息——例如,由谁来执行
2
行级(Row-level)触发器,在CREATE
TRIGGER语句中包含FOR
EACH
ROW子句。行级触发器可对受触发器影响的每一行触发,并且能
够访问原列值和通过SQL语句处理的新列值。行级触发器的典型应用是当需要知道行的列值时,执行一条事务规则。
SQL
Server支持两种类型的触发器:
AFTER
触发器和INSTEAD
OF
触发器。其中AFTER
类型触发器要求只有执行某一操作(INSERT
UPDATE
DELETE)
之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于AFTER
触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder
来完成此任务。
INSTEAD
OF
触发器表示并不执行其所定义的操作(INSERT、
UPDATE、
DELETE),而仅是执行触发器本身。既可在表上定义INSTEAD
OF
触发器,也可以在视图上定义INSTEAD
OF
触发器,但对同一操作只能定义一个INSTEAD
OF
触发器。
3. 请高手帮忙建个oracle建个全局触发器 保存某用户执行的所有SQL语句,
1.假设用户abc
2.写登录触发器,只要abc用户登录数据库就跟踪它
create or replace trigger sys_logon
after logon
on database
begin
if user='ABC' then
alter session set sql_trace=true;
end if;
end;
/
3.到user_mp_dest去找trace文件,用户abc执行的sql都在里面。
上面写的触发器可能会有些问题,没有环境不好测试,但是基本的原理是这样的,网上查找一下sql_trace的用法,应该比较清楚。还有,在一大堆文件里找那个trace文件可是不容易,你得想办法知道登录用户的操作系统进程号才好找。
4. oracle 修改触发器里的sql文
--设定:--TA(name varchar2(12),num varchar2(10),ydsalary number(12,2))--TB(name varchar2(12),num varchar2(10),ydsalary number(12,2),ynsalary number(12,2))--TC(name varchar2(12),num varchar2(10),ybsalary number(12,2))--TA不可以是视图--触发器写在TA上,为插入前触发:CREATE OR REPLACE TRIGGER TR_IB_TABEFORE INSERTON TAREFERENCING NEW AS New OLD AS OldFOR EACH ROWDECLAREyd TB.ydsalary%TYPE;BEGINSELECT ydsalary INTO yd FROM TB WHERE name=:NEW.name AND num = :NEW.num AND rownum=1;IF :NEW.ydsalary != yd THEN--这里有可能是负数哦insert into TC(name,num,ybsalary) values(:NEW.name,:NEW.num,:NEW.ydsalary - yd);END IF;EXCEPTION WHEN OTHERS THEN RAISE;END TR_IB_TA;/
5. oracle 触发器sql怎么写
--设定:
--TA(namevarchar2(12),numvarchar2(10),ydsalarynumber(12,2))
--TB(namevarchar2(12),numvarchar2(10),ydsalarynumber(12,2),ynsalarynumber(12,2))
--TC(namevarchar2(12),numvarchar2(10),ybsalarynumber(12,2))
--TA不可以是视图
--触发器写在TA上,为插入前触发:
CREATEORREPLACETRIGGERTR_IB_TA
BEFOREINSERT
ONTA
REFERENCINGNEWASNewOLDASOld
FOREACHROW
DECLARE
ydTB.ydsalary%TYPE;
BEGIN
=:NEW.nameANDnum=:NEW.numANDrownum=1;
IF:NEW.ydsalary!=ydTHEN
--这里有可能是负数哦
insertintoTC(name,num,ybsalary)values(:NEW.name,:NEW.num,:NEW.ydsalary-yd);
ENDIF;
EXCEPTION
WHENOTHERSTHEN
RAISE;
ENDTR_IB_TA;
/
6. 如何在oracle 触发器中执行mssql数据库中的存储过程的相关推荐
1:什么叫存储过程?
在oracle中,可以在数据库中定义子程序,这种程序块叫存储过程(procere),它存放在数据字典中,可以在不同用户和应用程序中共享,并可以实现程序的优化和重用。
2:存储过程的有点?
过程运行在服务器端,执行速度快
过程执行一次后代码就驻留在高速缓存中,在以后的操作中,直接调用缓存数据。
确保数据库的安全性,可以不授权用户直接访问应用程序中的一些表,而是授权用户执行访问数据库的过程。
自动完成需要预先执行的任务,过程可以在系统启动时自动运行。、
3:存储过程的创建和执行
用户存储过程只能定义在当前数据库中,可以使用sql语句或OEM创建。
默认情况下,用户创建的存储过程归登录数据库的用户所拥有,DBA可以把许可授权给其他用户。
Sql命令创建存储过程
CREATE procere 过程名
【(parameter parameter_mode date_type,….n)】
IS| AS
BEGIN
SQL_STATEMENT
END 过程名
其中
Parameter表示过程的参数。
parameter_mode:参数的类型,过程参数和函数参数一样,有三种类型IN,OUT,IN OUT
IN 表示参数是输入给过程的。
OUT表示采纳数载过程中被赋值,可以传给过程的外部。
IN OUT表示可以传内,可以传外。
调用存储过程
直接输入存储过程的名字可以执行一个已经定义的存储过程。
存储过程的编辑修改
修改存储过程虽然可以和修改视图一样,用ALTER procere,但是他是用来重新编译和验证用的,如果要修改过程定义,建议还是用create or replace。
存储过程的删除
当某个过程不再需要的时候,应该将其从内存中删除,以释放它占用的资源。
Drop procere 存储过程名。
Drop procere update_info.
触发器
触发器(trigger)是一些过程,与表联系紧密,用于保护表中的数据,当一个基表被修改时,触发器自动就会执行。例如出入其可以实现多个表间数据的一致性和完整性。
一般情况下,对表数据的操作有增删查改,维护数据的触发器也可以分为多种,每张基表最多可以建立12个触发器。
1:Before insert 2:before insert fo each row; 3:after inert
4:after insert for each row 5:before update 6:before update for each row
7:after update 8:after update for each row; 9:before delete;
10:before delete for each row 11:after delete 12:after delete for each row.
利用sql语句创建触发器
语法规则
Create or replace trigger 触发器名
{before| after| instead of}
{delete 【or insert】【or update】【of column ….n 】}
On 表名|视图名
【for each row 】[]where condition]]
Sql_statement[,,,n]
参数说明
Instead of :指定在创建替代触发器。
Of column 指定在哪些列上进行触发。。。
创建触发器的限制
1:触发器中有效的语句可以包括DML语句,但是不能包括DDL,rollback,commit
,savepoint都不适用。
7. 请教,oracle,要做触发器,获取用户输入的SQL语句函数是什么
csdn的说,你这不掏RMB不好给你一对一的专家级answer,是不JJ.
8. Oracle中触发器到SQL中怎么写请大神帮忙!
select count(*) into x1 from 订单 where 订单号=inserted.订单号 and 顾客号=inserted.顾客号;
修改为
select
@x1 = count(*)
from
订单, inserted
WHERE
订单号=inserted.订单号
and 顾客号=inserted.顾客号;
因为 在 SQL Server 里面, 这个 inserted 是一个虚的表,而且是多行的。
不像 Oracle 里面的 :new ,仅仅包含一行数据。
后面那个
if x1=0
要修改为
if @x1=0
9. 如何在触发器中获取SQL语句和执行前的值
目测语法是 Oracle 数据库的语法。
那么, 如果这个where aptitude.companyid=com_base.id;条件获得上面执行的com_base.id怎么获取啊?
可以通过 :old.id 或者 :new.id 来获取。
例如:
SQL> CREATE OR REPLACE TRIGGER BeforeUpdateTest
2 BEFORE UPDATE ON test_trigger_table
3 FOR EACH ROW
4 BEGIN
5 dbms_output.put_line('BEFORE UPDATE');
6 dbms_output.put_line('Old Name = ' || :old.name);
7 dbms_output.put_line('New Name = ' || :new.name);
8 END;
9 /
Trigger created.
SQL>
SQL> UPDATE test_trigger_table SET name = 'XYZ' WHERE id = 1;
BEFORE UPDATE
Old Name = ABC
New Name = XYZ
1 row updated.