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 AS

old_row_name]]

[FOR EACH ROW]

[WHEN (condition)]

[DECLARE

variable_declation]

BEGIN

statements;

[EXCEPTION

exception_handlers]

END [trigger_name];

语法说明:

AFTER | BEFORE,指在事件发生之前或之后激活触发器INSTEAD OF,表示可以执行触发器代码来代替导致触发器调用的事件

insert | delete | update,指定构成触发器事件的数据操纵类型,update可指定列列表

REFERENCING,指定新行(即将更新)和旧行(更新前)的其他名称,默认为NEW和OLD

table_or_view_name,指要创建触发器的表或视图的名称

FOR EACH ROW,指定是否对受影响的每行都执行触发器,即行级触发器,

如不使用此句,则为语句级触发器

WHEN,限制执行触发器的条件,该条件可包括新旧数据值的检查DECLARE...END,一个标准的PL/SQL块

使用:在Emp表创建触发器,

Sql代码

1.CREATE OR REPLACE TRIGGER biu_emp_deptno

2.--在添加或修改deptNo字段之前触发

3.BEFORE INSERT OR UPDATE OF deptNo

4.ON Emp

5.--行级触发器

6.FOR EACH ROW

7.--列deptNo的新值不等于40

8.WHEN (New.deptNo <> 40)

9.BEGIN

10.--将comm列设置为0

11.:https://www.360docs.net/doc/3a16591324.html,m := 0;

12.END;

13./

注意:使用SHOW ERRORS命令可查看创建触发器时出现的错误

4、触发器的组成部分

触发器由以下3个部分组成:

触发语句,定义激活触发器的DML 事件和DDL 事件,如:BEFORE INSERT OR UPDATE OF deptNo

ON Emp

--行级触发器

FOR EACH ROW

这段代码表示,当对Emp表执行insert语句或对Emp表的deptNo列执行update语句时,触发器会在受影响的每一行

上执行一次

触发限制,执行触发器的条件,该条件必须为真才能激活触发器,如:

--列deptNo的新值不等于40,触发器会执行

WHEN (New.deptNo <> 40)

触发操作,一些SQL 语句和代码,在发出了触发器语句且触发限制的值为真时运行,如:

BEGIN

--将comm列设置为0

:https://www.360docs.net/doc/3a16591324.html,m := 0;

END;

5、触发器的类型及使用

触发器有如下的类型:

每种触发器的作用:

使用1:应用行级触发器,

Sql代码

1.--创建表TEST_TRG

2.CREATE TABLE TEST_TRG (ID NUMBER, NAME VARCHAR2(20));

3.--创建序列SEQ_TEST

4.CREATE SEQUENCE SEQ_TEST;

5.--为TEST_TRG表创建行级触发器

6.CREATE OR REPLACE TRIGGER BI_TEST_TRG

7.--在insert(添加)或者update(修改)ID字段时触发

8.BEFORE INSERT OR UPDATE OF ID

9.ON TEST_TRG --指定TEST_TRG表

10.FOR EACH ROW --设置为行级触发器

11.--触发器语句部分

12.BEGIN

13.--判断是不是insert语句

14.IF INSERTING THEN

15.--如果是insert操作,将序列的值设置给ID列

16.SELECT SEQ_TEST.NEXTVAL INTO :NEW.ID FROM DUAL;

17.ELSE

18.--如果不是insert操作,不能修改ID列的值

19.RAISE_APPLICATION_ERROR(-20020, '不允许更新ID值!');

20.END IF;

21.END;

22./

注意:如果一个触发器由多种语句触发,可用INSERTING、UPDATING、DELETING这些关键字进行检查,对应语句类型

使用2:应用语句级触发器,

Sql代码

1.CREATE OR REPLACE TRIGGER trgdemo

2.AFTER INSERT OR UPDATE OR DELETE

3.ON order_master

4.BEGIN

5.--根据语句类型输出信息

6.IF UPDATING THEN

7.DBMS_OUTPUT.PUT_LINE('已更新ORDER_MASTER中的数据');

8.ELSIF DELETING THEN

9.DBMS_OUTPUT.PUT_LINE('已删除ORDER_MASTER中的数据');

10.ELSIF INSERTING THEN

11.DBMS_OUTPUT.PUT_LINE('已在ORDER_MASTER中插入数据');

12.END IF;

13.END;

14./

注意:语句级触发器时CREATE TRIGGER命令所创建触发器的默认类型

使用3:应用INSTEAD OF触发器,同时向两个表中插入值,

Sql代码

1.--创建视图

2.CREATE VIEW ord_view AS

3.SELECT order_master.orderno, order_master.ostatus,

4.order_detail.qty_deld, order_detail.qty_ord

5.FROM order_master, order_detail

6.WHERE order_master.orderno = order_detail.orderno;

7.

8.--创建INSTEAD OF触发器

9.CREATE OR REPLACE TRIGGER order_mast_insert

10.INSTEAD OF UPDATE ON ord_view

11.--为NEW关键字取别名n

12.REFERENCING NEW AS n

13.FOR EACH ROW

14.DECLARE

15.--定义游标,访问order_master表

16.CURSOR ecur IS SELECT * FROM order_master

17.WHERE order_master.orderno = :n.orderno;

18.--定义游标,访问order_detail表

19.CUSEOR dcur IS

20.select * from order_detail

21.WHERE order_detail.orderno = :n.orderno;

22.--定义游标变量

23.a ecur%ROWTYPE;

24.b dcur%ROWTYPE;

25.BEGIN

26.--打开游标

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.ostatus

40.WHERE order_master.orderno = :n.orderno;

41.END IF;

42.

43.IF ecur%NOTFOUND THEN

44.INSERT INTO order_detail (qty_ord, qty_deld, orderno)

45.VALUES(:n.qty_ord, :n.qty_deld, :n.orderno);

46.ELSE

47.UPDATE order_detail SET

48.order_detail.qty_ord = :n.qty_ord,

49.order_detail.qty_deld = :n.qty_deld

50.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_event

ON [schema.]SCHEMA

WHEN (trigger_condition)

trigger_body;

Sql代码

1.--创建日志记录表

2.CREATE TABLE dropped_obj

3.(

4.obj_name VARCHAR2(30),

5.obj_type VARCHAR2(20),

6.drop_date DATE

7.);

8.--创建触发器

9.CREATE OR REPLACE TRIGGER log_drop_obj

10.--在执行drop语句后触发

11.AFTER DROP ON SCHEMA

12.BEGIN

13.--将被删除对象的信息添加到日志记录表中

14.INSERT INTO dropped_obj

15.VALUES (ORA_DICT_OBJ_NAME, ORA_DICT_OBJ_TYPE, SYSDATE);

16.END;

17./

使用5:应用数据库级触发器,在数据库启动后执行,

CREATE OR REPLACE TRIGGER system_startup

--系统启动时触发

AFTER STARTUP ON DATEBASE

BEGIN

--加入所需代码

END;

/

6、启动、禁用、删除触发器,查看触发器信息

启用和禁用触发器:

ALTER TRIGGER 触发器名DISABLE; --禁用

ALTER TRIGGER 触发器名ENABLE; --启用

删除触发器:

DROP TRIGGER 触发器名;

查看触发器信息,使用USER_TRIGGERS数据字典:

使用1:查看为表EMP设置的触发器名

select TRIGGER_NAME from USER_TRIGGERS

WHERE TABLE_NAME = 'EMP';

使用2:查看触发器BIU_EMP_DEPTNO的类型、触发事件、触发条件,

select TRIGGER_TYPE, TRIGGERING_EVENT, WHEN_CLAUSE from USER_TRIGGERS

WHERE TRIGGER_NAME = 'BIU_EMP_DEPTNO';

7、内置程序包

Oracle提供了许多内置程序包,用于扩展数据库功能,数据库用户SYS 拥有所有程序包,程序包被定义为公有同义词,并将执行权限授予了PUBLIC用户组,任何用户都可访问,部分内置程序包如下:

8、总结

?触发器是当特定事件出现时自动执行的存储过程

?触发器分为DML 触发器、DDL 触发器和数据库级触发器三种类型

?DML触发器的三种类型为行级触发器、语句级触发器和INSTEAD OF触发器

?了解一些常用的内置程序包

SQL触发器使用教程和命名规范

SQL触发器使用教程和命名规范 1,触发器简介 触发器(Trigger)是数据库对象的一种,编码方式类似存储过程,与某张表(Table)相关联,当有DML语句对表进行操作时,可以引起触发器的执行,达到对插入记录一致性,正确性和规范性控制的目的。在当年C/S时代盛行的时候,由于客户端直接连接数据库,能保证数据库一致性的只有数据库本身,此时主键(Primary Key),外键(Foreign Key),约束(Constraint)和触发器成为必要的控制机制。而触发器的实现比较灵活,可编程性强,自然成为了最流行的控制机制。到了B/S时代,发展成4层架构,客户端不再能直接访问数据库,只有中间件才可以访问数据库。要控制数据库的一致性,既可以在中间件里控制,也可以在数据库端控制。很多的青睐Java的开发者,随之将数据库当成一个黑盒,把大多数的数据控制工作放在了Servlet中执行。这样做,不需要了解太多的数据库知识,也减少了数据库编程的复杂性,但同时增加了Servlet编程的工作量。从架构设计来看,中间件的功能是检查业务正确性和执行业务逻辑,如果把数据的一致性检查放到中间件去做,需要在所有涉及到数据写入的地方进行数据一致性检查。由于数据库访问相对于中间件来说是远程调用,要编写统一的数据一致性检查代码并非易事,一般采用在多个地方的增加类似的检查步骤。一旦一致性检查过程发生调整,势必导致多个地方的修改,不仅增加工作量,而且无法保证每个检查步骤的正确性。触发器的应用,应该放在关键的,多方发起的,高频访问的数据表上,过多使用触发器,会增加数据库负担,降低数据库性能。而放弃使用触发器,则会导致系统架构设计上的问题,影响系统的稳定性。 2,触发器示例 触发器代码类似存储过程,以PL/SQL脚本编写。下面是一个触发器的示例: 新建员工工资表salary create table SALARY ( EMPLOYEE_ID NUMBER, --员工ID MONTH VARCHAR2(6), --工资月份 AMOUNT NUMBER --工资金额 ) 创建与salary关联的触发器salary_trg_rai 1 Create or replace trigger salary_trg_rai 2 After insert on salary 3 For each row

oracle子程序和包

实验: 子程序和包 实验目的 (1)掌握函数和子程序的创建和使用。 (2)掌握带参数的子程序的使用。 (3)掌握包的创建和使用。 实验内容 1、编写一个包emp_package,用来对emp表进行操作。其中应包含以上几个功能: (1)编写一个不带参数的过程dept_pro,功能是输出每个部门名称和部门人数,建议使用游标。 SQL> ed 已写入file afiedt.buf 1 create procedure emp_pro 2 is 3 CURSOR dept_cur IS select dname,count(empno)人数from emp,dept 4 where emp.deptno=dept.deptno group by dname; 5 begin 6 for v_dept in dept_cur loop 7 dbms_output.put_line(v_dept.dname||' '||v_dept.人数); 8 end loop; 9* end; SQL> / 过程已创建。 (2)输入职工编号,得到职工姓名的存储过程或函数emp_pro或emp_fun CREATE OR REPLACE PROCEDURE emp_pro ( p_name OUT emp.ename%type, p_sal OUT emp.sal%type, p_eno IN emp.empno%type )

IS begin -- Test statements here select ename,sal into p_name,p_sal from emp where empno=p_eno; end; CREATE OR REPLACE FUNCTION emp_fun(p_eno emp.empno%type) RETURN emp.ename%type IS v_ename emp.ename%type; begin -- Test statements here select ename into v_ename from emp where empno=p_eno; return v_ename; end; (3)编写一个函数dept_fun,向函数传递一个部门号,如果dept表中不包含这个部门号,则返回”无此部门。 SQL> ed 已写入file afiedt.buf 1 CREATE OR REPLACE FUNCTION dept_fun(v_deptno NUMBER:=&deptno) 2 RETURN dept.dname%type 3 IS 4 v_dname dept.dname%type; 5 begin 6 -- Test statements here 7 select dname into v_dname 8 from dept where deptno=v_deptno; 9 return v_dname; 10 EXCEPTION 11 WHEN NO_DA TA_FOUND THEN 12 DBMS_OUTPUT.PUT_LINE('无此部门'); 13* end; SQL> / 输入deptno 的值: 10 原值1: CREATE OR REPLACE FUNCTION dept_fun(v_deptno NUMBER:=&deptno) 新值1: CREATE OR REPLACE FUNCTION dept_fun(v_deptno NUMBER:=10) 函数已创建。

Oracle11g及PLSQL安装过程1.0.

一、Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可。路径名称中,最好不要出现中文,也不要出现空格等不规则字符。 官方下地址: https://www.360docs.net/doc/3a16591324.html,/technetwork/database/enterprise-edition/downloads/i ndex.html以下两网址来源此官方下载页网。 win 32位操作系统下载地址: https://www.360docs.net/doc/3a16591324.html,/otn/nt/oracle11g/112010/win32_11gR2_databas e_1of2.zip https://www.360docs.net/doc/3a16591324.html,/otn/nt/oracle11g/112010/win32_11gR2_databas e_2of2.zip win 64位操作系统下载地址: https://www.360docs.net/doc/3a16591324.html,/otn/nt/oracle11g/112010/win64_11gR2_databas e_1of2.zip https://www.360docs.net/doc/3a16591324.html,/otn/nt/oracle11g/112010/win64_11gR2_databas e_2of2.zip 二、Oracle安装 1. 解压缩文件,将两个压缩包一起选择,鼠标右击-> 解压文件如图 2.两者解压到相同的路径中,如图:

两个压缩包没有关联,要全部解压,解压之后文件的大小为2.12G。 3. 到相应的解压路径上面,找到可执行安装文件【setup.exe 】双击安装。如图: 4. 安装第一步:配置安全更新,这步可将自己的电子邮件地址填写进去(也可以不填写,只是收到一些没什么用的邮件而已)。取消下面的“我希望通过My Oracle Support接受安全更新(W)”。如图:(不要填写自己的电子邮件地址,否则它会自动联网,可能会拖慢安装进度)

触发器

按照触发方式,oracle的触发器分为语句级和行级两种类型,在视图上所创建的触发器叫做什么类型的触发器? DML触发器有三类: 1,insert触发器; 2,update触发器; 3,delete触发器; 触发器的组成部分: 触发器的声明,指定触发器定时,事件,表名以类型 触发器的执行,PL/SQL块或对过程的调用 触发器的限制条件,通过where子句实现 类型: 应用程序触发器,前台开发工具提供的; 数据库触发器,定义在数据库内部由某种条件引发;分为: DML触发器; 数据库级触发器; 替代触发器; DML触发器组件: 1,触发器定时 2,触发器事件 3,表名 4,触发器类型 5,When子句

6,触发器主体 可创建触发器的对象:数据库表,数据库视图,用户模式,数据库实例 创建DML触发器: Create [or replace] trigger [模式.]触发器名 Before| after insert|delete|(update of 列名) On 表名 [for each row] When 条件 PL/SQL块 For each row的意义是:在一次操作表的语句中,每操作成功一行就会触发一次;不写的话,表示是表级触发器,则无论操作多少行,都只触发一次; When条件的出现说明了,在DML操作的时候也许一定会触发触发器,但是触发器不一定会做实际的工作,比如when 后的条件不为真的时候,触发器只是简单地跳过了PL/SQL块; Insert触发器的创建: create or replace trigger tg_insert before insert on student begin dbms_output.put_line('insert trigger is chufa le .....'); end; / 执行的效果: SQL> insert into student

Oracle子程序存储过程

Oracle_子程序_存储过程 select user from dual; set serveroutput on --存储过程 CREATE OR REPLACE PROCEDURE proce_Test --创建过程 is --局部变量 BEGIN dbms_output.put_line('大家好' ); END proce_Test; --执行存储过程建议按f5 执行存储过程 execute proce_test; begin proce_test; end; --------------------------------------------------------------------------------------- ----------------------------------------------- -- 此处说明定义存储过程时不能给形参施加限制(大小),存储过程创建出错,也会保留在服务器上------------------------------------------------ ------错误问题说明 Create procedure Sp_Test1(a varchar2,b out varchar2) -- 此处不能加size,执行存储过程会出错.但该存储过程依然保存在数据库中,此名字已经被占用,当修改正确后,再执行时会抱该对象已经存在的异常,所以建议使用or replace is Begin b :=a; End Sp_Test1; drop procedure sp_Test1 --create or replace procedure --test(a varchar2,b out varchar2) is --begin

oracle11g安装图解

Oracle11G安装图解 进入oracle安装界面,我们选择高级安装 出现选择安装类型,我们选择企业版,至于语言我们不用选择

Oracle 基目录:用于安装各种与ORACLE软件和配置有关的文件的顶级目录。 软件位置:用于存放安装具体ORACLE产品的主目录和路径。在此我们使用默认的配置。 在此ORACLE会选择剩余空间最多的盘作为基目录和安装目录的所在盘。 可以输入一个电子邮件或是metalink接收安全问题通知,在此我直接输入一个 电子邮件,当然也可以是metalink用户信息!

在此是因为我的内存不足,所以会报此提示,那么我们在此调整内存,以满足条件后再继续安装。

装到这个界面,这个问题直接选是,不会影响之后的安装,出现这个问题的原因是因为我的电脑没连接到网络 在此选择安装数据库。 如果是“配置自动存储管理”,则自动存储管理(ASM)可用来自动化和简化对数据文件、控制文件和日志文件的优化布局。自动存储管理(ASM)将每个文件切割成许多小扩展文件,并将它们平均分散在一个磁盘组的所有磁盘上。一旦自动存储管理(ASM)磁盘组建立,创建和删除文件的时候,Oracle数据库都会从磁盘组自动分配存储空间。如果是“仅安装软件”,则只安装ORACLE软件,

在安装之后还需要再运行数据库配置助手创建数据库。 一般用途/事务处理:适合各种用途的预配置数据库。 数据仓库:创建适用于特定需求并运行复杂查询环境。常用于存储并快速访问大量记录数据。 高级:安装结束后运行ORACLE DBCA后,用户才可以配置数据库。 在此我们选择“一般用途/事务处理” 步骤8:单独下一步后,出现“指定数据库配置选项”

Oracle安装注意事项

一、Oracle程序文件和数据文件路径最好分别安装在不同磁盘上,安装数据文件路径的磁盘空间应选择容量大的且专用磁盘(只存放数据)。 二、Oracle安装完毕后,配置PL/SQL: 方法一(适合32位操作系统): 1、安装PL/SQL 2、点击“开始”-----“所有程序”----“Oracle-OraDb11g_home1”----“配置和移植工具”---- “Net Configuration Assistant” 3、选择“本地Net服务名配置”,点击“下一步” 4、选择“添加”,点击“下一步”

5、服务名:输入orcl 点击“下一步”(orcl是安装Oracle时默认的实例) 6、选择“TCP”,点击“下一步”

7、主机名输入本机IP地址,并选择使用标准端口号1521,点击“下一步”(注意如服务器配有双网卡,ip则输入配置为内部局域网的ip地址) 8、选择“是,进行测试”,点击“下一步” 9、点击“更改登录”

10、输入安装Oracle时,设置的system或sys用户密码,点击“确定” 11、出现“测试成功”,点击“下一步” 12、输入网路服务名:一般为orcl,点击“下一步”(服务名可以自由定义,如果配置多Net 个服务,该名称具有唯一性,不能设置相同。)

13、选者“否”,点击“下一步”,否则选“是”继续添加 13、点击“完成” 方法二(适合64位操作系统): 1、打开PL/SQL,不登陆。 2、点击“tool”或(工具)-----“Preferences”或(首选项)

3、选择Oracle----Connection(连接)在orcle home(empty is autodetect)和ocl library(empty is autodetect),输入oraclient配置文件所在路径及oci.dll文件路径。点击“ok”后,关闭PL/SQL重新打开并登陆即可。 注意:需要配置oraclient文件夹中的tnsnames.ora文件 蓝色框中的ORCL为网络服务名,绿色框中的SEIKO为计算机名或ip地址,红色框中的orcl为服务名,根据实际情况修改。如需配置多个,则复制上面这段话修改即可。 注意:64位操作系统,PL/SQL不要安装在C:\Program Files (x86)目录下。

oracle复习题及答案

1、以下(A)内存区不属于SGA。 A.PGA B.日志缓冲区C.数据缓冲区D.共享池 2、(D )模式存储数据库中数据字典的表和视图。 A.DBA B.SCOTT C.SYSTEM D.SYS 3、在Oracle中创建用户时,若未提及DEFAULT TABLESPACE关键字,则Oracle就将(C) 表空间分配给用户作为默认表空间。 A.HR B.SCOTT C.SYSTEM D的连接请求。.SYS 4、(A )服务监听并按受来自客户端应用程序 A.OracleHOME_NAMETNSListener B.OracleServiceSID C.OracleHOME_NAMEAgent D.OracleHOME_NAMEHTTPServer 5、(B )函数通常用来计算累计排名、移动平均数和报表聚合等。 A.汇总B.分析C.分组D.单行 6、(B )SQL语句将为计算列SAL*12生成别名Annual Salary A.SELECT ename,sal*12 …Annual Salary? FROM emp; B.SELECT ename,sal*12 “Annual Salary” FROM emp; C.SELECT ename,sal*12 AS Annual Salary FROM emp; D.SELECT ename,sal*12 AS INITCAP(“Annual Salary”) FROM emp; 7、锁用于提供( B )。 A.改进的性能 B.数据的完整性和一致性 C.可用性和易于维护 D.用户安全 8、(C )锁用于锁定表,允许其他用户查询表中的行和锁定表,但不允许插入、更新和删 除行。 A.行共享B.行排他C.共享D.排他 9、带有( B )子句的SELECT语句可以在表的一行或多行上放置排他锁。 A.FOR INSERT B.FOR UPDATE C.FOR DELETE D.FOR REFRESH 10、使用( C )命令可以在已分区表的第一个分区之前添加新分区。 A.添加分区B.截断分区 C.拆分分区D.不能在第一个分区前添加分区 11、( C )分区允许用户明确地控制无序行到分区的映射。 A.散列B.范围C.列表D.复合 12、可以使用(C )伪列来访问序列。 A.CURRVAL和NEXTVAL B.NEXTVAL和PREVAL C.CACHE和NOCACHE D.MAXVALUE和MINVALUE 13、带有错误的视图可使用(A )选项来创建。 A.FORCE B.WITH CHECK OPTION C.CREATE VIEW WITH ERROR D.CREATE ERROR VIEW 14、在联接视图中,当(B )时,该基表被称为键保留表。

SQL Server约束和触发器的区别

SQL Server约束和触发器的区别 作者:夏果果出处:博客2011-12-30 06:15 SQL Server约束相信大家都比较了解了,那么,SQL Server约束和触发器的区别在哪里呢…… SQL Server约束相信大家都比较了解了,那么,SQL Server约束和触发器的区别在哪里呢? 在SQL Server数据库中提供了两种主要机制来强制使用业务规则和数据完整性,他们是SQL Server约束和触发器。触发器其实就是一个特殊类型的存储过程,可在在执行某个操作时自动触发。触发器与约束都可以实现数据的一致性。那么他们在使用的过程中,有哪些差异呢?简单的来说,触发器可以实现约束的一切功能。但是在考虑数据一致性问题的时候,首先要考虑通过约束来实现。如果约束无法完成的功能,则再通过触发器来解决。两者从功能上来说,他们的关系如下图所示: 触发器可以包含使用SQL代码的复杂处理逻辑。如果单从功能上来说,触发器可以实现约束的所有功能。但是由于其自身的种种缺陷,其往往不是实现数据一致性等特定功能的首选解决方案。总的来说,只有在约束无法实现特定功能的情况下,才考虑通过触发器来完成。这只是在处理约束与触发器操作过程中的一个基本原则。对于他们两个具体的差异笔者在下面也进行了比较详细的阐述。欢迎大家进行补充。 差异一:错误信息的管理上。 当违反系统的SQL Server约束规则时,需要向用户返回一定的错误信息,方便用户进行排错。约束与触发器在遇到问题时都可以返回给用户一定的错误信息。但是,约束只能够通过标准化的系统错误信息来传递错误消息。如果应用程序需要使用自定义消息和较为复杂的错误处理机制,则必须要使用触发器才能够完成。如现在数据库中有一张产品信息表。为了保证产品的唯一性,要求产品的编号必须唯一。如果用户输入的产品编号跟企业现有的产

ORACLE系统包介绍

Oracle 系统包 DBMS_OUTPUT a)启用 i. dbms_output.enable(buffer_size in integer default 20000); ii. set serveroutput on; b)禁用 i. dbms_output.disable; c)PUT和PUT_LINE i. PUT:所有信息显示在同一行 ii. PUT_LINE信息显示后,自动换行 d)NEW_LINE用于在行的尾部追加行结束符,一般用PUT同时使用 e)GET_LINE和GET_LINES i. DBMS_OUTPUT.GET_LINE(li ne 0UTVARCHAR2,status OUT INTEGER)用于取缓冲区的单行 信息 ii. DBMS_OUTPUT.GET_LINES(lines OUT chararr,numlies IN OUT INTEGER) 用于取得缓冲区的多行信息 DBMS_JOB a)SUBMIT用于建立一个新作业 语法 DBMS_JOB.SUBMIT( job OUT BINARY_INTEGER, what IN VARCHAR2, next_date IN DATE DEFATULT SYSDATE, interval IN VARCHAR2 DEFAULT ' NULL' , no_parse IN BOOLEAN DEFAULT FALSE, instance IN BINARY_INTEGER DEFAULT any_instance, force IN DEFAULT FALSE); 例子 VAR jobno NUMBER; BEGIN DBMS_JOB.SUBMI( :jobno, 'pro_hrs101d0_ins_hrs101t0', sysdate, ‘sysdate+1 '); b)REMOVE!于删除作业队列中的特定作业 语法:DBMS_JOB.REMOVE(jov IN BINARY_INTEGER); 例子:DBMS_JOB.REMOVE(10);--删除JOB号为10 的JOB c)CHANGE用于改变与作业相关的所有信息

Oracle_11g 安装图解(详细版)

Oracle 11g安装图文攻略 呵呵,花了一个多小时,左右把11g安装折腾好了。其中折腾SQL Developer 花了好长时间,总算搞定了。好了,先总结下安装步骤,希望给后面的童鞋提高安装效率。呵呵。 一、Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可。路径名称中,最好不要出现中文,也不要出现空格等不规则字符。 官方下地址: https://www.360docs.net/doc/3a16591324.html,/technetwork/database/enterprise-edition/downloads/ index.html以下两网址来源此官方下载页网。 win 32位操作系统下载地址: https://www.360docs.net/doc/3a16591324.html,/otn/nt/oracle11g/112010/win32_11gR2_database_ 1of2.zip https://www.360docs.net/doc/3a16591324.html,/otn/nt/oracle11g/112010/win32_11gR2_database_ 2of2.zip win 64位操作系统下载地址: https://www.360docs.net/doc/3a16591324.html,/otn/nt/oracle11g/112010/win64_11gR2_database_ 1of2.zip https://www.360docs.net/doc/3a16591324.html,/otn/nt/oracle11g/112010/win64_11gR2_database_ 2of2.zip 二、Oracle安装 1. 解压缩文件,将两个压缩包一起选择,鼠标右击 -> 解压文件如图

Oracle 11g安装及验证图文攻略

服务器磁盘分配 一般C盘100G装系统、D盘80G放ORACLE基目录和软件位置、E盘剩余空间(最大)放数据库目录。 Oracle 11g安装图文攻略 注意用administrator用户登录 一、Oracle 下载注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可。路径名称中,最好不要出现中文,也不要出现空格等不规则字符。二、Oracle安装1. 解压缩文件,将两个压缩包一起选择,鼠标右击- 解压文件如图2.两者解压到相同的 一、Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可。路径名称中,最好不要出现中文,也不要出现空格等不规则字符。 二、Oracle安装 1. 解压缩文件,将两个压缩包一起选择,鼠标右击-> 解压文件如图 2.两者解压到相同的路径中,如图:

3. 到相应的解压路径上面,找到可执行安装文件【setup.exe 】双击安装。如图: 4. 安装第一步:配置安全更新,这步可将自己的电子邮件地址填写进去(也可以不填写,只是收到一些没什么用的邮件而已)。取消下面的“我希望通过My Oracle Support接受安全更新(W)”。如图:

5. 安全选项,直接选择默认创建和配置一个数据库(安装完数据库管理软件后,系统会自动创建一个数据库实例)。如图:

6. 系统类,直接选择默认的桌面类就可以了。(若安装到的电脑是,个人笔记本或个人使用的电脑使用此选项) 服务器类直接点击这里跳转如图:

7. 典型安装。重要步骤。建议只需要将Oracle基目录更新下,目录路径不要含有中文或其它的特殊字符。全局数据库名可以默认,且口令密码,必须要牢记。密码输入时,有提示警告,不符合Oracel建议时不用管。(因Oracel建议的密码规则比较麻烦,必须是大写字母加小写字母加数字,而且必须是8位以上。麻烦,可以输入平常自己习惯的短小密码即可) 如图:

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 AS old_row_name]] [FOR EACH ROW] [WHEN (condition)] [DECLARE variable_declation] BEGIN statements; [EXCEPTION exception_handlers]

END [trigger_name]; 语法说明: AFTER | BEFORE,指在事件发生之前或之后激活触发器INSTEAD OF,表示可以执行触发器代码来代替导致触发器调用的事件 insert | delete | update,指定构成触发器事件的数据操纵类型,update可指定列列表 REFERENCING,指定新行(即将更新)和旧行(更新前)的其他名称,默认为NEW和OLD table_or_view_name,指要创建触发器的表或视图的名称 FOR EACH ROW,指定是否对受影响的每行都执行触发器,即行级触发器, 如不使用此句,则为语句级触发器 WHEN,限制执行触发器的条件,该条件可包括新旧数据值的检查DECLARE...END,一个标准的PL/SQL块 使用:在Emp表创建触发器, Sql代码 1.CREATE OR REPLACE TRIGGER biu_emp_deptno 2.--在添加或修改deptNo字段之前触发 3.BEFORE INSERT OR UPDATE OF deptNo 4.ON Emp

内置包Oracle

内置程序包 Oracle提供了许多内置程序包,它们用于扩展数据库的功能。在开发应用程序时,可以利 用这些程序包。数据库用户SYS拥有Oracle提供的所有程序包。它们被定义为公有同义词, 并将执行权限授予了PUBLIC用户组,任何用户都可以访问它们。 Oracle提供的程序包的部分列表见表8.1。 续表 下面简单介绍几个常用的内置程序包。 8.2.1 DBMS_OUTPUT DBMS—OUTPUT程序包允许显示PL/SQL块和子程序的输出结果,这样便于测试和调试它们。 PUT和PUT_LINE过程将信息输出到SGA中的缓冲区。通过调用过程GET_LINE或通过 SET SERVEROUTPUT ON,可以显示缓冲区中的信息。 默认缓冲区大小是2000字节。最小值是2000,最大值是1,000,000。DBMS一OUTPUT包 有以下常用过程。 ENABLE

ENABLE过程用来启用对PUT、PUT_ LINE和NEW_LINE等过程的调用,它只有一个输入参数, 即缓冲区大小(BUFFER_SIZE)。缓冲区大小的输入值用于设置默认缓存的信息量。调用 ENABLE将清除任何已废弃会话中缓存的数据。 DISABLE DISABLE没有输入和输出。DISABLE用于禁用对PUT、PUT_LINE和NEW_LINE的所有调用。 调用DISABLE过程还可清除缓冲区中的任何剩余信息。 PUT PUT有一个输入参数,此参数被重载以接受VARCHAR2、NUMBER和DATE值。PUT用于在缓冲 区中存储一条信息。TO_CHAR将使用默认格式设置格式化这些项。 PUT_ LINE PUT_ LINE有一个输入参数,此参数被重载以接受VARCHAR2、NUMBER和DATE值。如果这些 值是要混合使用,则必须显式使用TO_CHAR函数。PUT_LINE过程用于将一条信息存储在缓 冲区中,后接一个行结束标记。 NEW_LINE NEW_LINE没有参数。它用于向缓冲区中添加换行符。换行符充当行结束标记。对 PUT_LINE 或NEW_LINE的每次调用都将产生一行。 例13演示了DBMS_OUTPUT包的用法。 例13: 例13的输出结果如下所示。 8.2.2DBIVIS_LOB

触发器、存储过程和函数三者有何区别 四

触发器、存储过程和函数三者有何区别四 什么时候用存储过程?存储过程就是程序,它是经过语法检查和编译的SQL语句,所以运行特别快。 触发器是特殊的存储过程,存储过程需要程序调用,而触发器会自动执行;你所说的函数是自定义函数吧,函数是根据输入产生输出,自定义只不过输入输出的关系由用户来定义。在什么时候用触发器?要求系统根据某些操作自动完成相关任务,比如,根据买掉的产品的输入数量自动扣除该产品的库存量。什么时候用存储过程?存储过程就是程序,它是经过语法检查和编译的SQL语句,所以运行特别快。 存储过程和用户自定义函数具体的区别 先看定义: 存储过程 存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。 存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。 可以出于任何使用SQL 语句的目的来使用存储过程,它具有以下优点: ·可以在单个存储过程中执行一系列SQL 语句。 ·可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。·存储过程在创建时即在服务器上进行编译,所以执行起来比单个SQL 语句快。用户定义函数 函数是由一个或多个Transact-SQL 语句组成的子程序,可用于封装代码以便重新使用。Microsoft? SQL Server? 2000 并不将用户限制在定义为Transact-SQL 语言一部分的内置函数上,而是允许用户创建自己的用户定义函数。 可使用CREATE FUNCTION 语句创建、使用ALTER FUNCTION 语句修改、以及使用DROP FUNCTION 语句除去用户定义函数。每个完全合法的用户定义函数名(database_name.owner_name.function_name) 必须唯一。 必须被授予CREATE FUNCTION 权限才能创建、修改或除去用户定义函数。不是所有者的用户在Transact-SQL 语句中使用某个函数之前,必须先给此用户授予该函数的适当权限。若要创建或更改在CHECK 约束、DEFAULT 子句或计算列定义中引用用户定义函数的表,还必须具有函数的REFERENCES 权限。 在函数中,区别处理导致删除语句并且继续在诸如触发器或存储过程等模式中的下一语句的Transact-SQL 错误。在函数中,上述错误会导致停止执行函数。接下来该操作导致停止唤醒调用该函数的语句。 用户定义函数的类型

完整版Oracletrigger入门

Oracle trigger 入门 DML 触发器有三类:1,insert 触发器;2,update 触发器;3,delete 触发器;触发器的组成部分:触发器的声明,指定触发器定时,事件,表名以类型触发器的执行,PL/SQL 块或对过程的调用触发器的限制条件,通过where 子句实现类型:应用程序触发器,前台开发工具提供的;数据库触发器,定义在数据库内部由某种条件引发,分为:DML 触发器数据库级触发器替代触发器;DML 触发器组件:1,触发器定时2,触发器事件3,表名4,触发器类型5,When 子句6,触发器主体可创建触发器的对象:数据库表,数据库视图,用户模式,数据库实例创建DML 触发器: Create [or replace] trigger [ 模式.] 触发器名Before| after insert|delete|(update of 列名) On 表名[for each row] When 条件PL/SQL 块 For each row 的意义是:在一次操作表的语句中,每操作成功一行就会触发一次;不写的话,表示是表级触发器,则无论操作多少行,都只触发一次; When 条件的出现说明了,在DML 操作的时候也许一定会触发触发器,但是触发器不一定会做实际的工作,比如when 后的条件不为真的时候,触发器只是简单地跳过了PL/SQL 块;Insert 触发器的创建:create or replace trigger tg_insert before insert on student begin dbms_output.put_line('insert trigger is chufa le ');

数据库触发器的分类和区别

Oracle触发器的分类和使用 摘要:在Oracle中,触发器是一种特殊的存储过程,它在发生某种数据库事件时由Oracle 系统自动触发。触发器通常用于加强数据的完整性约束和业务规则等,对于表来说,触发器可以实现比CHECK约束更为复杂的约束。本文介绍了Oracle触发器的概念,功能,优缺点,组成等方面。详细解读了Oracle触发器在各方面的应用并配合相关实例。 关键字:Oracle、触发器、介绍、应用 一、触发器的介绍 1.1 触发器的概念 在Oracle中,触发器是一种特殊的存储过程,它在发生某种数据库事件时由Oracle系统自动触发发器,通常用于加强数据的完整性约束和业务规则等。 触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的,而是由一个事件来启动运行。即触发器是当某个时间发生时自动地隐式运行。 1.2 触发器的功能 ●允许/限制对表的修改 ●自动生成派生列,比如自增字段 ●强制数据一致性 ●提供审计和日志记录 ●防止无效的事务处理 ●启用复杂的业务逻辑 1.3 触发器的优缺点 优点:触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用CHECK 约束定义的约束更为复杂的约束。与CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDA TE 或DELETE)允许采取多个不同的对策以响应同一个修改语句。 缺点:触发器功能强大,轻松可靠地实现许多复杂的功能,但是它也具有一些缺点那就是由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作。同时规则、约束、缺省值也是保证数据完整性的重要保障。如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程序。 1.4 触发器的组成

Linux系统(X64)安装Oracle11g完整安装教程

Linux系统(X64)安装Oracle11g完整安装图文教程1修改操作系统核心参数(Root用户) 1)修改用户的SHELL的限制,修改 /etc/security/ 文件 输入命令:vi /etc/security/,按i键进入编辑模式,将下列内容加入该文件。 oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 编辑完成后按Esc键,输入“:wq”存盘退出 2)修改/etc/login 文件,输入命令:vi /etc/login,按i键进入编辑模式,将下列内容加入该文件。 session required /lib/security/ session required 编辑完成后按Esc键,输入“:wq”存盘退出 3)修改linux内核,修改/etc/文件,输入命令: vi /etc/ ,按i键进入编辑模式,将下列内容加入该文件 = 6815744 = 1048576 = 2097152 = 48 = 4096 = 250 32000 100 128 = 1024 65500 = 4194304 = 4194304 = 262144 = 1048576 编辑完成后按Esc键,输入“:wq”存盘退出。 注意: = 9000 65500 网络默认9000 65500 4)要使 /etc/ 更改立即生效,执行以下命令。输入:sysctl -p显示如下: linux:~ # sysctl -p = 1 = 1 = 6815744 = 1048576 = 2097152 = 48 = 4096 = 250 32000 100 128 = 1024 65500

数据库触发器的应用实例

8.5 数据库触发器的应用举例 例1:创建一个DML语句级触发器,当对emp表执行INSERT, UPDATE, DELETE 操作时,它自动更新dept_summary 表中的数据。由于在PL/SQL块中不能直接调用DDL语句,所以,利用ORACLE内置包DBMS_UTILITY中的EXEC_DDL_STATEMENT过程,由它执行DDL语句创建触发器。 CREATE TABLE dept_summary( Deptno NUMBER(2), Sal_sum NUMBER(9, 2), Emp_count NUMBER); INSERT INTO dept_summary(deptno, sal_sum, emp_count) SELECT deptno, SUM(sal), COUNT(*) FROM emp GROUP BY deptno; --创建一个PL/SQL过程disp_dept_summary --在触发器中调用该过程显示dept_summary标中的数据。 CREATE OR REPLACE PROCEDURE disp_dept_summary IS Rec dept_summary%ROWTYPE; CURSOR c1 IS SELECT * FROM dept_summary; BEGIN OPEN c1; FETCH c1 INTO REC; DBMS_OUTPUT.PUT_LINE('deptno sal_sum emp_count'); DBMS_OUTPUT.PUT_LINE('-------------------------------------'); WHILE c1%FOUND LOOP DBMS_OUTPUT.PUT_LINE(RPAD(rec.deptno, 6)|| To_char(rec.sal_sum, '$999,999.99')|| LPAD(rec.emp_count, 13)); FETCH c1 INTO rec; END LOOP; CLOSE c1; END; BEGIN DBMS_OUTPUT.PUT_LINE('插入前'); Disp_dept_summary(); DBMS_UTILITY.EXEC_DDL_STATEMENT(' CREATE OR REPLACE TRIGGER trig1 AFTER INSERT OR DELETE OR UPDATE OF sal ON emp BEGIN DBMS_OUTPUT.PUT_LINE(''正在执行trig1 触发器…''); DELETE FROM dept_summary;

oracle包以及简单操作样例

一、包的概念 PL/SQL为了满足程序模块化的需要,除了块(block)和子程序结构外,还引入了包的构造。 (1)包是一种数据库对象,将逻辑上相关的PL/SQL类型、对象和子程序组合成一个更大的单位,是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合,它具有面向对象程序设计语言的特点,是对这些PL/SQL 程序设计元素的封装。 (2)包类似于C++和JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。 (3)与类相同,包中的程序元素也分为公用元素和私用元素两种,这两种元素的区别是他们允许访问的程序范围不同,即它们的作用域不同。公用元素不仅可以被包中的函数、过程所调用,也可以被包外的PL/SQL 程序访问,而私有元素只能被包内的函数和过程序所访问。 (4)PL/SQL的包具有信息隐蔽性(information hiding),仅在算法和数据结构设计有关层可见。可将过程说明和过程体组成一个程序单位。也可将过程说明与它的过程体分开,在这种情况下,将过程放置在一个包中,可隐蔽实现的细节。也可在包中定义过程,而该过程在包说明中没有定义过程说明,这样定义的过程仅在包内使用。

(5)在PL/SQL程序设计中,使用包不仅可以使程序设计模块化,对外隐藏包内所使用的信息(通过使用私用变量),而写可以提高程序的执行效率。因为,当程序首次调用包内函数或过程时,ORACLE将整个包调入内存,当再次访问包内元素时,ORACLE直接从内存中读取,而不需要进行磁盘I/O操作,从而使程序执行效率得到提高。如果ORACLE具有Procedure选件,包可以编译、存贮在ORACLE数据库中,其内容可为许多应用共享。 二、包的作用 包可以将任何出现在块声明的语句(过程,函数,游标,游标,类型,变量)放于包中,相当于一个容器。将声明语句放入包中的好处是:用户可以从其他PL/SQL块中对其进行引用,因此包为PL/SQL提供了全程变量。 三、包定义: (1)一个包由两个分开的部分组成: (2)包定义(PACKAGE):包定义部分是为应用程序的接口,声明包内数据类型、变量、常量、游标、子程序和异常错误处理等元素,这些元素为包的公有元素。

相关文档
最新文档