oracle触发器

【赵强老师】利用数据库触发器实现数据的同步

好久不见. 提交于 2020-04-07 10:14:05
一、什么是触发器 数据库触发器是一个与表相关联的,存储的PL/SQL 语句。每当一个特定的数据操作语句(insert update delete)在指定的表上发出时,Oracle自动执行触发器中定义的语句序列。 触发器的应用场景如下: 复杂的安全性检查 数据的确认 数据库审计 数据的备份和审计 二、创建Oracle触发器的语法 CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER } {INSERT | DELETE | UPDATE [OF column [, column …]]} [OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...] ON [schema.]table_name | [schema.]view_name [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}] [FOR EACH ROW ] [WHEN condition] PL/SQL_BLOCK | CALL procedure_name; 其中: BEFORE 和AFTER指出触发器的触发时序分别为前触发和后触发方式,前触发是在执行触发事件之前触发当前所创建的触发器,后触发是在执行触发事件之后触发当前所创建的触发器

oracle触发器使用总结

只谈情不闲聊 提交于 2020-03-18 13:57:28
1.说明 1)触发器是一种特殊的存储过程, 触发器一般由事件触发并且不能接受参数 ,存储器由语句块去调用 2)触发器分类:   1.DML触发器: 创建在表上,由DML事件引发   2.instead of触发器: 创建在视图上并且只能在行级上触发 ,用于替代insert,delete等操作 (由于oracle中不能直接对有两个以上的表建立的视图进行DML操作,所以给出替代触发器,它是专门为进行视图操作的一种处理方法)   3.DDL触发器: 触发事件时数据库对象的创建和修改   4.数据库事件触发器:定义在数据库或者模式上,由数据库事件触发 3)组成:   1.触发事件:引发触发器被触发的事件 DML语句(INSERT, UPDATE, DELETE语句对表或视图执行数据处理操作)、DDL语句(如CREATE、ALTER、DROP语句在数据库中创建、修改、删除模式对象)、数据库系统事件       (如系统启动或退出、异常错误)、用户事件(如登录或退出数据库)。   2.触发时间:即该触发器是在触发事件发生之前 (BEFORE)还是之后(AFTER)触发   3.触发操作:触发器触发后要完成的事情   4.触发对象:包括表、视图、模式、数据库。只有在这些对象上发生了符合触发条件的触发事件,触发器才会执行触发操作。   5.触发条件:由WHEN子句指定一个逻辑表达式

游标和触发器

可紊 提交于 2020-03-12 12:15:10
1. 游标的定义 在 PL/SQL块中执行SELECT、INSERT、DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),即缓冲区。游标是指向该区的一个指针,或是命名一个工作区(Work Area),或是一种结构化数据类型。它为应用等量齐观提供了一种对具有多行数据查询结果集中的每一行数据分别进行单独处理的方法,是设计嵌入式SQL语句的应用程序的常用编程方式。 游标分类 1. 显式 游标用于处理 SELECT 语句返回的多行数据;人为创建,干预 2. 隐式 游标用于处理 SELECT INTO 和非查询的 DML 语句;系统自动创建,管理 2. 显式游标示例练习 --游标传参,显示游标 DECLARE -- 定义游标,指定循环列表 cursor c_cur is select * from ruanjian182; -- 定义收参 v_info ruanjian182%rowtype; BEGIN -- 打开游标 open c_cur; -- loop 循环获取. loop fetch c_cur into v_info; -- 退出条件判断 exit when c_cur%notfound; dbms_output.put_line(v_info.id || ' '||v_info.name); end loop; -- 关闭游标

Oracle触发器的使用

空扰寡人 提交于 2020-03-09 01:46:06
利用触发器制作日志记录表 1.先在sys 账户下建立日志表 CREATE TABLE object_log( logid NUMBER CONSTRAINT pk_logid PRIMARY KEY, operatedate DATE NOT NULL, objecttype VARCHAR2(50) NOT NULL, objectowner VARCHAR2(50) NOT NULL ); 2.紧接着创建一个序列 CREATE SEQUENCE obj_log_seq; 3.创建触发器 CREATE OR REPLACE TRIGGER object_trigger AFTER CREATE OR DROP OR ALTER ON DATABASE BEGIN INSERT INTO object_log VALUES(obj_log_seq.nextval,sysdate,ora_dict_obj_type,ora_dict_obj_owner); END; select * from object_log; 4.回到Scott账户下可以做一些操作 create sequence my_seq; drop sequence my_seq; create table my_user( id number(2), name varchar2(20)); drop table my

Oracle(触发器)

江枫思渺然 提交于 2020-03-01 16:04:50
1、触发器的概念 每当一个特定的数据库操作语句(Insert、Update、delete)在指定的表上发出时,Oracle自动执行触发器中定义的语句序列。 2、触发器的类型 (1)语句级的触发器 触发的对象为表,在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行。 (2)行级触发器(for each row) 触发器作用的对象为每一条记录,在行级触发器中使用:old和:new伪记录变量识别值的状态。 3、定义一个触发器: 4、触发器的应用 (1)安全性检查: create or replace trigger securityemp before insert on emp begin if to_char(sysdate,'day') in ('星期六','星期日') or to_number(to_char(sysdate,'hh24')) not between 9 and 17 then raise_application_error(-20001,'禁止在非工作时间插入新员工'); end if; end securityemp; (2)数据的确认: create or replace trigger checksalary before update on emp for each row begin if :new.sal<:old.sal then

开发PL/SQL子程序和包及使用PL/SQL编写触发器、在JDBC中应用Oracle

时间秒杀一切 提交于 2020-02-11 12:12:29
1. 子程序的各个部分: 声明部分、可执行部分、异常处理部分(可选) 2.子程序的分类: A. 过程 - 执行某些操作 a. 创建过程的语法: CREATE [OR REPLACE] PROCEDURE <procedure name> [(<parameter list>)] IS|AS <local variable declaration> BEGIN <executable statements> [EXCEPTION <exception handlers>] END; b. 过程参数的三种模式: IN:用于接受调用程序的值、默认的参数模式 OUT:用于向调用程序返回值 IN OUT:用于接受调用程序的值,并向调用程序返回更新的值 c. 将过程的执行权限授予其他用户: SQL> GRANT EXECUTE ON find_emp TO MARTIN; SQL> GRANT EXECUTE ON swap TO PUBLIC; d. 删除过程:SQL> DROP PROCEDURE find_emp; B. 函数 - 执行操作并返回值 a. 创建函数的语法: CREATE [OR REPLACE] FUNCTION <function name> [(param1,param2)] RETURN <datatype> IS|AS [local declarations]

PL/SQL轻量版(四)——存储函数/存储过程与触发器

眉间皱痕 提交于 2020-02-11 11:56:34
概述   ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它。这样就叫存储过程或函数。过程和函数统称为 PL/SQL 子程序,他们是被命名的 PL/SQL 块,均存储在数据库中,并通过输入、输出参数或输入/输出参数与其调用者交换信息。 过程和函数的唯一区别是函数总向调用者返回数据,而过程则不返回数据。 一、存储函数    1.创建函数        内嵌函数 CREATE [OR REPLACE] FUNCTION function_name [ (argment [ { IN | IN OUT }] Type, argment [ { IN | OUT | IN OUT } ] Type ] [ AUTHID DEFINER | CURRENT_USER ] RETURN return_type { IS | AS } <类型.变量的说明> BEGIN FUNCTION_body EXCEPTION 其它语句 END; 说明: 1) OR REPLACE 为可选. 有了它, 可以或者创建一个新函数或者替换相同名字的函数, 而不会出现冲突 2) 函数名后面是一个可选的参数列表, 其中包含 IN, OUT 或 IN OUT 标记. 参数之间用逗号隔开. IN 参数 标记表示传递给函数的值在该函数执行中不改变; OUT

PL/SQL触发器

大兔子大兔子 提交于 2020-02-11 11:48:46
在本章中,我们将讨论和学习PL/SQL中的触发器。 触发器是存储的程序,在发生某些事件时会自动执行或触发。事实上,触发器是为了响应以下任何事件而被执行的 - 数据库操作(DML)语句( DELETE , INSERT 或 UPDATE ) 数据库定义(DDL)语句( CREATE , ALTER 或 DROP )。 数据库操作( SERVERERROR , LOGON , LOGOFF , STARTUP 或 SHUTDOWN )。 可以在事件关联的表,视图,模式或数据库上定义触发器。 使用触发器的好处 触发器可以用于以下目的 - 自动生成一些派生列值 强化参照完整性 事件记录和存储表访问信息 审计 表的同步复制 实施安全授权 防止无效的事务 创建触发器 创建触发器的语法是 - CREATE [OR REPLACE ] TRIGGER trigger_name {BEFORE | AFTER | INSTEAD OF } {INSERT [OR] | UPDATE [OR] | DELETE} [OF col_name] ON table_name [REFERENCING OLD AS o NEW AS n] [FOR EACH ROW] WHEN (condition) DECLARE Declaration-statements BEGIN Executable

oracle数据库创建表且主键自增

你离开我真会死。 提交于 2020-02-01 03:58:08
Oracle数据库中,设置ID自增并不像MySQL中那么简单,Oracle中需要设置一个序列。 现在给出方式,具体如下: 第一步:建立一个表 create table ContestDB ( TID NUMBER(10) PRIMARY KEY, TEAMNUM varchar(50) not null, MARKNUM varchar(50) ); 第二步:设置ID自增 第一种方式:不使用触发器 1 CREATE SEQUENCE SEQ_TID; 2 INSERT INTO ContestDB VALUES(SEQ_TID.NEXTVAL,'B20007009','B001 '); 3 INSERT INTO ContestDB VALUES(SEQ_TID.NEXTVAL,'B20007010','B003 '); 第二种方式:使用Trigger 触发器 1 --自定义一个序列 2 create sequence ContestDB_sequence 3 increment by 1 --每次增加几个,我这里是每次增加1 4 start with 1 --从1开始计数 5 nomaxvalue --不设置最大值 6 nocycle --一直累加,不循环 7 nocache --不建缓冲区 8 --创建一个触发器 9 CREATE TRIGGER ContestDB

使用Oracle的问题--主键自增

牧云@^-^@ 提交于 2020-01-26 18:59:23
主键自增的方法 Oracle中数据表的主键在jsp中的使用一般是在sql语句中的主键位置使用序列让其自增或者使用触发器的特殊存储过程。 触发器 触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。 使用触发器 首先正对主键创建一个序列,然后创建触发器,然后在触发器中输入以下代码 CREATE OR REPLACE TRIGGER 创建的触发器名 BEFORE INSERT ON 表名 FOR EACH ROW WHEN ( new . 主键id is null ) begin select 创建的序列名 . nextval into :new . 主键id from dual ; end ; 在sql语句中只需正常输入各字段即可。 触发器优缺点 在一般的逻辑简单的系统中,多使用触发器可使性能提升,但是在偏大的系统,逻辑复杂的项目中不考虑用触发器的存储过程,因为复杂的逻辑会导致触发器的多层嵌套,代码聚合度降低,容易出现死锁情况,调试系统时,触发器的级联关系也会造成一定的烦乱。所以根据系统的实用性选用较好的方法可以事半功倍。 来源: CSDN 作者: 空气里血腥味道 链接: https:/