ORACLE禁用启用外键和触发器
触发器详解
进度表:时间主题80 分钟讲演40 分钟练习 120分钟总共9-2Copyright ©Oracle Corporation, 2001. All rights reserved.目标完成本课程后, 您应当能够:•描述不同触发器类型的区别•描述数据库触发器和它们的用途•创建数据库触发器•描述数据库触发器的点火(firing ) 规则•删除触发器本课目标在本课中,你将学习怎样创建和使用数据库触发器。
9-3Copyright ©Oracle Corporation, 2001. All rights reserved.触发器的类型触发器:•是一个PL/SQL 块或是与表、视图方案或数据库关联的PL/SQL 过程•当特定的事件发生时隐式执行•触发器可以是:–应用程序触发器:当一个特定应用程序的事件发生时触发–数据库触发器:当数据事件(例如DML) 在一个方案上发生或系统事件(例如登录或关闭数据库) 在数据库上发生时触发触发器的类型在一个应用程序中,当一个特殊的数据操纵语言 (DML) 事件发生时,应用程序触发器隐式地执行。
一个广泛使用触发器的应用程序的例子是用 Oracle Forms Developer 开发的应用程序。
当一个表上的象 DML 这样的数据事件 (INSERT 、UPDATE 或 DELETE 触发语句),或在一个视图上的 INSTEAD OF 触发器,或象 CREATE 和 ALTER 这样的数据定义语言 (DDL) 语句被发布时,数据库触发器隐式地执行,不论哪一个用户被连接或哪一个应用程序被使用。
当一些用户行为或数据库系统行为发生时,例如,当用户登录时,或 DBA 关闭 (shutdown) 数据库时,数据库触发器也会隐式地执行。
注:数据库触发器可以被定义在表或视图上。
如果一个 DML 操作在一个不可更新的视图上被发布,INSTEAD OF 触发器定义那些会发生的行为。
oracle语句set unused cascaed constraints
oracle语句set unused cascaedconstraintsOracle语句SET UNUSED CASCADE CONSTRAINTS在Oracle数据库中,SET UNUSED CASCADE CONSTRAINTS 是一种用于弃用约束的语句。
本文将详细介绍SET UNUSED CASCADE CONSTRAINTS语句的作用、用法和注意事项。
SET UNUSED CASCADE CONSTRAINTS语句是一种用来标记约束为"已弃用"的命令。
当某个约束已经不再需要使用,但由于某些原因需要保留在数据库中时,可以使用该命令将其标记为"已弃用",从而使其对后续的数据操作不起作用。
使用SET UNUSED CASCADE CONSTRAINTS语句时,需要注意以下几点:1. SET UNUSED CASCADE CONSTRAINTS只能用于禁用主键(PRIMARY KEY)和唯一约束(UNIQUE CONSTRAINTS)。
2. 使用SET UNUSED CASCADE CONSTRAINTS命令弃用约束将会导致表上的该约束不再检查或强制。
3. SET UNUSED CASCADE CONSTRAINTS命令将禁用约束,并设置其状态为"UNUSED"。
这将导致数据库忽略该约束,但仍然保留在数据字典中。
4. SET UNUSED CASCADE CONSTRAINTS语句是一个DDL(数据定义语言)语句,因此需要在提交之前使用COMMIT语句保持更改。
下面是SET UNUSED CASCADE CONSTRAINTS命令的使用示例:```sqlALTER TABLE employeesSET UNUSED CASCADE CONSTRAINTS;```在上面的示例中,我们将employees表中的所有约束标记为"已弃用"。
oracle,外键命名规范
竭诚为您提供优质文档/双击可除oracle,外键命名规范篇一:数据库(oracle)命名规范命名规范(oracle数据库)1表命名命名最好望文生义,避免使用数据库关键词命名一律为大写字母(不要大下写混合)英文单词单数命名.例:FactoRy 英文单词缩写命名.例:dept英文单词之间用下划线连结,且每个单词皆为单数.例:task_Result用来存储历史资料,命名以histoRy结尾.例:task_his用来存储日志资料,命名以log结尾.例:task_log用来存储类别资料,命名以type结尾.例:task_type2表字段命名最好望文生义,避免使用数据库关键词英文单词单数命名.例:mail英文单词缩写命名.例:dept_id英文单词之间用下划线连结,且每个单词皆为单数.例:useR_name字段用来存储流水号,命名以id结尾.例:task_id字段用来存储代码,命名以no结尾.例:task_no字段用来存储类别,命名以type结尾.例:station_type字段用来存储名称,命名以name 结尾.例:enduseR_name字段用来存储描述,命名以desc结尾.例:station_desc字段用来存储代码,命名以code结尾.例:eRRoR_code字段用来存储标志,命名以Flag开头.例:debug_Flag3索引命名以表名+index+两位流水号(01~99).例:enduseR_index014键值主键命名以表名+pk+一位流水号(1~9).例:dept_pk1附键命名以表名+ak+一位流水号(1~9).例:dept_ak1外键命名以表名+Fk+一位流水号(1~9).例:dept_Fk1检查条件以表名+ck+一位流水号(1~9).例:dept_ck15视图命名以V_开头例:V_dept其它规则参考资料表命名规则6触发器以表名+tR+一位流水号(1~9)命名.例:dept_tR17存储过程命名以pc开头实现单一资料表交易功能,以pc+表名命名.例:pc_line实现关联资料表交易功能,以pc+功能命名.例:pc_getdata命名需让人明白其主要功能8函数检查功能的函数,以is+检查项目命名.例:boolischarValid(char)获取资料功能的函数,以get+数据项命名.例:stringgetlineno(char)设定资料功能的函数,以set+数据项命名.例:intsetlineno(char)9序列命名以seq开头以表的字段名命名.例:seq_line_id若与其它表的字段名相同,则以表名+字段名命名.例:seq_code_type_id10表空间存储资料的命名为项目名称.例:cRm存储索引的命名为项目名称+idx.例:cRmidx存储历史的命名为项目名称+old.例:cRmold存储临时的命名为项目名称+log.例:cRmlog.11数据文件命名以所属表空间开头+两位流水号(01~99)+.oRa.例:cRm01.oRa12包命名以功能缩写开头+pkg+流水号(1~9).例:cRmpkg1篇二:oRacle对象命名规范oracle对象命名规范(试用稿)20xx年4月修改说明正文目录1引言................................................. ................................................... .....................41.11.21.32目的................................................. ................................................... ..............4范围................................................. ................................................... ..............4参考资料................................................. ................................................... (4)国网标准化命名规范.............................................................................................42.12.2 2.32.42.5基本原则................................................. ................................................... ......4实体(表)的英文命名规则................................................. .........................4属性(列)的英文命名规则................................................. .........................5主键的英文命名规则................................................. .....................................6外键的英文命名规则................................................. . (6)3内部补充命名规范................................................. ..............错误!未定义书签。
Oracle常用SQL命令
Oracle常⽤SQL命令创建表空间1.创建默认表空间WLP_DATCREATE TABLESPACE "MYSPACE" DATAFILE'D:\oracle\oradata\orcl\data/WLP_DAT.dbf' SIZE 32M REUSE AUTOEXTEND ON NEXT 32MLOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;2.创建临时表空间WLP_TEMP(⽤于缓存,可以不建)ALTER TABLESPACE "TEMP" ADD TEMPFILE'D:\oracle\oradata\orcl\data/WLP_TEMP.dbf' SIZE 32m REUSE autoextend on next 32m;创建⽤户并授权1CREATE USER "WLPING" PROFILE "DEFAULT"2 IDENTIFIED BY "123456"3DEFAULT TABLESPACE "MYSPACE" //默认指定表空间4TEMPORARY TABLESPACE "TEMP" //指定缓存表空间5 ACCOUNT UNLOCK; //⽤户⾮锁定67GRANT EXECUTE ON dbms_comparison TO "WLPING";8GRANT UNLIMITED TABLESPACE TO "XIR_MD";9GRANT "CONNECT" TO "XIR_MD";10GRANT "RESOURCE" TO "XIR_MD";1112-- GRANT DBA TO XIR_MD;PROFILE:Oracle系统中的profile可以⽤来对⽤户所能使⽤的数据库资源进⾏限制,使⽤Create Profile命令创建⼀个Profile,⽤它来实现对数据库资源的限制使⽤,如果把该profile分配给⽤户,则该⽤户所能使⽤的数据库资源都在该profile的限制之内。
Oracle 外键约束
Oracle 外键约束外键FOREIGN KEY约束是几种约束是最复杂的,外键约束可以使两个表进行关联。
外键是指引用另一个表中的某个列或某几个列,或者本表中另一个列或另几个列的列。
被引用的列应该具有主键约束,或者惟一性约束。
在外键的定义中,涉及到外键表、外键列、被引用表和被引用列等几个概念。
如果成功地创建了外键约束,那么系统将要求外键列中的数据必须来自被引用列中的数据。
被引用列中不存在的数据不能存储于外键列中。
在一般情况下,当删除被引用表中的数据时,该数据也不能出现在外键列中。
如果外键列存储了将要在被引用表中删除的数据,那么对被引用表删除数据的操作将失败。
最典型的外键约束是HR模式中的EMPLOYEES和DEPARTMENT表,在该外键约束中,外键表EMPLOYEES中的外键列DEMPARTMENT_ID将引用被引用表DEPARTMENTS 中的DEMPARTMENT_ID列。
例如,在以下的示例中,将以HR身份连接到数据库,并创建一个新表ADMINISTRATION_EMP,并为其添加到DEPATRMENT表的外键约束:SQL> connect hr/hr已连接。
SQL> create table administration_emp2 as select * from hr.employees3 where department_id=10;表已创建。
SQL> alter table administration_emp2 add constraint admin_dep_fk3 foreign key(department_id)4references departments(department_id);表已更改。
为验证创建的外键约束的有效性,可以向ADMINISTRATION_EMP表添加一条记录,并且它的DEPARTMENT_ID列值不存在DEPARTMENTS表中,那么插入操作将会因为违反外键约束而失败:SQL> insert into administration_emp(2 employee_id,last_name,email,hire_date,job_id,department_id)3 values(120,'刘丽','li@',sysdate,'HR_REP',360);insert into administration_emp(*第 1 行出现错误:ORA-02291: 违反完整约束条件(HR.ADMIN_DEP_FK) - 未找到父项关键字注意在一个表上创建外键约束时,被引用表必须已经存在,并且必须为该表的引用列定义惟一性约束或主键约束。
oracle清表函数
CREATE PROCEDURE sp_DeleteAllData ASEXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'EXEC sp_MSForEachTable 'DELETE FROM ?'EXEC sp_MSForEachTable 'TRUNCATE TABLE ?'EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL'GO--先禁用所有外键约束exec sp_msforeachtable "alter table ? nocheck CONSTRAINT all "--禁止所有触发器exec sp_msforeachtable "alter table ? disable trigger all "--然后删除数据exec sp_msforeachtable @command1= 'truncate table ? ',@whereand= ' and objectproperty(o.id, ' 'TableHasForeignRef ' ')=0 '--此处o.id是什么意思?exec sp_msforeachtable @command1= 'delete from ? ',@whereand= ' and objectproperty(o.id, ' 'tablehasforeignref ' ')=1 ' --再启用所有外键约束exec sp_msforeachtable "alter table ? check constraint all "--启用所有触发器exec sp_msforeachtable "alter table ? enable trigger all "另外,我只想删除自己的表的数据,那些sys开头的数据不想清空,上面这个存储过程应该不行吧?--然后删除数据exec sp_msforeachtable @command1= 'truncate table ? ',@whereand= ' and objectproperty(o.id, ' 'TableHasForeignRef ' ')=0 '--此处o.id是什么意思?exec sp_msforeachtable @command1= 'delete from ? ',@whereand= ' and objectproperty(o.id, ' 'tablehasforeignref ' ')=1 '能不能解释一下这里是什么意思?create proc usp_delete asdelete adelete bgoexec usp_delete如何清空SQL数据库里的数据1、打开“服务管理器”,选中你要处理的数据库,然后打开“工具”里的“SQL查分析器”,运行下面语句:--先禁用所有外键约束exec sp_msforeachtable "alter table ? nocheck CONSTRAINT all"--然后删除数据exec sp_msforEachTable "TRUNCATE TABLE?"--再启用所有外键约束exec sp_msforeachtable "alter table ? check constraint all"2、成功。
oracle_开发工程师面试题
1. 说明冷备份和热备份的不同点和各自的优势解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份。
而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库。
热备份的优势在于当备份时,数据库仍旧能够被利用而且能够将数据库恢复到任意一个时刻点。
冷备份的优势在于它的备份和恢复操作相当简单,而且由于冷备份的数据库能够工作在非归档模式下,数据库性能会比归档模式稍好。
(因为没必要将archive log写入硬盘)2. 你必需利用备份恢复数据库,可是你没有操纵文件,该如何解决问题呢解答:重建操纵文件,用带backup control file 子句的recover 命令恢复数据库。
3. 如何转换到spfile软件开发网解答:利用create spfile from pfile 命令.4. 说明data block , extent 和segment的区别(那个地址建议用英文术语)解答:data block是数据库中最小的逻辑存储单元。
当数据库的对象需要更多的物理存储空间时,持续的data block就组成了extent . 一个数据库对象拥有的所有extents被称为该对象的segment.软件开发网5. 给出两个检查表结构的方式解答:命令包软件开发网6. 如何查看数据库引擎的报错解答:alert log.7. 比较truncate和delete 命令解答:二者都能够用来删除表中所有的记录。
区别在于:truncate是DDL操作,它移动HWK,不需要rollback segment .而Delete是DML操作, 需要rollback segment 且花费较长时刻.8. 利用索引的理由解答:快速访问表中的data block9. 给出在STAR SCHEMA中的两种表及它们别离含有的数据软件开发网解答:Fact tables 和dimension tables. fact table 包括大量的要紧的信息而dimension tables 寄存对fact table 某些属性描述的信息10. FACT T able上需要成立何种索引解答:位图索引(bitmap index)11. 给出两种相关约束解答:主键和外键12. 如安在不阻碍子表的前提下,重建一个母表解答:子表的外键强制实效,重建母表,激活外键软件开发网13. 说明归档和非归档模式之间的不同和它们各自的优缺点解答:归档模式是指你能够备份所有的数据库transactions并恢复到任意一个时刻点。
跟我学Oracle数据库系统管理和实现——Oracle数据库DML触发器应用技术及应用实例
(2)触发器的程序代码示例
(3)注意代码中的someOneSequenceName是一个序列号的 名称,首先要定义出 (4)而someOneSequenceName.NEXTVAL获得序列号的下一 个唯一的序列值,因此如下的语句也就是把那个唯一的序 列值填写到 someOneTableName数据库表的ID字段。 “SELECT someOneSequenceName.NEXTVAL INTO :NEW.ID FROM DUAL;”
(3)利用下面的代码触发该触发器的执行 (4)在输出控制台中出现警告信息。
(5)对前面的示例也可以采用可视化方式实现
6、语句级触发器应用示例二 (1)为什么要应用触发器实现此功能
下面的触发器示例实现在插入数据库表数据时自动为 该表中的ID字段赋值,从而可以自动生成ID字段的值。
之所以应用触发器实现此功能,是因为在Oracle数据 库系统中不直接支持自动递增的数据列,因此需要创建出 一个序列SEQUENCE。
Oracle 数据库 DML触发器 应用技术及应用实例
1、DML触发器是定义在一个表或视图(针对某个数据库表 的视图)上的触发器
(1)什么是DML触发器
DML触发器是指基于DML操作所建立的触发器,DML触发 器是最常用的触发器,一旦建立了DML触发器后,如果发生 了DML操作(insert、delete或update等)就会执行相应的 触发器所指定的程序代码。
由于CUSTOMER_INFO表和CONTRACT_INFO数据库表产生 一对多的关联关系,当删除一个客户信息时,对应的合同 信息也级联删除。
(2)代码示例
(2)创建行级触发器的语法 格式
oracle 触发器的实例
oracle 触发器的实例触发器使用教程和命名规范目录触发器使用教程和命名规范 11,触发器简介 12,触发器示例 23,触发器语法和功能 34,例一:行级触发器之一 45,例二:行级触发器之二 46,例三:INSTEAD OF触发器 67,例四:语句级触发器之一 88,例五:语句级触发器之二 99,例六:用包封装触发器代码 1010,触发器命名规范 111,触发器简介触发器(Trigger)是数据库对象的一种,编码方式类似存储过程,与某张表(Table)相关联,当有DML语句对表进行操作时,可以引起触发器的执行,达到对插入记录一致性,正确性和规范性控制的目的。
在当年C/S时代盛行的时候,由于客户端直接连接数据库,能保证数据库一致性的只有数据库本身,此时主键(Primary Key),外键(Foreign Key),约束(Constraint)和触发器成为必要的控制机制。
而触发器的实现比较灵活,可编程性强,自然成为了最流行的控制机制。
到了B/S时代,发展成4层架构,客户端不再能直接访问数据库,只有中间件才可以访问数据库。
要控制数据库的一致性,既可以在中间件里控制,也可以在数据库端控制。
很多的青睐Java的开发者,随之将数据库当成一个黑盒,把大多数的数据控制工作放在了Servlet中执行。
这样做,不需要了解太多的数据库知识,也减少了数据库编程的复杂性,但同时增加了Servlet编程的工作量。
从架构设计来看,中间件的功能是检查业务正确性和执行业务逻辑,如果把数据的一致性检查放到中间件去做,需要在所有涉及到数据写入的地方进行数据一致性检查。
由于数据库访问相对于中间件来说是远程调用,要编写统一的数据一致性检查代码并非易事,一般采用在多个地方的增加类似的检查步骤。
一旦一致性检查过程发生调整,势必导致多个地方的修改,不仅增加工作量,而且无法保证每个检查步骤的正确性。
触发器的应用,应该放在关键的,多方发起的,高频访问的数据表上,过多使用触发器,会增加数据库负担,降低数据库性能。
oracle form 常用Trigger的触发时机
BUTTON
Button點擊或確定時觸發
常見的Trigger觸發順序
Action
Sequence
Trigger
Level
Open Form
1
-FORM
Form
2
PRE-BLOCK
Block
3
PRE-RECORD
Block
4
PRE-TEXT-ITEM
Item
ON-UPDATE
Update操作寫入DB時觸發
ON-DELETE
Delete操作寫入DB時觸發
ON-LOCK
從DB中查詢出的record,在第一個發生值變化的操作時觸發,lock之後其它的值變化操作不會再觸發;直到commit後自動解除lock
PRE-QUERY
在執行SQL前觸發。可以用來設置資料塊default_where, order_by等屬性
WHEN-NEW-RECORD-INSTANCE
Record獲得焦點時觸發. After WHEN-NEW-BLOCK-INSTANCE
WHEN-VALIDATE-RECORD
Record中的item validate通過後,block commit前觸發
POST-RECORD
焦點離開Record觸發
Block Level:
Trigger
觸發時機
PRE-BLOCK
BLOCK得到焦點,初始化之前
PRE-RECORD
Record初始化前. After PRE-BLOCK, Before WHEN-NEW-BLOCK-INSTANCE
WHEN-NEW-BLOCK-INSTANCE
oracle解除字段的约束条件
在Oracle数据库中,要解除字段的约束条件,可以使用`ALTER TABLE`语句以及相应的子句来完成。
以下是一些常见的约束条件及其解除方法:1. 主键约束(Primary Key Constraint):解除主键约束的语法如下:```ALTER TABLE table_name DROP CONSTRAINT constraint_name;```其中,`table_name`是要操作的表名,`constraint_name`是主键约束的名称。
2. 唯一约束(Unique Constraint):解除唯一约束的语法如下:```ALTER TABLE table_name DROP CONSTRAINT constraint_name;```其中,`table_name`是要操作的表名,`constraint_name`是唯一约束的名称。
3. 外键约束(Foreign Key Constraint):解除外键约束的语法如下:```ALTER TABLE table_name DROP CONSTRAINT constraint_name;```其中,`table_name`是要操作的表名,`constraint_name`是外键约束的名称。
4. 检查约束(Check Constraint):解除检查约束的语法如下:```ALTER TABLE table_name DROP CONSTRAINT constraint_name;```其中,`table_name`是要操作的表名,`constraint_name`是检查约束的名称。
需要注意的是,解除约束前应该确保数据的完整性,否则可能会导致数据不一致的问题。
在解除约束之前,可以使用`SELECT`语句和其他方法先验证数据的正确性。
此外,如果要修改字段的约束条件,可以使用`ALTER TABLE`语句和相应的子句来实现。
例如,要修改字段的数据类型、长度等属性,可以使用`MODIFY`子句。
由于执行触发器导致登录失败,错误号为17892的解决方案
问题概述::登录SQL SERVER 时间提示“由于执行触发器,登录名xxx的登录失败”,如下图原因: 编写了服务器级别的触发器,执行触发器时发生了错误导致. 如下图,trg_logon为一个登录触发器,如果执行错误,则不能正常登录SQL SERVER.解决方法:以最小配置模式启动SQL SERVER后,禁用或删除触发器.详细步骤:1.从开始菜单启动配置管理器点击SQL SERVER 服务,右侧双击SQL SERVER(XXX) 打开属性窗口->高级->启动参数->在启动参数里加上”;-f”注意-f前要加上分号。
-f 表示以最小配置模式运行SQ L SERVER, 从个人使用效果来看最小配置模式SQL SERVER只允许一个用户连接,似乎已经包含了”单用户模式(参数为-m)”,填写好参数后,点击确定。
(参数详细说明,见本文最后)保存启动参数后,会出现以下对话框,点击确定,然后重启SQL SERVER ,刚才的设置就会生效。
重启SQL SERVER 后,打开SQL SERVER Management Studio, 第一次弹出登录窗口时,点击取消点击对象资源管理器上的连接按钮,弹出连接对话框,设置好后连接连接成功后,找到触发器,右键-》禁用.禁用后,再重新修改SQL SERVER 启动参数,去掉-f选项,重启SQL SERVER, 即可正常使用.最后附SQL SERVER启动参数资料供参考:1.Sqlservr.exe运行参数。
SqlServer的启动可以为Windows服务方式(默认),也可以以应用程序方式启动。
下面介绍sqlservr.exe 以应用程序方式启动时的参数问题。
sqlservr应用程序用法:sqlservr[-sinstance_name][-c][-dmaster_path][-f][-eerror_log_path][-lmaster_log_path][-m][-n][-Ttrace#][-v][-x][-gnumber][-O][-ynumber]-sinstance_name指定要连接到的SQLServer实例。
oracle触发器-解决mutating table的问题
Oracle触发器mutating table问题解决方案一、问题描述Oracle触发器是特定事件出现的时候,自动执行的代码块。
但在使用过程中,往往遇到如下需求:1、在触发器执行时,使用DML语言操作触发器的基础表,完成更新、插入或删除操作;2、触发器对于父子表,即有外键关联的表的相关操作;或者说trigger访问了自身上的表。
在以上两种情况下,依据Oracle的事务处理规则,通常产生如下错误:ORA-04091。
该错误解释为:当前的trigger下的事物,access(执行)了一个mutating table(冲突的表)。
一个简单的例子拿oracle的示例表emp和dept来做这个试验。
dept的表结构如下:emp表结构如下:emp和dept是一对父子表,关联column为DEPTNO。
接下来创建1个table:emp_log 和1个语句级trigger: emp_del_trg。
取一个最简单的业务功能,emp_del_trg的作用就是当表emp记录被删除的时候,触发器将删除的记录的EMPNO,DNAME和删除时间写入到emp_log中,当子表依赖的父表相关记录删除的时候,emp_log不做处理。
表emp_log的结构如下:触发器trigger代码如下:来看看这个触发器是否能正常工作,首先删除emp的记录。
看似trigger工作正常,删除dept的记录呢?问题分析:ORA-04091错误如约而至。
不难解释,因为父子表指定了级联删除,删除dept的记录从而引起删除emp表上的相应数据,然后触发了emp_del_trg,由于trigger里有对dept的访问,对当前事务说,dept就是一个mutating table,这是不被允许的。
如何来解决这个问题而实现这个简单的业务逻辑功能呢?当然,从表结构逻辑设计上来讲,可以将dept表上的dname字段add到emp表,或者不要显式的指定references,用程序来维护数据的完整性和约束,然后调整业务代码.最直接的方法,在trigger中声明一个ora-04091的exception,对此异常不做处理,也可完成目的。
oracle 触发器(trigger)
触发器的使用1触发器资料来源:《/view/71791.htm?fr=ala0_1_1》触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行。
触发器经常用于加强数据的完整性约束和业务规则等。
触发器可以从DBA_TRIGG ERS ,USER_TRIGGERS 数据字典中查到。
1.1 数据库领域名词触发器可以查询其他表,而且可以包含复杂的SQL语句。
它们主要用于强制服从复杂的业务规则或要求。
例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。
触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。
然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。
如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。
1.2 创建触发器的SQL语法DELIMITER |CREATE TRIGGER `<databaseName>`.`<triggerName>`< [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >ON <tableName>FOR EACH ROWBEGIN--do somethingEND |1.3 触发器的优点触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。
触发器可以强制比用CHECK 约束定义的约束更为复杂的约束。
与CHECK 约束不同,触发器可以引用其它表中的列。
例如,触发器可以使用另一个表中的SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。
触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。
oracle触发器中的变异表
变异表就是当前被DML语句修改的表,对trigger来说,变异表就是trigger在其上定义的表。
需要明确的是trigger中SQL语句不能进行如下操作:1)读或修改触发语句的任何变异表,其中包括触发表本身2)读或修改触发表的约束表中的主关键字,唯一关键字和外部关键字列。
除此之外的其他列都可以修改create table ORGAN ( ID NUMBER not null, ORGAN_FATHER NUMBER default (0), --父机构,等于-1的话表示最高机构ORGANCODE V ARCHAR2(100) )这个表主要表示机构的层次关系,ID、ORGANCODE和ORGAN_FATHER如下:ID ORGANCODE ORGAN_FATHER1 000 -12 000001 13 000001001 24 000002 1我现在要做的就是在插入新的数据后,插入的字段为id,ORGAN_FATHER,然后通过触发器自动生成ORGANCODE插入表中。
但是发现了变异表的问题。
我的触发器如下:SQL codecreate or replace package mypack as TYPE t_uname is table of ORGAN.ID%type index by binary_integer; v_id t_id; v_row binary_integer:=0; end mypack; --第二步:建立一BEFORR的行級觸發器CREATE OR REPLACE TRIGGER ORGAN_before before UPDA TE of uname ON mytest FOR EACH ROW BEGIN mypack.v_row := mypack.v_row +1; mypack.v_id(mypack.v_row) := :new.id; END ORGAN_before; --第三步:建立一個AFTER的語句級觸發器CREATE OR REPLACE TRIGGER ORGAN_after after UPDA TE of uname ON ORGAN declare v_id ORGAN.id%TYPE; BEGIN FOR V_LOOP IN1..mypack.v_row LOOP v_id:= mypack.v_id(V_LOOP); END LOOP; --此处,实现你的逻辑update ORGAN set organcode='000003'where id=v_id; END ORGAN_after;update ORGAN set organcode='000003' where id=v_id;、为了更好的阐述变异表考虑下面3个表:students,classes,registered_students 表students 和classes都没有依赖关系但是表registered_students有两个外键一个依赖于students表的主键一个依赖于classes的主键表如下:create table students (id number(5) not null,current_credits number(3),major varchar2(20),last_name varchar2(20) not null,first_name varchar2(20) not null,middle_initial varchar2(20) not null,constraint students_pk primary key (id));create table classes (department char(3) not null,course number(3) not null,current_students number(3) not null,num_credits number(1) not null,name varchar2(30) not null,constraint classes_pk primary key (department,course));create table registered_students (student_id number(5) not null,department char(3) not null,course number(3) not null,grade char(1),constraint rs_grade check (grade in ('a,','b','c','d','f')),constraint re_student_id foreign key (student_id) references students (id),constraint re_department_course foregn key (department,course) references classes (department,course));表registered_students 上声明了2个引用完整性约束,因此表students和classes都是registered_students 的约束表,由于存在这种约束所以表students和classes可能会需要使用DML语句进行更新和查询,另外在registered_students表上执行DML语句的时候它就变成一个变异表触发器中SQL语句不能:读取或更新触发语句的任何变异表也包括触发表本身,读取或更新该触发表的约束表的主键列、唯一性键列或外键列但是如果需要也可以更新其他列。
oracle 触发器 高级用法
oracle 触发器高级用法1. 触发器的递归使用Oracle 触发器可以嵌套使用。
例如,我们可以在一个触发器中触发另一个触发器。
这样的触发器称为递归触发器。
递归触发器有时可以用来简化更新操作。
例如,我们可以在一个表上创建一个触发器,当该表的某列发生变化时,自动更新另一个表的对应列。
这个操作可以使用两个触发器实现,但是如果使用递归触发器来实现,可以更加简洁明了。
但是递归触发器也需要小心使用。
如果递归触发器不正确地定义,可能会导致无限递归而引起死循环。
2. 触发器的条件过滤Oracle 触发器可以在执行之前或之后添加条件过滤。
条件过滤可以有效地限制触发器影响的行数,从而提高触发器的执行效率。
条件过滤可以使用WHEN 子句实现。
它的语法如下:WHEN(condition)其中,condition 是由SQL 表达式组成的一个条件,可以是多个表之间的比较,也可以是一个简单的值。
当SQL 语句执行时,如果条件成立,触发器就会执行。
否则,触发器不会执行。
Oracle 建议在执行DELETE 或UPDATE 语句时使用条件过滤,可以避免触发器不必要的执行,提高系统效率。
3. 同一事件上的多个触发器Oracle 触发器可以在同一事件上创建多个触发器,每个触发器都可以独立地执行。
多个触发器的执行顺序与它们的创建顺序有关。
但是,Oracle 不保证某个触发器的执行顺序。
因此,在创建多个触发器时,必须考虑到它们的执行顺序,并尽量保证它们的执行结果一致。
4. 禁用和启用触发器在某些情况下,需要禁用或者启用一个已经存在的触发器。
Oracle 提供了ALTER TRIGGER 语句来达到这个目的。
语法如下:禁用触发器ALTER TRIGGER trigger_name DISABLE;启用触发器ALTER TRIGGER trigger_name ENABLE;需要注意的是,在禁用触发器时,必须指定触发器的名称。
如果需要禁用多个触发器,需要依次执行相应的ALTER TRIGGER 语句。
Oracle SPARC S7-2系列伺服器安全指南说明书
如需有關 Oracle 對於協助工具的承諾資訊,請瀏覽 Oracle Accessibility Program 網站,網址為 /pls/topic/lookup?ctx=acc&id=docacc。
存取 Oracle 支援
已經購買客戶支援的Oracle 客戶可從 My Oracle Support 取得網路支援。如需資訊,請瀏覽 /pls/topic/lookup?ctx=acc&id=info;如您有聽力 障礙,請瀏覽 /pls/topic/lookup?ctx=acc&id=trs。
下列小節提供 SPARC 與 Netra SPARC S7-2 系列伺服器的一般硬體安全準則。
■ 「存取限制」[7] ■ 「序號」[7] ■ 「硬碟」[8]
存取限制
■ 將伺服器及相關設備安置在上鎖且限制人員進出的房間內。 ■ 如果設備安置在有門可以上鎖的機架內,除非必須維護或操作機架內的元件,否則請
本文件中的資訊如有變更恕不另行通知,且不保證沒有任何錯誤。如果您發現任何問題,請來函告知。
如果本軟體或相關說明文件是提供給美國政府或代表美國政府授權使用本軟體者,則適用下列條例:
U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agencyspecific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs. No other rights are granted to the U.S. Government.
oracleORA-01114、ORA-27067错误解决方法
oracleORA-01114、ORA-27067错误解决⽅法今天有朋友问到如下⼀则案例,ORA-01114,ORA-27067以及OSD-04026错误同时出现:*** ACTION NAME:() 2009-04-01 09:31:00.762*** MODULE NAME:(JDBC Thin Client) 2009-04-01 09:31:00.762*** SERVICE NAME:(SYS$USERS) 2009-04-01 09:31:00.762*** SESSION ID:(145.9) 2009-04-01 09:31:00.762*** 2009-04-01 09:31:00.762ksedmp: internal or fatal errorORA-01114: 将块写⼊⽂件 201 时出现 IO 错误 (块 # 492)ORA-27067: I/O 缓冲区的⼤⼩⽆效OSD-04026: Invalid parameter passed. (OS 1318912)ORA-01114: 将块写⼊⽂件 201 时出现 IO 错误 (块 # 492)ORA-27067: I/O 缓冲区的⼤⼩⽆效OSD-04026: Invalid parameter passed. (OS 1318912)ORA-01114: 将块写⼊⽂件 201 时出现 IO 错误 (块 # 492)ORA-27067: I/O 缓冲区的⼤⼩⽆效OSD-04026: Invalid parameter passed. (OS 1318912)ORA-01114: 将块写⼊⽂件 201 时出现 IO 错误 (块 # 9)ORA-27067: I/O 缓冲区的⼤⼩⽆效OSD-04026: Invalid parameter passed. (OS 1318912)No current SQL statement being executed.这个错误在9i的某些版本中,是因为⽂件⼤⼩超越了OS的限制时会出现的⼀个问题,多数出现在Windows平台上。
ORACLE_错误列表
ORA-00001: 违反唯一约束条件 (.)ORA-00017: 请求会话以设置跟踪事件ORA-00018: 超出最大会话数ORA-00019: 超出最大会话许可数ORA-00020: 超出最大进程数 ()ORA-00021: 会话附属于其它某些进程;无法转换会话ORA-00022: 无效的会话 ID;访问被拒绝ORA-00023: 会话引用进程私用内存;无法分离会话ORA-00024: 单一进程模式下不允许从多个进程注册ORA-00025: 无法分配ORA-00026: 丢失或无效的会话 IDORA-00027: 无法删去当前会话ORA-00028: 您的会话己被删去ORA-00029: 会话不是用户会话ORA-00030: 用户会话 ID 不存在。
ORA-00031: 标记要删去的会话ORA-00032: 无效的会话移植口令ORA-00033: 当前的会话具有空的移植口令ORA-00034: 无法在当前 PL/SQL 会话中ORA-00035: LICENSE_MAX_USERS 不能小于当前用户数ORA-00036: 超过递归 SQL () 级的最大值ORA-00037: 无法转换到属于不同服务器组的会话ORA-00038: 无法创建会话: 服务器组属于其它用户ORA-00050: 获取入队时操作系统出错ORA-00051: 等待资源超时ORA-00052: 超出最大入队资源数 ()ORA-00053: 超出最大入队数ORA-00054: 资源正忙,要求指定 NOWAITORA-00055: 超出 DML 锁的最大数ORA-00056: 对象 '.' 上的 DDL 锁以不兼容模式挂起ORA-00057: 超出临时表锁的最大数ORA-00058: DB_BLOCK_SIZE 必须为才可安装此数据库 (非 ) ORA-00059: 超出 DB_FILES 的最大值ORA-00060: 等待资源时检测到死锁ORA-00061: 另一个例程设置了不同的 DML_LOCKSORA-00062: 无法获得 DML 全表锁定;DML_LOCKS 为 0 ORA-00063: 超出 LOG_FILES 的最大数ORA-00064: 对象过大以至无法分配在此 O/S (,)ORA-00065: FIXED_DATE 的初始化失败ORA-00066: LOG_FILES 为但需要成为才可兼容ORA-00067: 值对参数无效;至少必须为ORA-00068: 值对参数无效,必须在和之间ORA-00069: 无法获得锁定 -- 禁用了表锁定ORA-00070: 命令无效ORA-00071: 进程号必须介于 1 和之间ORA-00072: 进程""不活动ORA-00073: 命令介于和个参数之间时使用ORA-00074: 未指定进程ORA-00075: 在此例程未找到进程 ""ORA-00076: 未找到转储ORA-00077: 转储无效ORA-00078: 无法按名称转储变量ORA-00079: 未找到变量ORA-00080: 层次指定的全局区域无效ORA-00081: 地址范围 [,) 不可读ORA-00082: 的内存大小不在有效集合 [1], [2], [4] 之内ORA-00083: 警告: 可能损坏映射的 SGAORA-00084: 全局区域必须为 PGA, SGA 或 UGAORA-00085: 当前调用不存在ORA-00086: 用户调用不存在ORA-00087: 命令无法在远程例程上执行ORA-00088: 共享服务器无法执行命令ORA-00089: ORADEBUG 命令中无效的例程号ORA-00090: 未能将内存分配给群集数据库 ORADEBUG 命令ORA-00091: LARGE_POOL_SIZE 至少必须为ORA-00092: LARGE_POOL_SIZE 必须大于 LARGE_POOL_MIN_ALLOCORA-00093: 必须介于和之间ORA-00094: 要求整数值ORA-00096: 值对参数无效,它必须来自之间ORA-00097: 使用 Oracle SQL 特性不在 SQL92 级中ORA-00099: 等待资源时发生超时,可能是 PDML 死锁所致ORA-00100: 未找到数据ORA-00101: 系统参数 DISPATCHERS 的说明无效ORA-00102: 调度程序无法使用网络协议ORA-00103: 无效的网络协议;供调度程序备用ORA-00104: 检测到死锁;全部公用服务器已锁定等待资源ORA-00105: 未配置网络协议的调度机制ORA-00106: 无法在连接到调度程序时启动/关闭数据库ORA-00107: 无法连接到 ORACLE 监听器进程ORA-00108: 无法设置调度程序以同步进行连接ORA-00111: 由于服务器数目限制在 , 所以没有启动所有服务器ORA-00112: 仅能创建多达 (最多指定) 个调度程序ORA-00113: 协议名过长ORA-00114: 缺少系统参数 SERVICE_NAMES 的值ORA-00115: 连接被拒绝;调度程序连接表已满ORA-00116: SERVICE_NAMES 名过长ORA-00117: 系统参数 SERVICE_NAMES 的值超出范围ORA-00118: 系统参数 DISPATCHERS 的值超出范围ORA-00119: 系统参数的说明无效ORA-00120: 未启用或安装调度机制ORA-00121: 在缺少 DISPATCHERS 的情况下指定了 SHARED_SERVERS ORA-00122: 无法初始化网络配置ORA-00123: 空闲公用服务器终止ORA-00124: 在缺少 MAX_SHARED_SERVERS 的情况下指定了 DISPATCHERS ORA-00125: 连接被拒绝;无效的演示文稿ORA-00126: 连接被拒绝;无效的重复ORA-00127: 调度进程不存在ORA-00128: 此命令需要调度进程名ORA-00129: 监听程序地址验证失败 ''ORA-00130: 监听程序地址 '' 无效ORA-00131: 网络协议不支持注册 ''ORA-00132: 语法错误或无法解析的网络名称 ''ORA-00150: 重复的事务处理 IDORA-00151: 无效的事务处理 IDORA-00152: 当前会话与请求的会话不匹配ORA-00153: XA 库中的内部错误ORA-00154: 事务处理监视器中的协议错误ORA-00155: 无法在全局事务处理之外执行工作ORA-00160: 全局事务处理长度超出了最大值 ()ORA-00161: 事务处理的分支长度非法 (允许的最大长度为 )ORA-00162: 外部 dbid 的长度超出了最大值 ()ORA-00163: 内部数据库名长度超出了最大值 ()ORA-00164: 在分布式事务处理中不允许独立的事务处理ORA-00165: 不允许对远程操作进行可移植分布式自治转换ORA-00200: 无法创建控制文件ORA-00201: 控制文件版本与 ORACLE 版本不兼容ORA-00202: 控制文件: ''ORA-00203: 使用错误的控制文件ORA-00204: 读控制文件时出错 (块,# 块 )ORA-00205: 标识控制文件出错,有关详情,请检查警告日志ORA-00206: 写控制文件时出错 (块,# 块 )ORA-00207: 控制文件不能用于同一数据库ORA-00208: 控制文件的名称数超出限制ORA-00209: 控制文件块大小不匹配,有关详情,请检查警告日志ORA-00210: 无法打开指定的控制文件ORA-00211: 控制文件与先前的控制文件不匹配ORA-00212: 块大小低于要求的最小大小 ( 字节)ORA-00213: 不能重新使用控制文件;原文件大小为,还需ORA-00214: 控制文件 '' 版本与文件 '' 版本不一致ORA-00215: 必须至少存在一个控制文件ORA-00216: 无法重新调整从 8.0.2 移植的控制文件大小ORA-00217: 从 9.0.1 进行移植无法重新调整控制文件的大小ORA-00218: 控制文件的块大小与 DB_BLOCK_SIZE () 不匹配ORA-00219: 要求的控制文件大小超出了允许的最大值ORA-00220: 第一个例程未安装控制文件,有关详情,请检查警告日志ORA-00221: 写入控制文件出错ORA-00222: 操作将重新使用当前已安装控制文件的名称ORA-00223: 转换文件无效或版本不正确ORA-00224: 控制文件重设大小尝试使用非法记录类型 ()ORA-00225: 控制文件的预期大小与实际大小不同ORA-00226: 备用控制文件打开时不允许进行操作ORA-00227: 控制文件中检测到损坏的块: (块,# 块 )ORA-00228: 备用控制文件名长度超出了最大长度ORA-00229: 操作不允许: 已挂起快照控制文件入队ORA-00230: 操作不允许: 无法使用快照控制文件入队ORA-00231: 快照控制文件未命名ORA-00232: 快照控制文件不存在, 已损坏或无法读取ORA-00233: 控制文件副本已损坏或无法读取ORA-00234: 标识或打开快照或复制控制文件时出错ORA-00235: 控制文件固定表因并发更新而不一致ORA-00236: 快照操作不允许: 挂上的控制文件为备份文件ORA-00237: 快照操作不允许: 控制文件新近创建ORA-00238: 操作将重用属于数据库一部分的文件名ORA-00250: 未启动存档器ORA-00251: LOG_ARCHIVE_DUPLEX_DEST 不能是与字符串相同的目的地ORA-00252: 日志在线程上为空,无法存档ORA-00253: 字符限制在以内,归档目的字符串超出此限制ORA-00254: 存档控制字符串 '' 时出错ORA-00255: 存档日志 (线程 , 序列 # ) 时出错ORA-00256: 无法翻译归档目的字符串ORA-00257: 存档器错误。
oracle数据库增删改使用注意事项
Oracle数据库是一种关系型数据库管理系统,被广泛应用于企业级应用的开发和管理中。
在使用Oracle数据库进行增删改操作时,需要注意一些事项,以保证数据的完整性和安全性。
下面将详细介绍Oracle数据库增删改操作的注意事项:一、增加数据时的注意事项:1. 插入数据时,需要确保插入的数据符合表结构的约束条件,包括主键、外键、唯一约束、非空约束等。
否则会出现插入失败的情况。
2. 在进行大批量数据插入时,建议使用批量插入的方式,例如使用INSERT INTO VALUES方式插入多条数据,而不是逐条插入,以提高插入效率。
3. 插入数据时,需要注意数据库的并发控制,确保插入的数据不会造成数据冲突和并发访问的问题。
二、删除数据时的注意事项:1. 删除数据前需要谨慎确认,确保删除操作不会对数据库的完整性和业务逻辑产生影响。
2. 在删除数据时,需要注意是否有其他表与当前表存在外键约束关系,避免因为删除主表数据而导致外键约束错误。
3. 删除大量数据时,建议使用DELETE语句加上条件进行删除,以避免误删整个表的数据。
三、修改数据时的注意事项:1. 在更新数据时,需要确保更新的数据符合表结构的约束条件,避免数据不一致性和错误的情况发生。
2. 修改数据时,需要考虑数据库的事务管理,确保更新操作的原子性和一致性。
3. 修改数据时,需要注意是否有其他表与当前表存在外键约束关系,以避免修改数据导致外键约束错误。
四、事务管理的注意事项:1. 在进行数据操作时,需要考虑事务管理,确保数据库操作的原子性、一致性、隔离性和持久性。
2. 在使用事务时,需要谨慎处理事务回滚和提交操作,以避免数据操作错误导致数据丢失或不一致的问题。
总结:在使用Oracle数据库进行增删改操作时,需要注意数据的完整性、约束条件、事务管理等方面的问题,以确保数据的安全性和一致性。
同时也需要考虑数据操作的效率和性能,以提高数据库的运行效率和可靠性。
希望以上内容能够帮助您更好地理解Oracle数据库增删改操作的注意事项。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
begin
EXECUTE IMMEDIATE c.v_sql;
exception when others then
dbms_output.put_line(sqlerrm);
end;
end loop;
for c in (select 'ALTER TABLE '||TNAME||' DISABLE ALL TRIGGERS ' AS v_sql from tab where tabtype='TABLE') loop
--禁用脚本
SET SERVEROUTPUT ON SIZE 10000000
BEGIN
for c in (select 'ALTER TABLE '||TABLE_NAME||' DISABLE CONSTRAINT '||constraint_name||' ' as v_sql from user_constraints where CONSTRAINT_TYPE='R') loop
DBMS_OUTPUT.PUT_LINE(C.V_SQL);
begin
EXECUTE IMMEDIATE c.v_sql;
exception when others then
dbms_output.put_line(sqlerrm);
end;
end loop;
for c in (select 'ALTER TABLE '||TNAME||' ENABLE ALL TRIGGERS ' AS v_sql from tab where tabtype='TABLE') loop
dbms_output.put_line(c.v_sql);
begin
execute immediate c.v_sql;
exception when others then
dbms_output.put_line(sqlerrm);
end;
end loop;
end;
/ Biblioteka SET SERVEROUTPUT ON SIZE 10000000
BEGIN
for c in (select 'ALTER TABLE '||TABLE_NAME||' ENABLE CONSTRAINT '||constraint_name||' ' as v_sql from user_constraints where CONSTRAINT_TYPE='R') loop
ORACLE 禁用/启用外键和触发器
在很多数据库维护工作中,经常会遇到对现有数据的导入导出的操作,但是数据库中表与表之间有 很多外键关系,不能直接的按维护要求对数据进行操作,所有需要对这些外键和触发器临时的禁用,然后在操作数据,完成操作后在启用对应的外键和触发器,下面的脚本就是提供对整个用户对象的外键和触发器的禁用和启用脚本:
dbms_output.put_line(c.v_sql);
begin
execute immediate c.v_sql;
exception when others then
dbms_output.put_line(sqlerrm);
end;
end loop;
end;
/
--启用脚本