ZTE-SOracle-创建包和触发器十五讲
新中新ORACLE数据库操作

一、新中新后台用户名密码+启动关闭数据库%%%%%%%%%%%%%%%%%%%%%%%%%%%%%卢欢所建syntongIP:222.206.1.187实例(也既是服务):syntongSYS用户密码:oracleSYSTEM用户密码:oracle新建用户school 密码school_passwd新建用户iddbuser 密码idpasswd %%%%%%%%%%%%%%%%%%%%%%%%%%%%%******************************************************1.在oracle用户下& dbca 注意在第10步的时候,选择选项卡character sets 选择choose from *the list of character sets*2.*****************************************************启动步骤:*******************建立新库图形界面在oracle用户下& dbca**************************************配置监听程序图形界面在oracle用户下& netmgr*******************su - oracle[oracle@websvr1 oracle]$ sqlplus /nologSQL> connect / as sysdbaSQL> startupSQL> quit[oracle@websvr1 oracle]$ lsnrctl start可用[oracle@websvr1 oracle]$ lsnrctl status 查看监听是否已经启动关闭步骤:su - oracle[oracle@websvr1 oracle]$ lsnrctl stop[oracle@websvr1 oracle]$ sqlplus /nologSQL> connect / as sysdbaSQL> shutdown immediateSQL> quit二、数据库的导入和导出导出:导入数据库:身份imp school/school@syntong file=/tmp/111.DMP,222,DMP log =app/oracle/file/log/DEV_PMODOC.log full=y owner=school钱包imp school/school@syntong file=/tmp/111.DMP,222,DMP log =app/oracle/file/log/DEV_PMODOC.log full=y ignore=y三、建立数据库实例和建立新中新后台程序的步骤*******************建立新库图形界面在oracle用户下& dbca**************************************配置监听程序图形界面在oracle用户下& netmgr*******************一卡通金融中心创建数据库syntong(小于注:在oracle用户下& dbca 注意在第10步的时候,选择选项卡character sets 选择choose from the list of character sets ,最后选择ZHS16GBK…….)创建表空间school_data,school_index,school_histrjn,school_temp(临时表空间)创建数据库用户school,缺省表空间为school_data,临时表空间为school_temp安装一卡通电子钱包中心软件创建用户school,school用户属于school用户组,(school用户也可属于dba组),用户组school;把安装文件从光盘中拷贝到/tmp下;以root用户注册,执行以下命令:#cd /tmp#./install (若权限不够,修改其权限)A、如果在安装时找不到oracle路径则可以修改install文件路径B、安装完毕后可根据实际的中心数据的IP和前置机的IP来修改etc/config.dat文件注:这两条不要随便更改。
(完整版)Oracle数据库规划设计和运行维护方案

Oracle数据库规划设计和运行维护方案(V1。
0)目录1。
前言 (6)1。
1. 编写目的 (6)1。
2。
方案说明 (6)1.3. 预期读者 (7)2。
数据库部署模式 (7)2.1. 单机模式 (7)2.2. 双机热备模式(HA模式) (8)2.3。
集群模式(RAC) (9)2。
4. 主从模式(DataGuard) (10)2.5。
混合模式(DataGrard+RAC) (10)2。
6。
数据库运行模式选择 (11)3。
系统特点和数据库类型 (11)3。
1。
业务系统的特点 (11)3。
1.1。
OLTP特点 (12)3.1.2。
OLAP特点 (13)3。
2。
数据库的规模 (13)3.3。
数据库版本建议 (13)4. 数据库运行环境规划 (14)4.1。
主机规划 (14)4。
2. 网络规划 (15)4.3. 存储规划 (17)5。
数据库安装部署规划 (19)5.1。
软件安装路径 (19)5。
2. 表空间设计 (19)5.2.1. 业务数据量估算 (19)5。
2。
2。
表空间使用规则 (21)5.2.3。
表空间的概念和分配原则 (25)5。
2.4。
表空间的参数配置 (26)5.2。
5. Undo/temp表空间的估算 (30)5.2。
6. 表的参数设置 (30)5.2。
7. 索引的使用原则 (31)5。
3. 文件设计 (32)5.3。
1. RAC配置文件 (32)5.3。
2. 参数文件 (33)5。
3。
3. 控制文件 (34)5。
3.4。
重做日志文件 (35)6。
数据库应用规划 (37)6。
1。
数据库用户设计 (37)6。
1。
1。
用户权限规划 (37)6.1.2。
用户安全实现 (39)6。
1。
3. 用户类型及角色命名规范 (41)6.2. 数据库分区 (44)6.2。
1. 数据库分区介绍 (44)6。
2.3. 物理分割 (45)6。
2。
4. 数据分区的优点 (45)6.2.5. 数据分区的不足 (45)6.2。
触发器的创建和使用.ppt

④
10.2 创建触发器
10.2.2 使用SSMS来创建DML触发器
打开“新建触发器”模板窗口;
使用“查询”->“指定模板参数的值”,打开“替 换模板参数工具”,设置参数的具体值。
应用举例:
10.2 创建触发器
10.2.2 使用SSMS来创建DML触发器
例10-2-1 创建一个INSERT触发器 “TR_Stu_Insert”,当在T_STUDENT表中插入一条 新记录时,触发该触发器,并给出“你插入了一条 新记录!”的提示信息。 例10-2-2 创建一个TR_KC_NOTD触发器,当在 T_COURSE表中删除一条纪录时,触发该触发器,并 给出“不允许删除纪录!”的提示信息。 注意: 比较AFTER和INSTEAD OF触发器的执行顺序。
定义位置:数据表或视图 在每个数据表或视图上只能定义一个INSTEAD OF触 发器。
10.1 概述
10.1.4 特殊的临时表 插入表Inserted和删除表Deleted
这两个表动态驻留在内存中,不是存储在数据库中, 由系统管理,表的结构总是与被定义了触发器的表 相同。 主要保存因用户操作而被影响到的原数据值或新数 据值,用户只能引用表中的数据,不能对其修改。 当触发器工作完成后,这两个表的数据也被删除。
10.1 概述
10.1.3 触发器的类型
在SQL Server2005中触发器分为:
(二)DML触发器 在用户使用数据操作语言(DML)事件编辑数据时发 生。 DML事件是针对表或视图的INSERT、UPDATE 或 DELETE三种操作。 DML触发器有助于在表或视图中修改数据时强制业 务规则,扩展数据完整性。
10.1 概述
Oracle数据库应用 复习题及答案

Oracle数据库应用复习题(参考答案见P15)一、选择题1、以下()内存区不属于SGA。
A. PGAB. 日志缓冲区C. 数据缓冲区D. 共享池2、一个数据库由若干个()组成。
A.段B. 表空间C. 块D. 区3、在Oracle 中创建用户时,若未使用DEFAULT TABLESPACE 关键字,则Oracle就将()表空间分配给用户作为默认表空间,将()表空间分配给用户作为临时表空间。
A.TEMPB. USERSC. SYSTEMD. EXAMPLE4、监听并接受来自客户端应用程序连接请求的服务是()。
A. OracleCSServiceB. OracleDBConsoleSIDC. OracleJobSchedulerD. OracleOraDb10g_home1TNSListener5、()是一个小二进制文件,它维护着数据库的全局物理结构,用以支持数据库成功地启动和运行。
A. 数据文件B. 控制文件C. 日志文件D. 参数文件6、()进程把修改过的数据块从内存写回到数据库的数据文件中。
A. DBWRB. LGWRC. CKPTD. SMON7、()的任务是将已经写满的联机日志文件复制到归档日志文件中。
这仅在数据库运行在归档模式下时才发生。
A.恢复进程B. 进程监视进程C. 作业队列D. 归档进程8、()数据库应用架构又称为“瘦客户机”模式。
A. 多磁盘结构B. 两层模式C. 三层模式D. 磁盘映像9、数据字典表保存表、索引、视图以及所有其他数据结构的信息。
它们属于()用户。
A. SYSB. SYSTEMC. SCOTTD. SYSMAN10、如果用户要安装、查看和卸载Oracle 数据库系统,就需要使用()。
A. 通用安装器B. 数据库配置助手C. 企业管理器D. 网络配置助手11、如果用户需要在安装好Oracle的系统上创建、修改和删除数据库,就需要使用()。
A. 通用安装器B. 数据库配置助手C. 企业管理器D. 网络配置助手12、要删除一个大表里的所有记录,并释放占用的表空间,可以使用()命令。
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触发器操作

AS
SELECT * FROM Users
WHERE u_Name='amy';
教
(2)创建行级触发器
师
CREATE OR REPLACE TRIGGER tr_DeleteUser2 AFTER DELETE
2020/10/15 Or acle 数 据库 管理 与 应用 实例 教 程
课堂案例2—使用PL/SQL管理触发器
案例完成步骤-创建触发器
添加标 【例2-4】通过临时表将Users表中删除的记录进行临时保存(行级触发器)。
(1)创建行级触发器的测试表 CREATE TABLE userdel
题文字
建议课时:8课时
2020/10/15 Or acle 数 据库 管理 与 应用 实例 教 程
9.1 触发器概述
触发器简介 触发器是一种特殊的存储过程,它与数据表紧密联系,用于保护表中的 数据,当一个定义了特定类型触发器的基表执行插入、修改或删除表中 数据的操作时,将自动触发触发器中定义的操作,以实现数据的一致性 和完整性。 触发器拥有比数据库本身标准的功能更精细和更复杂的数据控制能力。 触发器具有以下的作用: (1)在安全性方面,触发器可以基于数据库的值使用户具有操作数据 库的某种权利。 (2)在审计方面,触发器可以跟踪用户对数据库的操作。 (3)实现复杂的数据完整性规则。 (4)实现复杂的非标准的数据库相关完整性规则。触发器可以对数据 库中相关的表进行连环更新。 (5)同步实时地复制表中的数据。 (6)自动计算数据值,如果数据的值达到了一定的要求,则进行特定 的处理。例如,如果商品的数量低于5,则立即给管理人员发送库存报 警信息。
教
WHO VARCHAR2(30),
师
触发器ppt课件
编写触发器代码
选择编程语言
选择适当的编程语言,例如 JavaScript、Python或C#,以便
根据需要编写触发器代码。
编写代码逻辑
根据触发器的目标和条件,编写适 当的代码逻辑以实现所需的功能或 操作。
调试和测试代码
在编写完代码后,进行调试和测试 以确保其正常工作并实现所需的功 能。
测试触发器
感谢您的观看
THANKS
案例一:使用触发器实现数据库审计
3. 触发器执行计划
为触发器制定执行计划,确保触发器能够在数据操作发生时立即执行。
4. 触发器测试
测试触发器的功能和性能,确保其正常工作并记录所有操作。
案例一:使用触发器实现数据库审计
注意事项
1. 考虑性能影响:由于触发器是在每个操作发生时自动执行的,因此可能会对数据库性能产 生一定影响。
与事件比较
事件触发器是一种特殊类型的触发器,它与事件相关联,在 事件发生时自动触发执行。
事件是指数据库中的某种状态变化,例如数据的插入、更新 或删除。事件触发器可以根据事件类型和条件来定义触发执 行的操作。与普通触发器不同,事件触发器更加关注实时性 和事件响应的及时性。
与工作流比较
分工合作
工作流和触发器是两种不同类型的自动化机制。工作流通常用于定义业务流程和任务之间的流转关系 ,而触发器则用于在特定事件或条件下触发自动执行的操作。两者在分工合作方面具有明显的差异, 但可以相互配合实现更复杂的业务逻辑。
3
Байду номын сангаас
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 触发器(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 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。
触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。
OracleTNS314协议分析——2、基础包结构
OracleTNS314协议分析——2、基础包结构TNS包头格式每个数据都包含⼀个通⽤包头,包含数据的长度、校验和解析信息Packet Header8通⽤包头Data可变数据Packet HeaderLength2包的长度,包括通⽤包头Packet check sum2包的校验和PacketType1包类型Reserved1保留Header check sum2通⽤头的校验和Packet TypesCONNECT 1连接ACCEPT 2连接接受ACK 3REFUSE 4拒绝连接REDIRECT 5重定向DATA 6数据包,⼤多数包属于此包,包含SQL命令及返回等NULL DATA7空ABORT 9RESEND 11重发MARKER 12提⽰错误等ATTENTION 13CONTROL 14MAX 19通⽤包头解析⽰例通⽤包头解析代码⽰例local pktLen=string.unpack(">I2",lengthdata)local data,err=reqsock:receive(pktLen-2)if(err) thenngx.log(ngx.ERR,"err when reading packet")breakendngx.log(ngx.DEBUG,"data"..data:hex())local pktType=string.unpack(">B",data,3)PacketType 0x06 Data包格式客户端与服务端除建⽴和断开连接外,基本上全部使⽤Data包进⾏交互,包括设置协议参数、认证、SQL请求与返回等,此包内部⼜有很多类型和⼦类型,不同类型和⼦类型差异较⼤,基础格式如下Data flag2状态Command packet可变命令包………Command packet可变命令包DataFlagDataFlag⼀般为0x0000,DATA结束时为0x0040,其他情况少见,详细见下表Send token0x0001Request Confirmation0x0002Confirmation0x0004Reserved0x0008UNKNOWN0x0010More Data to Come0x0020End of File0x0040data传输结束时可见Do Immediate Confirmation0x0080Request to send0x0100Request Nt Trailer0x0200Command PacketCommand Packet可以有多个,每个CommandPacket也有⾃⼰的类型DataID,有的DataID还有⾃⼰的⼦功能号叫做CallID,DataID类型除特殊的SetProtocol和Network等包外,⼀般请求包包含⼀个序号字节,⽽返回值没有这个序号DataID1Command 功能CallID1⼦功能,此字段可选,有些DataID⽆CallIDSeq1序号(返回包⽆此序列号)DataIDSET_PROTOCOL1连接后设置协议参数SET_DATATYPES2连接后设置数据格式等USER_OCI_FUNC3调⽤OCI函数,有⼦类型,传输sql命令等⽤此RETURN_STATUS4返回状态,也有⼦命令ACCESS_USR_ADDR5ROW_TRANSF_HEADER6SQL命令返回具体数据ROW_TRANSF_DATA7RETURN_OPI_PARAM 8常见不需要返回数据的命令请求返回如Insert,后续OCI_RESPONDFUNCCOMPLETE9NERROR_RET_DEF10IOVEC_4FAST_UPI11常见不需要返回数据的命令请求返回,后续OCI_RESPONDLONG_4FAST_UPI12INVOKE_USER_CB13LOB_FILE_DF14WARNING15DESCRIBE_INFO16常见在sql请求后返回⼀些描述信息,⽐如列名PIGGYBACK_FUNC17有⼦命令,常后续OCI_FUN_CALL,后续OCI_FUN_CALL携带真实命令SIG_4UCS18FLUSH_BIND_DATA19OCI_RESPOND23⼀般⽤于返回信息,基本所有USER_OCI_FUNC的返回都会包含此包,此包最后⼀般有服务端返回客户端的⽂字消息,(312协议未见)SNS0xdeadbeef额外安全⽹络协议交换XTRN_PROCSERV_R132XTRN_PROCSERV_R268USER_OCI_FUNCDataID 为3时为USER_OCI_FUNC,SQL的执⾏基本是通过此命令完成,此命令有⼦命令,具体取值如下(参见wireshark tns desector)1 Logon to Oracle41 Parse for syntax and SQL Dictionary lookup81 2nd Half of Logon2 Open Cursor42 Continue serving after EOF82 1st Half of Logon3 Parse a Row43 Array describe83 Do Streaming Operation4 Execute a Row44 Init sys pars command table84 Open Session (71 interface)5 Fetch a Row45 Finalize sys pars command table85 X/Open XA operations (71 interface)8 Close Cursor46 Put sys par in command table86 Debugging operations8 Close Cursor46 Put sys par in command table86 Debugging operations9 Logoff of Oracle47 Get sys pars from command table87 Special debugging operations10 Describe a select list column48 Start Oracle (V6)88 XA Start11 Define where the columngoes49 Shutdown Oracle (V6)89 XA Switch and Commit12 Auto commit on50 Run Independent Process (V6)90 Direct copy from db buffers to client address13 Auto commit off51 Test RAM (V6)91 OKOD Call (In Oracle <= 7 this used to be Connect14 Commit52 Archive operation (V6)93 RPI Callback with ctxdef15 Rollback53 Media Recovery - start (V6)94 Bundled execution call (V7)16 Set fatal error options54 Media Recovery - record tablespace to recover(V6)95 Do Streaming Operation without begintxn17 Resume current operation55 Media Recovery - get starting log seq # (V6)96 LOB and FILE related calls18 Get Oracle version-date string56 Media Recovery - recover using offline log (V6)97 File Create call19 Until we get rid of OASQL57 Media Recovery - cancel media recovery (V6)98 Describe query (V8) call20 Cancel the current operation58 Logon to Oracle (V6)99 Connect (non-blocking attach host)21 Get error message59 Get Oracle version-date string in new format100 Open a recursive cursor22 Exit Oracle command60 Initialize Oracle101 Bundled KPR Execution23 Special function61 Reserved for MAC; close all cursors102 Bundled PL/SQL execution24 Abort62 Bundled execution call103 Transaction start attach detach25 Dequeue by RowID65 For direct loader: functions104 Transaction commit rollback recover26 Fetch a long column value66 For direct loader: buffer transfer105 Cursor close all27 Create Access Module67 Distrib. trans. mgr. RPC106 Failover into piggyback28 Save Access ModuleStatement68 Describe indexes for distributed query107 Session switching piggyback (V8)29 Save Access Module69 Session operations108 Do Dummy Defines30 Parse Access ModuleStatement70Execute using synchronized system commitnumbers109 Init sys pars (V8)31 How many items?71 Fast UPI calls to OPIAL7110 Finalize sys pars (V8)32 Initialize Oracle72 Long Fetch (V7)111 Put sys par in par space (V8)33 Change User ID73 Call OPIEXE from OPIALL: no two-task access112 Terminate sys pars (V8)34 Bind by reference positional74 Parse Call (V7) to deal with various flavours114 Init Untrusted Callbacks35 Get n'th Bind Variable76 RPC call from PL/SQL115 Generic authentication call36 Get n'th Into Variable77 Do a KGL operation116 FailOver Get Instance call37 Bind by reference78 Execute and Fetch117 Oracle Transaction service Commit remote sites38 Bind by reference numeric79 X/Open XA operation118 Get the session key39 Parse and Execute80 New KGL operation call119 Describe any (V8)40 Parse for syntax (only)120 Cancel All其他⼀些DataID 与CallID组合(摘抄⾃《ORACLE协议分析》)DataID CalID类型说明使⽤0x010x05请求CLIENT TYPE0x010x06Set Protocol0x010x2c IDENT0x020x00RESET0x020x01CHAR_MAP0x020x540x030x010x030x02SQL_OPEN0x030x03QUERY0x030x04QUERY SECOND0x030x05FETCH MORE0x030x080x030x09DISCONNECT0x030x0E0x030x27SET_LANG0x030x27SET_LANG0x030x2B DESC_COLS0x030x3B DB VERSION0x030x47FETCH0x030x51Set password0x030x52Set user0x030x54HANDSHAKE40x030x5E SQL0x030x73AUTH20x030x76AUTH10x030x77查询表结构信息DESC0x040x01ACK0x040x02ACK0x040x05ACK0x060x00More Row Result Info0x060x01First Row Result Info0x080x010x080x050x080x080x080x9c Db version0x100x19Field Info SELEC返回0x110x690x110x6b0x110x78Data包中常见的数据结构及解析变长字符串变长字符串⽤⼀个前序⼀个字节长度标志的序列来表⽰Data Length1返回列数Data Data Length⽐如:05 73 63 6f 74 7405标识字符串长度后⾯的字符串内容为ASCII码,表⽰scott变长字符串数组变长字符串数字开头为fe,具体格式如下Big Data Identify10xfeData Length1Data Data Length………Data Length1Data Data LengthEnd Mark1⽰例数字格式(参《ORACLE协议分析》未完全验证)正数Id1C0+整数部分长度整数部分Intlength=Id-c0⼩数部分DecLength=length-intlength-1⼩数部分DecLength=length-intlength-1注:1. 数据的第⼀位标志整数部分长度2. 整数部分长度+⼩数部分长度=数据总长度-13. 整数部分从后向前每两位(代表0到100)⽤⼀个字节(⼗六进制)表⽰,且为⼗六进制值-14. ⼩数部分从后向前每两位(代表0到100)⽤⼀个字节(⼗六进制)表⽰,且为⼗六进制值-15. 如果没有⼩数部分,Intlength+1〉length(为数字长度),则后⾯有(Intlength+1-length)位(只传输位)值为0的数据没有传输负数Id13f-整数部分长度整数部分Intlength=3f-id⼩数部分DecLength=length-intlength-1Magic10x661. 数据的第⼀位标志整数部分长度2. 整数部分长度+⼩数部分长度=数据总长度-23. 整数部分从后向前每两位(代表0到100)⽤⼀个字节(⼗六进制)表⽰,且为101-⼗六进制值4. ⼩数部分从后向前每两位(代表0到100)⽤⼀个字节(⼗六进制)表⽰,且为101-⼗六进制值5. 如果没有⼩数部分,Intlength+2〉length(为数字长度),则后⾯有(Intlength+2-length)位(只传输位)值为0的数据没有传输⽇期格式(参《ORACLE协议分析》未完全验证)Year11Year1-100Year21Year2-100Month1MonthDay1DayHour1Hour-1Minute1Minute-1Second1Second-1注:1. Year1为年前两位,值为year1-1002. Year2为年后两位,值为year2-1003. Month为⽉,值为month4. Day为⽉,值为Day5. Hour为⽉,值为Hour-16. Minute为⽉,值为Minute-17. Second为⽉,值为Second-1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
变量 过程B主体定义 过程A主题定义 变量 包体 BEGIN … END; Private
包的创建与执行过程
spec.sql 1 编辑 2 载入 3 创建 (编译和存数 编译和存数) 编译和存数 body.sql 说明 4 执行 使用 SHOW ERRORS 调试错误 主体
CREATE OR REPLACE TRIGGER logon_trig AFTER LOGON ON SCHEMA BEGIN INSERT INTO log_trig_table(user_id,log_date,action) VALUES (USER, SYSDATE, 'Logging on'); END; / CREATE OR REPLACE TRIGGER logoff_trig BEFORE LOGOFF ON SCHEMA BEGIN INSERT INTO log_trig_table(user_id,log_date,action) VALUES (USER, SYSDATE, 'Logging off'); END; /
正常情况下,用户不能向多表连接的复杂视图中 插入数据,也不能修改或删除这类视图中的数据 当用户发出一个基于复杂视图的DML语句时触发
创建(用户事件)DDL触发器
CREATE [OR REPLACE] TRIGGER trigger_name Timing [ddl_event1 [OR ddl_event2 OR ...]] ON {DATABASE|SCHEMA} trigger_body CREATE OR REPLACE TRIGGER log_drop_trigger BEFORE DROP ON donny.schema BEGIN INSERT INTO droped_objects values( ora_dict_obj_name, -- 与触发器相关的函数 ora_dict_obj_type, SYSDATE); END; /
默认是语义级
相关限制
只能在自己创建的表上创建触发器 必须具有CREATE TRIGGER系统权限 不能在触发器中使用COMMIT语句
行级触发器的语法
WHEN (条件表达式):
是可选的 指明符合触发器执行的行所需要满足的条件
引用域的旧值和新值:
:OLD.字段名 :OLD. :NEW.字段名
INSTEAD-OF触发器
禁用和删除触发器
删除触发器:
DROP TRIGGER trigger_name;
禁用或启用触发器:
ALTER TRIGGER trigger_name [ENABLE | DISABLE];
小结
在本课中,您应该学会使用触发器: 会创建包 知道如何使用包 触发器的用途 创建各种类型的触发器 触发器的使用限制 INSTEAD-OF触发器
INSTEAD OF 触发器 用户事件触发器 系统条件触发器
触发器的用途
确保相关的操作同时完成: 卖出一件商品,修改其库存 创建类似于审计用的表记录: 记录是谁修改了学生的等级以及什么时 候作的修改
创建数据库DML触发器
代码类似于PL/SQL程序块 数据库触发器不能接受参数 定义触发器,必须指明:
重载 多个程序单元具有相同的名称,但接收不 同数据和类型的参数 允许用户使用相同的命令,通过提供不同 的参数,完成不同的调用请求
数据库触发器
触发器是特定事件出现的时候,自动执行 的代码块。类似于存储过程,存储过程是 由用户或应用程序显示调用的。而触发器 不能直接调用。 触发器的分类:
DML触发器
语义级触发器 行级触发器
创建系统触事件发器
语法:
CREATE [OR REPLACE] TRIGGER trigger_name timing [database_event1 [OR database_event2 OR ...]] ON {DATABASE|SCHEMA} trigger:举例
在SQL*Plus中创建包的定义
CREATE OR REPLACE PACKAGE package_name IS --public variables variable_name datatype; --program units PROCEDURE procedure_name (parameter_list); FUNCTION function_name (parameter_list); END; CREATE OR REPLACE PACKAGE BODY package_name IS private variable declarations program unit blocks END; 创建包规范
行级触发器:对于语句所涉及到的每一行都 执行触发器代码
例如:对于每一件卖出的商品(一件商品对应 表中的一行)都要修改其库存
语句级触发器:不管语句涉及到多少行,触 发器代码只执行一次
例如:对于审计信息,只关心是谁修改了表中 的数据,而不关心他修改了多少数据
创建触发器
CREATE OR REPLACE TRIGGER trigger_name [BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON table_name [FOR EACH ROW] [WHEN (condition)] BEGIN trigger body END;
触发器触发的事件语句
INSERT,UPDATE,DELETE
触发时机
事前触发还是事后触发
触发等级
语句级还是行级
触发器的时序
事前触发:触发器代码在语句执行前先执 行
例如:对于审计信息,在信息被修改之前 先把它记录下来
事后触发:触发器代码在语句执行后才执 行
例如:在商品卖出后再修改其库存
触发器的级别
包和库的区别
库必须要显式地链接到应用程序中去,而 包是随时可以被调用的 库总是运行在客户端 包总是运行在服务器端
包的组成
定义部分:
用于声明所有的公共变量,游标,过程和函数
包体部分:
过程和函数的代码
基本原理:
定义部分对用户是可见的,说明如何使用包 包体部分是不可见的,用户不会关心具体的代码
包的组成
创建包和触发器
目标
在本课中您将学会以下内容: 创建包 使用包 触发器的用途 创建各种类型的触发器 触发器的使用限制 INSTEAD-OF触发器
包
存储在服务器端的程序库 包含:
全局变量的声明 游标的定义 过程 函数
包分为:系统内置的包和用户自定 义的包
Oracle提供的内置包
DBMS_ALERT DBMS_LOCK DBMS_SESSION DBMS_OUTPUT HTP UTL_FILE UTL_MAIL DBMS_SCHEDULER
创建包体
在SQL*Plus中创建包的定义
在SQL*Plus中创建包
调用包中的程序单元
在过程名前加上其所在的包和名称
PACKAGE_NAME.program_unit_name(parameter_list);
例如:
DBMS_OUTPUT.PUT_LINE(‘Hello World’);
程序的重载