oracle中创建触发器
现有A、B两张表
A: 工号 姓名 密码 性别 年龄 。。。
B: 工号 姓名 密码
创建触发器:代码如下:
create or replace trigger trg_a
before update of 密码 on A
for each row
begin
update B set 密码=:new.密码 where 工号=:new.工号 and 姓名=:new.姓名;
end;
CREATE OR REPLACE TRIGGER tr_a
AFTER UPDATE ON a
FOR EACH ROW
BEGIN
IF updating('密码') THEN
UPDATE b SET b.密码 = :new.密码 WHERE b.工号 = :new.工号;
END IF;
END;
-----------------------------------------
CREATE OR REPLACE TRIGGER tr_a
AFTER UPDATE of 密码 ON a --建立在列上面的触发器
FOR EACH ROW
BEGIN
UPDATE b SET b.密码 = :new.密码 WHERE b.工号 = :new.工号;
END;
这个虽然简单但是不接触时就感觉很难,没办法下手。注意学习oracle中创建触发器的语法。
下面为从网上找的关于触发器语法的学习总结一下:
触发器
1、 允许/限制对表的修改
2、 自动生成派生列,比如自增字段
3、 强制数据一致性
4、 提供审计和日志记录
5、 防止无效的事务处理
6、 启用复杂的业务逻辑
create trigger biufer_employees_department_id
before insert or update
of department_id
on employees
referencing old as old_value
new as new_value
for each row
when (new_value.department_id<>80 )
begin
:new_value.commission_pct :=0;
end;
/
1、 触发器名称
2、 触发语句
3、 触发器限制
4、 触发操作
create trigger biufer_employees_department_id
命名习惯:
biufer(before insert update for each row)
employees 表名
department_id 列名
比如:
表或视图上的dml语句
ddl语句
数据库关闭或启动,startup shutdown 等等
before insert or update
of department_id
on employees
referencing old as old_value
new as new_value
for each row
1、 无论是否规定了department_id ,对employees表进行insert的时候
2、 对employees表的department_id列进行update的时候
when (new_value.department_id<>80 )
其中的new_value是代表跟新之后的值。
是触发器的主体
begin
:new_value.commission_pct :=0;
end;
insert into employees(employee_id,
last_name,first_name,hire_date,job_id,email,department_id,salary,commission_pct )
values( 12345,’chen’,’donny’, sysdate, 12, ‘donny@hotmail.com’,60,10000,.25);
触发器类型:
1、 语句触发器
2、 行触发器
3、 instead of 触发器
4、 系统条件触发器
5、 用户事件触发器
是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。能够与insert、update、delete或者组合上进行关联。但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次。比如,无论update多少行,也只会调用一次update语句触发器。
需要对在表上进行dml操作的用户进行安全检查,看是否具有合适的特权。
create table foo(a number);
before insert or update or delete
on foo
begin
if user not in (‘donny’) then
raise_application_error(-20001, ‘you don’t have access to modify this table.’);
end if;
end;
/
对修改表的时间、人物进行日志记录。
create table employees_copy as select *from hr.employees
create table employees_log(
who varchar2(30),
when date);
create or replace trigger biud_employee_copy
before insert or update or delete
on employees_copy
begin
insert into employees_log(
who,when)
values( user, sysdate);
end;
/
4、 测试
update employees_copy set salary= salary*1.1;
即是insert/update/delete中的哪一个触发了触发器?
可以在触发器中使用inserting / updating / deleting 条件谓词,作判断:
begin
if inserting then
-----
elsif updating then
-----
elsif deleting then
------
end if;
end;
------
end if;
1、 修改日志表
alter table employees_log
add (action varchar2(20));
create or replace trigger biud_employee_copy
before insert or update or delete
on employees_copy
declare
l_action employees_log.action%type;
begin
if inserting then
l_action:=’insert’;
elsif updating then
l_action:=’update’;
elsif deleting then
l_action:=’delete’;
else
raise_application_error(-20001,’you should never ever get this error.’);
who,action,when)
values( user, l_action,sysdate);
end;
/
insert into employees_copy( employee_id, last_name, email, hire_date, job_id)
values(12345,’chen’,’donny@hotmail’,sysdate,12);
是指为受到影响的各个行激活的触发器,定义与语句触发器类似,有以下两个例外:
1、 定义语句中包含for each row子句
2、 在before……for each row触发器中,用户可以引用受到影响的行值。
比如:
create trigger biufer_employees_department_id
before insert or update
of department_id
on employees_copy
referencing old as old_value
new as new_value
for each row
when (new_value.department_id<>80 )
begin
:new_value.commission_pct :=0;
end;
/
执行dml语句之前的值的默认名称是 :old ,之后的值是 :new
insert 操作只有:new
delete 操作只有 :old
update 操作两者都有
作用不很大。
create table foo(id number, data varchar2(20));
create sequence foo_seq;
before insert on foo
for each row
begin
select foo_seq.nextval into :new.id from dual;
end;
/
insert into foo values(5,’chen’);
select * from foo;
select first_name||’, ’||last_name name, email, phone_number,
employee_id emp_id
from hr.employees;
update hr.company_phone_book
set name=’chen1, donny1’
where emp_id=100
instead of
update on hr.company_phone_book
begin
update hr.employees
set employee_id=:new.emp_id,
first_name=substr(:new.name, instr(:new.name,’,’)+2),
last_name= substr(:new.name,1,instr(:new.name,’,’)-1),
phone_number=:new.phone_number,
email=:new.email
where employee_id=:old.emp_id;
end;
系统事件:数据库启动、关闭,服务器错误
after startup
on database
begin
-- do some stuff
end;
/
5、 用户事件触发器
用户事件:用户登陆、注销,create / alter / drop / analyze / audit / grant / revoke / rename / truncate / logoff
create table droped_objects(
object_name varchar2(30),
object_type varchar2(30),
dropped_on date);
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;
/
3. 测试
create table drop_me(a number);
create view drop_me_view as select *from drop_me;
drop view drop_me_view;
drop table drop_me;
禁用和启用触发器
alter trigger <trigger_name> disable;
alter trigger <trigger_name> enable;
在触发器中,不能使用commit / rollback
因为ddl语句具有隐式的commit,所以也不允许使用
dba_triggers
发表评语»»»
oracle没有sqlserver那种机制,只能对字段进行比较判断是否更新
create or replace trigger tri_t
before update on t for each row
when (new.bb<>old.bb)--比较BB字段是否更新
begin
:new.cc:=1;
end;
/
2008-3-20 22:58:30 ORACLE触发器语法
ORACLE触发器语法
触发器有两种after和before,区别在于每次提交事务触发一次和每一行数据的更新都触发一次,使用时候要注意,以免达不到目的
ORACLE产生数据库触发器的语法为:
转载于:https://blog.51cto.com/zhjjzhjj/577737
相关文章:
量子计算与AI“双拳”出击,他们锁定38种潜在抗疫药物
作者 | Just出品 | AI科技大本营(ID:rgznai100)医药研发行业有一个“三个十”的说法,即一种药物的发现需要投入十年以上的时间,花费十多亿美元,最后获得10%的成功率。也就是说,医药研发需要花费很长时间&am…

Android官方开发文档Training系列课程中文版:OpenGL绘图之应用投影与相机视图
原文地址:http://android.xsoftlab.net/training/graphics/opengl/projection.html##transform 在OpenGL ES环境中,投影相机View可以将所绘制的图形模拟成现实中所看到的物理性状。这种物理模拟是通过改变对象的数字坐标实现的: 投影 - 这基于…
Python分析101位《创造营2020》小姐姐,谁才是你心中的颜值担当?
来源 | CDA 数据分析师责编 | Carol Show me data,用数据说话。今天我们聊一聊《创造营2020》各个小姐姐,点击下方视频,先睹为快: 最近可以追的综艺真是太多了,特别是女团选秀节目。之前我们刚聊过《青春有你2》&…

体验Remix——安卓电脑
第一次听说Android-X86 以前玩唱吧的时候接触过PC上的安卓模拟器,不过这个只是一个软件,效果毕竟不好,想要把电脑变成安卓手机,还差远了。 然后,前段时间一直纠结要不要换个手机,我现在的华为小6已经跟我…

重置 microsoft visual studio窗口
“工具”->“导入导出设置”—>“重置所有设置”,在这个向导中可以重置编译环境的!转载于:https://www.cnblogs.com/qiantuwuliang/archive/2011/05/31/2064825.html

排序算法总结之堆排序
一,堆排序介绍 堆是一个优先级队列,对于大顶堆而言,堆顶元素的权值最大。将 待排序的数组 建堆,然后不断地删除堆顶元素,就实现了排序。关于堆,参考:数据结构--堆的实现之深入分析 下面的堆排序…

Hessian通信案例(java)
个人博客: 戳我,戳我 前言 由于工作的原因,接触到了hessain,项目需要做hessain和xml之间的报文转换。但是对于hessian是个什么东西一头雾水。于是接下来的时间了解了hessain协议的序列化规则以及hessian协议进行通信的方式。这篇文章是在完成了这个模块…

VDI序曲二十一 APP-V 4.6 SP1服务器端部署
APP-V是微软应用程序虚拟化除RemoteApp以外非常棒的另一种应用程序虚拟化,此应用程序虚拟化是把搭开应用程序消耗的资源放在前端,应用程序虚拟化主要解决的还是软件兼容性问题和保护软件资产问题,同时让用户无需安装就可以绿色使用的手段&…
绝悟之后再超神,腾讯30篇论文入选AI顶会ACL
作者 | 马超责编 | Carol出品| AI科技大本营(ID:rgznai100)封图 | CSDN 付费下载于东方 IC近日,国际计算语言学协会年会ACL在官网(https://www.aclweb.org)公布了2020年度的论文收录名单,其中腾讯共有30篇论文入选&…

mac中用命令行运行mysql
1,安装mysql 在mysql的官方网站下载 mysql 5.5.23 http://www.mysql.com/downloads/mysql/,根据我的机器的配置情况选择了64bit版本。 2,命令行中启动mysql 安装的位置在/usr/local/mysql 于是做了一个别名: $alias mysql/usr/loc…

Hessian源码分析(java)
个人博客: 戳我,戳我 先扯一扯 前一篇博文Hessian通信案例(java)简单实现了Java版的Hessian客户端和服务端的通信,总体看来,实现起来比较简单,整个基于Hessian的远程调用过程也显得很方便。但是知其然还要知其所以然&…
必读!53个Python经典面试题详解
作者 | Chris翻译 | 苏本如,编辑 | 夕颜题图 | 视觉中国出品 | AI科技大本营(ID:rgznai100)本文列出53个Python面试问题,并且提供了答案,供数科学家和软件工程师们参考。不久前,我作为“数据科学家”开始担…

Microsoft Web 平台安装程序 (Web PI) Microsoft Web Platform Installer
Microsoft Web 平台安装程序 3.0 (Web PI) 是一款免费的工具,使用它可以获得 Microsoft Web 平台的最新组件(包括 Internet Information Services (IIS)、SQL Server Express、.NET Framework 和 Visual Web Developer)。Web PI 的内置Window…

Linux Shell 脚本限制ssh最大用户登录数
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dgd2010.blog.51cto.com/1539422/1670233 我撰写本文原来的意图是想把“复制SSH渠道”和"copy SSH Session"这样的功能从远程s…

hessiancpp编译和使用(C++版)
个人博客:戳我,戳我 许下的承诺 前两篇博客Hessian通信案例(java)和Hessian源码分析(java)介绍了Java版的hessian的使用以及源码分析。当时也说过打算写一下C版的hessian的使用和源码分析,现在就是兑现承诺的时候了。其实我项目中实际用到的…
美国AI博士一针见血:Python这样学最容易成为高手!
我见过市面上很多的 Python 讲解教程和书籍,他们大都这样讲 Python 的:先从 Python 的发展历史开始,介绍 Python 的基本语法规则,Python 的 list, dict, tuple 等数据结构,然后再介绍字符串处理和正则表达式࿰…

win7操作系统在哪显示隐藏文件夹
win7操作系统在哪显示隐藏文件夹 打开计算机--组织--文件夹和搜索选项--查看--把 “隐藏受保护的操作系统文件”前面的钩去掉,选中“显示隐藏的文件、文件夹和驱动器”--确定

ASP.NET MVC4中调用WEB API的四个方法
当今的软件开发中,设计软件的服务并将其通过网络对外发布,让各种客户端去使用服务已经是十分普遍的做法。就.NET而言,目前提供了Remoting,WebService和WCF服务,这都能开发出功能十分强大的服务。然而,越来越多的互联网…

使用docker制作hexo镜像
个人博客:戳我,戳我 背景 这段时间一直在折腾我的博客,由于之前出现过一次电脑硬盘完全挂掉的情况,为了避免重新搭建博客系统,一直打算搞一个方便点的环境,能进行多机迁移之类的。正好,Docker完…
3D目标检测深度学习方法数据预处理综述
作者 | 蒋天元来源 | 3D视觉工坊(ID: QYong_2014)这一篇的内容主要要讲一点在深度学习的3D目标检测网络中,我们都采用了哪些数据预处理的方法,主要讲两个方面的知识,第一个是representation,第二个数据预处…

NTLM协议认证
第一篇blog,发现这是个记录学习过程的好地方。从基础的开始吧。 NTLM: 基本知识telnet的一种验证身份方式,即Windows NT LAN Manager (NTLM); NTLM 是为没有加入到域中的计算机(如独立服务器和工作组)提供的…

新盒模型移动端的排版
这里采用的是新盒模型来进行排版: <div class"mytest"> <header></header> <section></section> <footer></footer> </div> 在CSS样式里添加如下样式 html,body{ height: 100%; } .mytest{ …

微信跳一跳高分辅助踩坑
旧博文,搬到 csdn 原文:http://rebootcat.com/2018/01/08/wechat_jump_hack/ 最近挺火的微信跳一跳 最近新版微信的『跳一跳』小程序着实火了一把,也把小程序这个概念再次推波助澜了一波,看来以后小程序这个入口会有大作为。 张小…
“编程能力差,90%的人会输在这点上!”谷歌开发:其实都是在瞎努力
这是一个很难让人心平气和的年代。疫情之下,很多人的都在面临着:失业、降薪、找不到工作、随时被裁等风险。但是:有心的人早已上路超车,做个人能力的升级——提高自己的不可替代性。李开复曾提出过“五秒钟准则”:一项…

64位win7安装IIS7时不能浏览asp的问题
64位win7高级家庭版安装IIS7,安装完成后只能浏览静态页,找了很多的教程都没有解决,最后在一个博客里看到说64位系统下ASP是不支持的ODB读取ACC的数据库的,因此需要开启32位应用程序的支持。 方法是: Internet 信息服务…

0525 项目回顾7.0
一、sprint总结 当谈到团队,我开始真的不知道团队是怎么样的,怎么样进行工作的,要该怎么出力团队的关系,有时候会涉及到个人问题,是不是该考虑进来,但是很多时候是不能的,每一个人作为团队的一份…

辩证看待 iostat
旧博文,搬到 csdn 原文:http://rebootcat.com/2018/01/16/using-iostat-dialectically/ 前言 经常做系统分析会接触到很多有用的工具,比如 iostat,它是用来分析磁盘性能、系统 I/O 的利器。 本文将重点介绍 iostat 命令的使用,并…
搞机器学习,Python和R哪个更合适?
【编者按】如果你正想构建一个机器学习项目,但却纠结于如何选择编程语言,这篇文章将是你所需要的。这篇文章不仅帮助你理解Python和R这两种语言的区别,还有助于你了解各个语言多方面的优势。作者 | Manav Jain译者 | Joe,编辑 | 夕…

Java安装方法
第1章 Java简介及开发环境搭建 实验1 JDK的下载、安装与配置 【实验目的】 (1)熟悉JDK工具包的下载及安装过程。 (2)掌握JAVA_HOME、CLASSPATH及Path的设置内容。 (3)掌握Java程序运行原理及Javac、Java命…

Hash函数的安全性
我们为了保证消息的完整性,引进了散列函数,那么散列函数会对安全正造成什么影响呢?这是需要好好研究一番的问题。 三个概念: 1.如果y<>x,且h(x)h(y),则…