ORACLE创建序列和触发器

合集下载

ORACLE触发器、内置程序包教学

ORACLE触发器、内置程序包教学

Oracle 第8章触发器、内置程序包1、技术目标∙应用触发器∙使用内置程序包2、什么是触发器∙触发器是当特定事件出现时自动执行的存储过程∙特定事件可以是执行更新的DML语句和DDL语句∙触发器不能被显式调用,存储过程可以显示调用触发器的功能有:∙自动生成数据∙自定义复杂的安全权限∙提供审计和日志记录∙启用复杂的业务逻辑触发器可以与特定的表或视图相关联,用于检查对表/视图所做的数据修改,当执行insert、delete、update语句时,可激活触发器代码3、如何创建触发器创建触发器的语法为:CREATE [OR REPLACE] TRIGGER trigger_name {AFTER | BEFORE | INSTEAD OF}{insert | delete | update [OF column[, column] ...]} [OR {insert | delete | update [OF column[, column] ...] }] ON[schema.]table_or_view_name[REFERENCING [NEW AS new_row_name] [OLD ASold_row_name]][FOR EACH ROW][WHEN (condition)][DECLAREvariable_declation]BEGINstatements;[EXCEPTIONexception_handlers]END [trigger_name];语法说明:AFTER | BEFORE,指在事件发生之前或之后激活触发器INSTEAD OF,表示可以执行触发器代码来代替导致触发器调用的事件insert | delete | update,指定构成触发器事件的数据操纵类型,update可指定列列表REFERENCING,指定新行(即将更新)和旧行(更新前)的其他名称,默认为NEW和OLDtable_or_view_name,指要创建触发器的表或视图的名称FOR EACH ROW,指定是否对受影响的每行都执行触发器,即行级触发器,如不使用此句,则为语句级触发器WHEN,限制执行触发器的条件,该条件可包括新旧数据值的检查DECLARE...END,一个标准的PL/SQL块使用:在Emp表创建触发器,Sql代码1.CREATE OR REPLACE TRIGGER biu_emp_deptno2.--在添加或修改deptNo字段之前触发3.BEFORE INSERT OR UPDATE OF deptNo4.ON Emp5.--行级触发器6.FOR EACH ROW7.--列deptNo的新值不等于408.WHEN (New.deptNo <> 40)9.BEGIN10.--将comm列设置为011.:m := 0;12.END;13./注意:使用SHOW ERRORS命令可查看创建触发器时出现的错误4、触发器的组成部分触发器由以下3个部分组成:触发语句,定义激活触发器的DML 事件和DDL 事件,如:BEFORE INSERT OR UPDATE OF deptNoON Emp--行级触发器FOR EACH ROW这段代码表示,当对Emp表执行insert语句或对Emp表的deptNo列执行update语句时,触发器会在受影响的每一行上执行一次触发限制,执行触发器的条件,该条件必须为真才能激活触发器,如:--列deptNo的新值不等于40,触发器会执行WHEN (New.deptNo <> 40)触发操作,一些SQL 语句和代码,在发出了触发器语句且触发限制的值为真时运行,如:BEGIN--将comm列设置为0:m := 0;END;5、触发器的类型及使用触发器有如下的类型:每种触发器的作用:使用1:应用行级触发器,Sql代码1.--创建表TEST_TRG2.CREATE TABLE TEST_TRG (ID NUMBER, NAME VARCHAR2(20));3.--创建序列SEQ_TEST4.CREATE SEQUENCE SEQ_TEST;5.--为TEST_TRG表创建行级触发器6.CREATE OR REPLACE TRIGGER BI_TEST_TRG7.--在insert(添加)或者update(修改)ID字段时触发8.BEFORE INSERT OR UPDATE OF ID9.ON TEST_TRG --指定TEST_TRG表10.FOR EACH ROW --设置为行级触发器11.--触发器语句部分12.BEGIN13.--判断是不是insert语句14.IF INSERTING THEN15.--如果是insert操作,将序列的值设置给ID列16.SELECT SEQ_TEST.NEXTVAL INTO :NEW.ID FROM DUAL;17.ELSE18.--如果不是insert操作,不能修改ID列的值19.RAISE_APPLICATION_ERROR(-20020, '不允许更新ID值!');20.END IF;21.END;22./注意:如果一个触发器由多种语句触发,可用INSERTING、UPDATING、DELETING这些关键字进行检查,对应语句类型使用2:应用语句级触发器,Sql代码1.CREATE OR REPLACE TRIGGER trgdemo2.AFTER INSERT OR UPDATE OR DELETE3.ON order_master4.BEGIN5.--根据语句类型输出信息6.IF UPDATING THEN7.DBMS_OUTPUT.PUT_LINE('已更新ORDER_MASTER中的数据');8.ELSIF DELETING THEN9.DBMS_OUTPUT.PUT_LINE('已删除ORDER_MASTER中的数据');10.ELSIF INSERTING THEN11.DBMS_OUTPUT.PUT_LINE('已在ORDER_MASTER中插入数据');12.END IF;13.END;14./注意:语句级触发器时CREATE TRIGGER命令所创建触发器的默认类型使用3:应用INSTEAD OF触发器,同时向两个表中插入值,Sql代码1.--创建视图2.CREATE VIEW ord_view AS3.SELECT order_master.orderno, order_master.ostatus,4.order_detail.qty_deld, order_detail.qty_ord5.FROM order_master, order_detail6.WHERE order_master.orderno = order_detail.orderno;7.8.--创建INSTEAD OF触发器9.CREATE OR REPLACE TRIGGER order_mast_insert10.INSTEAD OF UPDATE ON ord_view11.--为NEW关键字取别名n12.REFERENCING NEW AS n13.FOR EACH ROW14.DECLARE15.--定义游标,访问order_master表16.CURSOR ecur IS SELECT * FROM order_master17.WHERE order_master.orderno = :n.orderno;18.--定义游标,访问order_detail表19.CUSEOR dcur IS20.select * from order_detail21.WHERE order_detail.orderno = :n.orderno;22.--定义游标变量23.a ecur%ROWTYPE;24.b dcur%ROWTYPE;25.BEGIN26.--打开游标27.OPEN ecur;28.OPEN dcur;29.--读取行30.FETCH ecur into a;31.FETCH dcur into b;32.--判断是否有行33.IF dur%NOTFOUND THEN --没有34.--添加记录35.INSERT INTO order_master (orderno, ostatus)36.VALUES (:n.orderno, :n.ostatus);37.ELSE --有38.--修改记录39.UPDATE order_master SET order_master.ostatus = :n.ostatus40.WHERE order_master.orderno = :n.orderno;41.END IF;42.43.IF ecur%NOTFOUND THEN44.INSERT INTO order_detail (qty_ord, qty_deld, orderno)45.VALUES(:n.qty_ord, :n.qty_deld, :n.orderno);46.ELSE47.UPDATE order_detail SET48.order_detail.qty_ord = :n.qty_ord,49.order_detail.qty_deld = :n.qty_deld50.WHERE order_detail.orderno = :n.orderno;51.END IF;52.--关闭游标53.CLOSE ecur;54.CLOSE dcur;55.END;56./注意:使用INSTEAD OF触发器有如下的限制,∙只能在行级使用,不能在语句级使用∙只能应用于视图,不能应用于表使用4:应用模式(DDL)触发器,对用户删除的对象进行日志记录,创建模式触发器的语法为:CREATE OR REPLACE TRIGGER trigger_name {BEFORE | AFTER} trigger_eventON [schema.]SCHEMAWHEN (trigger_condition)trigger_body;Sql代码1.--创建日志记录表2.CREATE TABLE dropped_obj3.(4.obj_name VARCHAR2(30),5.obj_type VARCHAR2(20),6.drop_date DATE7.);8.--创建触发器9.CREATE OR REPLACE TRIGGER log_drop_obj10.--在执行drop语句后触发11.AFTER DROP ON SCHEMA12.BEGIN13.--将被删除对象的信息添加到日志记录表中14.INSERT INTO dropped_obj15.VALUES (ORA_DICT_OBJ_NAME, ORA_DICT_OBJ_TYPE, SYSDATE);16.END;17./使用5:应用数据库级触发器,在数据库启动后执行,CREATE OR REPLACE TRIGGER system_startup--系统启动时触发AFTER STARTUP ON DATEBASEBEGIN--加入所需代码END;/6、启动、禁用、删除触发器,查看触发器信息启用和禁用触发器:ALTER TRIGGER 触发器名DISABLE; --禁用ALTER TRIGGER 触发器名ENABLE; --启用删除触发器:DROP TRIGGER 触发器名;查看触发器信息,使用USER_TRIGGERS数据字典:使用1:查看为表EMP设置的触发器名select TRIGGER_NAME from USER_TRIGGERSWHERE TABLE_NAME = 'EMP';使用2:查看触发器BIU_EMP_DEPTNO的类型、触发事件、触发条件,select TRIGGER_TYPE, TRIGGERING_EVENT, WHEN_CLAUSE from USER_TRIGGERSWHERE TRIGGER_NAME = 'BIU_EMP_DEPTNO';7、内置程序包Oracle提供了许多内置程序包,用于扩展数据库功能,数据库用户SYS 拥有所有程序包,程序包被定义为公有同义词,并将执行权限授予了PUBLIC用户组,任何用户都可访问,部分内置程序包如下:8、总结∙触发器是当特定事件出现时自动执行的存储过程∙触发器分为DML 触发器、DDL 触发器和数据库级触发器三种类型∙DML触发器的三种类型为行级触发器、语句级触发器和INSTEAD OF触发器∙了解一些常用的内置程序包。

Oracle创建自增主键表

Oracle创建自增主键表

Oracle创 建 自 增 主 键 表
2、创建自增序列信息
/*第二步:建立自定义的sequence*/
CREATE SEQUENCE user_sequence
increment by 1
-- 每次加几个
start with 1
-- 从1开始计数
nomaxvalue
-- 不设置最大值
nocycle
-- 一直累加,不循环
5、测试结果
ID USERNAME PASSWORD 1 1 aaa aaa admin 2 2 bbb bbb user 3 3 ccc ccc admin 4 4 ddd ddd user
TYPE
非常有帮助万分感谢哦今天安装jupyternotebook出现问题要更新但是我直接更新报错用了这个一下解决了
ቤተ መጻሕፍቲ ባይዱ1、创建表
/*第一步:创建表格*/ create table t_user(
id int primary key, --主键,自增长 username varchar(20), password varchar(20), type varchar(20) );
nocache
-- 不建缓冲区
3、建立触发器
/*第三步:建立触发器*/ create trigger mem_trig before insert on t_user for each row when (new.id is null) begin
select user_sequence.nextval into:new.id from dual;
end;
4、添加数据
/*第四步:插入数据*/ insert into t_user values(null,'aaa','aaa','admin'); insert into t_user values(null,'bbb','bbb','user'); insert into t_user values(null,'ccc','ccc','admin'); insert into t_user values(null,'ddd','ddd','user');

Oracle创建序列的方法及技巧

Oracle创建序列的方法及技巧

Oracle创建序列的方法及技巧日期:2008-06-23] 来源:互联网整理前面说过,关系数据库的一个最重要的方面是,每个表必须有一个主键。

许多情况下,在数据库中创建一个作为标识符的新键列是最容易的。

例如,Agent s表有一个作为主键的AgentID列。

但是,总是存在一个问题:从何处取得保证唯一的新编号?在一个较大的组织机构中,可能有一个人力资源部,可以建立某种处理,以便新雇员总能分配一个唯一的编号,并且在雇用某人时该数据被录入到表中。

但必须有人密切关注所分配的所有编号,并且还需要检验它们唯一性的一个表单。

相对于依赖基于人工的处理,让数据库生成用作键值的编号更有意义。

orac le为此目的使用序列。

序列(sequence)是Oracle在需要时用来产生新值的一个编号集合。

序列的两个关键点是:必须预先建立;需要代码请求生成新值。

序列的编号不是在录入新行时自动生成的。

你必须编写代码来生成值,并把它们存储在合适的列中。

注意,可以对要自动生成编号的表的Insert事件编写一个数据库触发器。

但是,Oracle中最常见的方法是在需要时生成关键值,通常是在表单上生成。

一般,在定义原始表时定义一个序列。

但是,因为序列与表之间不存在直接的关系,所以可以在创建编号前建立序列。

序列只需创建一次,在整个SQL*Plu s中都可以使用。

(1) 因为表中已经存在数据,找出其最大值:SELECT Max(AgentID) FROM Agents;(2) 最大值应该为15521,你可能想从一个比它大的值开始。

用15522就可以了,但为保险起见,从20000开始:CREATE SEQUENCE seq_AgentsINCREMENT BY 1START WITH 20000;(3) 也是用SQL检索新值,它自动用序列定义中指定的值给计数器增量。

试一下,以保证理解相应的命令:SELECT seq_Agents.NEXTVAL FROM dual;此命令使用了人为的dual表,因为PL/SQL总是要求使用FROM子句。

Oracle触发器(trigger)

Oracle触发器(trigger)

Oracle触发器(trigger)触发器是许多关系数据库系统都提供的⼀项技术。

在ORACLE系统⾥,触发器类似过程和函数,都有声明,执⾏和异常处理过程的PL/SQL 块。

1 触发器类型触发器在数据库⾥以独⽴的对象存储,它与存储过程和函数不同的是,存储过程与函数需要⽤户显⽰调⽤才执⾏,⽽触发器是由⼀个事件来启动运⾏。

即触发器是当某个事件发⽣时⾃动地隐式运⾏。

并且,触发器不能接收参数。

所以运⾏触发器就叫触发或点⽕(firing)。

ORACLE事件指的是对数据库的表进⾏的INSERT、UPDATE及DELETE操作或对视图进⾏类似的操作。

ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。

所以触发器常⽤来完成由数据库的完整性约束难以完成的复杂业务规则的约束,或⽤来监视对数据库的各种操作,实现审计的功能。

1.1 DML触发器ORACLE可以在DML语句进⾏触发,可以在DML操作前或操作后进⾏触发,并且可以对每个⾏或语句操作上进⾏触发。

1.2 替代触发器由于在ORACLE⾥,不能直接对由两个以上的表建⽴的视图进⾏操作。

所以给出了替代触发器。

它就是ORACLE 8专门为进⾏视图操作的⼀种处理⽅法。

1.3 系统触发器 ORACLE 8i 提供了第三种类型的触发器叫系统触发器。

它可以在ORACLE数据库系统的事件中进⾏触发,如ORACLE系统的启动与关闭等。

触发器组成:触发事件:引起触发器被触发的事件。

例如:DML语句(INSERT, UPDATE, DELETE语句对表或视图执⾏数据处理操作)、DDL语句(如CREATE、ALTER、DROP语句在数据库中创建、修改、删除模式对象)、数据库系统事件(如系统启动或退出、异常错误)、⽤户事件(如登录或退出数据库)。

触发时间:即该TRIGGER 是在触发事件发⽣之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 的操作顺序。

Oracle触发器trigger详解

Oracle触发器trigger详解

Oracle触发器trigger详解触发器相关概念及语法,供⼤家参考,具体内容如下概述本篇博⽂中主要探讨以下内容:什么是触发器触发器的应⽤场景触发器的语法触发器的类型案例数据:触发器的概念和第⼀个触发器数据库触发器是⼀个与表相关联的,存储的PL/SQL 语句。

每当⼀个特定的数据操作语句(insert update delete)在指定的表上发出时,Oracle⾃动执⾏触发器中定义的语句序列。

举个简单的例⼦:当员⼯表中新增⼀条记录后,⾃动打印“成功插⼊新员⼯”create or replace trigger insertStaffHintafter insert on xgj_testfor each rowdeclare-- local variables herebegindbms_output.put_line('新增员⼯成功');end insertStaffHint;触发器的应⽤场景复杂的安全性检查数据的确认数据库审计数据的备份和审计触发器的语法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数据库——触发器的创建与应用

Oracle数据库——触发器的创建与应用

Oracle数据库——触发器的创建与应⽤⼀、涉及内容1.理解触发器的概念、作⽤和类型。

2.练习触发器的创建和使⽤。

⼆、具体操作(实验)1.利⽤触发器对在scott.emp表上执⾏的DML操作进⾏安全性检查,只有scott⽤户登录数据库后才能向该表中执⾏DML操作。

(第1题中,user是系统函数,返回当前⽤户。

字符串中使⽤两个单引号表⽰⼀个单引号。

)要求:分别以system⽤户和scott⽤户对emp 表执⾏DML操作,试验触发器的运⾏效果。

(1)在scott⽤户下创建触发器语句:create or replace trigger tri_dm1before insert or update or delete on scott.empbeginif user<>'SCOTT'thenraise_application_error(-20001,'You don''t have access to modify this table.');end if;end;/截图:(2)以system ⽤户连接,并对emp表执⾏DML操作语句:conn system/orcl1234;insert into scott.emp(empno,ename) values(8888,'shenxiao');截图:(3)以scott⽤户连接,并对emp表执⾏DML操作语句:conn scott/tiger;insert into scott.emp(empno,ename) values(8888,'shenxiao');截图:2.利⽤触发器进⾏表和备份表之间的同步复制。

(1)在scott ⽤户下创建scott.emp 表的复本 employee。

语句:conn scott/tiger;create table employee as select * from scott.emp;截图:(2)在scott⽤户下创建能实现scott.emp和employee 两表之间同步复制的DML触发器。

oracle序列和触发器

oracle序列和触发器

oracle序列和触发器1、创建表t1 :create table t1 (id number,name nvarchar(8));2、创建序列:CREATE SEQUENCE t1_id INCREMENT BY 1 START WITH 1 MAXV ALUE 1.0E28 MINV ALUE 1 NOCYCLE CACHE 20 NOORDER3. 创建触发器:CREATE TRIGGER tig_insert_t1BEFORE INSERT ON "YINZQ"."T1"beginif (:new.id is null) thenselect t1_id.nextval into :new.id from dual; //其中的:new.id 指的是t1表中新行的列end if;end;Oracle触发器语法触发器是特定事件出现的时候,自动执行的代码块。

类似于存储过程,触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。

功能:1、允许/限制对表的修改2、自动生成派生列,比如自增字段3、强制数据一致性4、提供审计和日志记录5、防止无效的事务处理6、启用复杂的业务逻辑触发器触发时间有两种:after和before。

1、触发器的语法:CREATE [OR REPLACE] TIGGER触发器名触发时间触发事件ON表名[FOR EACH ROW]BEGINpl/sql语句END其中:触发器名:触发器对象的名称。

由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。

触发时间:指明触发器何时执行,该值可取:before---表示在数据库动作之前触发器执行;after---表示在数据库动作之后出发器执行。

触发事件:指明哪些数据库动作会触发此触发器:insert:数据库插入会触发此触发器;让oracle实现自增字段先建序列,然后建立一个触发器实现!cata0是表名,cata0_id是需要自增的字段!CREATE SEQUENCE SEQ_cata0INCREMENT BY 1START WITH 1MAXV ALUE 9999999CREATE TRIGGER TRG_cata0 BEFOREINSERT ON cata0FOR EACH ROW beginSELECT SEQ_cata0.NEXTV ALINTO :NEW.cata0_IDfrom DUAL;End TRG_cata0;/****@PARAM STNAME 不要创建序列的表,多个表则以“,”隔开**/CREATE OR REPLACE PROCEDURE PROC_CREATE_SEQ_TRIG(STNAME IN V ARCHAR2)ASSTRSQL VARCHAR2(4000);TABLENAME V ARCHAR2(50);PID V ARC ......。

oracle 触发器的种类和触发事件,dml触发器,ddl事件触发器,替代触发器,查看触发

oracle 触发器的种类和触发事件,dml触发器,ddl事件触发器,替代触发器,查看触发

oracle 触发器的种类和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发...oracle 数据库开发应用实例,招生录取系统 ... | oracle 创建,删除存储过程,参数传递,创 ...2009-04-14oracle 触发器的种类和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发器,关键字: oracle 触发器种类触发事件dml ddl 事件替代查看触发器的种类和触发事件触发器必须由事件才能触发。

触发器的触发事件分可为3类,分别是DML事件、DDL事件和数据库事件。

每类事件包含若干个事件,如下所示。

数据库的事件是具体的,在创建触发器时要指明触发的事件。

种类关键字含义Sql代码DML事件(3种) INSERT 在表或视图中插入数据时触发UPDATE 修改表或视图中的数据时触发DELETE 在删除表或视图中的数据时触发DDL事件(3种) CREATE 在创建新对象时触发ALTER 修改数据库或数据库对象时触发DROP 删除对象时触发数据库事件(5种) STARTUP 数据打开时触发SHUTDOWN 在使用NORMAL或IMMEDIATE选项关闭数据库时触发LOGON 当用户连接到数据库并建立会话时触发LOGOFF 当一个会话从数据库中断开时触发SERVERERROR 发生服务器错误时触发DML事件(3种) INSERT 在表或视图中插入数据时触发UPDATE 修改表或视图中的数据时触发DELETE 在删除表或视图中的数据时触发DDL事件(3种) CREATE 在创建新对象时触发ALTER 修改数据库或数据库对象时触发DROP 删除对象时触发数据库事件(5种) STARTUP 数据打开时触发SHUTDOWN 在使用NORMAL或IMMEDIATE选项关闭数据库时触发LOGON 当用户连接到数据库并建立会话时触发LOGOFF 当一个会话从数据库中断开时触发SERVERERROR 发生服务器错误时触发触发器的类型可划分为4种:数据操纵语言(DML)触发器、替代(INSTEAD OF)触发器、数据定义语言(DDL)触发器和数据库事件触发器。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ORACLE中创建序列和触发器的方法
——弥补程序创建序列和触发器失败的方法
一、安装ORACLE9I的客户端工具
二、打开企业管理器,使用JCMS/JCMS连接数据库
三、拉开JCMS方案中的表的列表
自定义栏目的表名称以JCMS_网站ID_栏目ID 命名,如:JCMS_1_1404目前只建立了一个网站,所以网站ID均为1
可以对诸如JCMS_1_开头的表建立序列和触发器
四、检查该表是否已经创建对应的序列,如果没有,则创建序列
拉开JCMS方案中的序列列表,看是否存在该表名称对应的序列,如:JCMS_1_1404_SEQ
如果没有对应的序列,就创建如下:
选中JCMS_INFO_SEQ,右键,选择类似创建
填写序列名称:表名称_SEQ创建即可,如:JCMS_1_1404_SEQ
五、看是否创建触发器
拉开JCMS方案中的[源类型]下面的[触发器]列表,看是否有对应当前表的触发器,名称为表名称_SETID,如:JCMS_1_1404_SETID
如果有则无需创建,否则创建如下:
选中JCMS_INFO_SEQ,右键,选择类似创建
填写触发器名称表名_SETID,如:JCMS_1_1404_SETID,修改代码中使用的序列名称,表名_SEQ,如:JCMS_1_1404_SEQ
切换到[事件]标签,方案中选择当前的触发器作用的表,如JCMS方案下的表JCMS_1_1404
[创建]就可以了。

六、触发器创建成功,可以在触发器列表中找到,并且显示为有效(valid)状态.
.。

相关文档
最新文档