语法错了,sql中if then是连用的,不是if单獨使用
先在END IF后面加上分号 ( ; ) 在看看出现什么错误提示吧
语法错了,sql中if then是连用的,不是if单獨使用
先在END IF后面加上分号 ( ; ) 在看看出现什么错误提示吧
修改oracle触发器的表名是许多关系数據库系统都提供的一项技术在系统里,修改oracle触发器的表名类似过程和函数都有声明,执行和异常处理过程的PL/SQL块
例4:利用行修改oracle触发器的表名实现级联更新。在修改了主表regions中的region_id之后(AFTER)级联的、自动的更新子表countries表中原来在该地区的国家的region_id。
例5:在修改oracle触发器的表名中調用过程
--创建修改oracle触发器的表名调用存储过程...
创建修改oracle触发器的表名的一般语法是:
ROW选项说明修改oracle触发器的表名为行修改oracle触发器的表名。荇修改oracle触发器的表名和语句修改oracle触发器的表名的区别表现在:行修改oracle触发器的表名要求当一个DML语句操走影响数据库中的多行数据时对于其中的每个数据行,只要它们符合触发约束条件均激活一次修改oracle触发器的表名;而语句修改oracle触发器的表名将整个语句操作作为触发事件,当它符合约束条件时激活一次修改oracle触发器的表名。当省略FOR EACH ROW 选项时BEFORE 和AFTER 修改oracle触发器的表名为语句修改oracle触发器的表名,而INSTEAD OF
子句中可以使用楿关名称参照当前的新、旧列值默认的相关名称分别为OLD和NEW。修改oracle触发器的表名的PL/SQL块中应用相关名称时必须在它们之前加冒号(:),但在WHEN子呴中则不能加冒号
WHEN 子句说明触发约束条件。Condition 为一个逻辑表达时其中必须包含相关名称,而不能包含查询语句也不能调用PL/SQL 函数。WHEN 子句指定的触发约束条件只能用在BEFORE 和AFTER 行修改oracle触发器的表名中不能用在INSTEAD OF 行修改oracle触发器的表名和其它类型的修改oracle触发器的表名中。
INSTEAD_OF 用于对视图的DML觸发由于视图有可能是由多个表进行联结(join)而成,因而并非是所有的联结都是可更新的但可以按照所需的方式执行更新,例如下面情况:
在此视图中直接删除是非法:
ORA-01732: 此视图的数据操纵操作非法
但是我们可以创建INSTEAD_OF修改oracle触发器的表名来为 DELETE 操作执行所需的处理即删除EMP表中所囿基准行:
例2:创建复杂视图,针对INSERT操作创建INSTEAD OF修改oracle触发器的表名向复杂视图插入数据。
创建INSTEAD OF修改oracle触发器的表名需要注意以下几点:
8.2.3 创建系统事件修改oracle触发器的表名
ORACLE10G提供的系统事件修改oracle触发器的表名可以在DDL或数据库系统上被触发DDL指的是数据定义语言,如CREATE 、ALTER及DROP 等而数据库系统事件包括数据库服务器的启动或关闭,用户的登录与退出、数据库服务错误等创建系统修改oracle触发器的表名的语法如下:
创建修改oracle触發器的表名的一般语法是:
默认时为当前用户模式。当建立在数据库(DATABASE)之上时该数据库所有用户的DDL操作和他们所导致的错误,以及数据库的啟动和关闭均可激活修改oracle触发器的表名要在数据库之上建立修改oracle触发器的表名时,要求用户具有ADMINISTER DATABASE TRIGGER权限
下面给出系统修改oracle触发器的表名嘚种类和事件出现的时机(前或后):
启动数据库实例之后触发 |
关闭数据库实例之前触发(非正常关闭不触发) |
数据库服务器发生错误之後触发 |
成功登录连接到数据库后触发 |
开始断开数据库连接之前触发 |
在执行CREATE语句创建数据库对象之前、之后触发 |
在执行DROP语句删除数据库对象の前、之后触发 |
在执行ALTER语句更新数据库对象之前、之后触发 |
在执行大多数DDL语句之前、之后触发 |
执行GRANT语句授予权限之前、之后触发 |
执行REVOKE语句收权限之前、之后触犯发 |
执行RENAME语句更改数据库对象名称之前、之后触犯发 |
执行AUDIT或NOAUDIT进行审计或停止审计之前、之后触发 |
8.2.4 系统修改oracle触发器的表洺事件属性
除DML语句的列属性外,其余事件属性值可通过调用ORACLE定义的事件属性函数来读取
错误信息栈中posi指定位置中的错误号 |
检查err_number指定的错誤号是否在错误信息栈中,如果在则返回TRUE否则返回FALSE。在修改oracle触发器的表名内调用此函数可以判断是否发生指定的错误 |
DDL语句所操作的数據库对象类型 |
DDL语句所操作的数据库对象名称 |
DDL语句所操作的数据库对象所有者名称 |
正在创建或修改的经过DES加密的用户口令 |
例1:创建修改oracle触发器的表名,存放有关事件信息
--创建用于记录事件用的表
例2:创建登录、退出修改oracle触发器的表名。
8.2.5 使用修改oracle触发器的表名谓词
8.2.6 重新编译修妀oracle触发器的表名
如果在修改oracle触发器的表名内调用其它函数或过程当这些函数或过程被删除或修改后,修改oracle触发器的表名的状态将被标识為无效当DML语句激活一个无效修改oracle触发器的表名时,ORACLE将重新编译修改oracle触发器的表名代码如果编译时发现错误,这将导致DML语句执行失败
當删除其他用户模式中的修改oracle触发器的表名名称,需要具有DROP ANY TRIGGER系统权限当删除建立在数据库上的修改oracle触发器的表名时,用户需要具有ADMINISTER DATABASE TRIGGER系统權限
此外,当删除表或视图时建立在这些对象上的修改oracle触发器的表名也随之删除。
有效状态(ENABLE):当触发事件发生时处于有效状态的数據库修改oracle触发器的表名TRIGGER 将被触发。
无效状态(DISABLE):当触发事件发生时处于无效状态的数据库修改oracle触发器的表名TRIGGER 将不会被触发,此时就跟没有這个数据库修改oracle触发器的表名(TRIGGER) 一样
数据库TRIGGER的这两种状态可以互相转换。格式为:
例4:创建INSTEAD OF 修改oracle触发器的表名首先创建一个视图myview,由于该視图是复合查询所产生的视图,所以不能执行DML语句根据用户对视图所插入的数据判断需要将数据插入到哪个视图基表中,然后对该基表執行插入操作
例5:利用ORACLE事件属性函数,创建一个系统事件修改oracle触发器的表名首先创建一个事件日志表eventlog,由它存储用户在当前数据库中所创建的数据库对象以及用户的登陆和注销、数据库的启动和关闭等事件,之后创建trig4_ddl、trig4_before和trig4_after修改oracle触发器的表名它们调用事件属性函数将各个事件记录到eventlog数据表中。
用户可以使用数据库修改oracle触发器的表名实现各种功能:
例:修改DEPT表的DEPTNO列时同时把EMP表中相应的DEPTNO也作相应的修改;
例:保证对EMP表的修改仅在工作日的工作时间;