oracle 触发器

1.创建语法

复制代码
create [or replace] tigger 触发器名 触发时间 触发事件

on 表名
[for each row]
begin
 pl/sql语句
end


触发器名:触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
触发时间:指明触发器何时执行,该值可取:
before:表示在数据库动作之前触发器执行;
after:表示在数据库动作之后触发器执行。
触发事件:指明哪些数据库动作会触发此触发器:
insert:数据库插入会触发此触发器;
update:数据库修改会触发此触发器;
delete:数据库删除会触发此触发器。
表 名:数据库触发器所在的表。
for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。
复制代码

2.举个栗子

create or replace trigger auth_secure before insert or update or DELETE
on tb_emp
begin
  IF(to_char(sysdate,'DY')='星期日') THEN
    RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表tb_emp');
  END IF;
END;
/

3.语法备注

CREATE OR REPLACE TRIGGER TEST_TRIGGER
 AFTER DELETE OR INSERT OR UPDATE ON TEST
DECLARE         ------声明变量   
 V_TYPE TEST_LOG.L_TYPE%TYPE;
 IF INSERTING THEN
  V_TYPE := 'INSERT';           ----------  := 是赋值运算符

 3.   ACL权限设置    sql命令

复制代码
   BEGIN
   DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
    acl          => 'email_server_permissions.xml', 
    description  => 'Enables network permissions for the e-mail server',
    principal    => 'DBA', --此为将来要进行操作的用户
    is_grant     => TRUE, 
    privilege    => 'connect');
    END;
    
    
    
    BEGIN
      --2. 将此 ACL 与邮件服务器相关联,

      DBMS_NETWORK_ACL_ADMIN.assign_acl (
      acl         => 'email_server_permissions.xml',
      host        => '172.10.0.56', --SMTP服务器地址
      lower_port  => 25,
      upper_port  => 25);
    COMMIT;
    END;
    
    BEGIN
        --3.创建访问控制列表(ACL)network_services,

   DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
    acl          => 'network_services.xml', 
    description  => 'Enables network permissions for the e-mail server',
    principal    => 'DBA', --此为将来要进行操作的用户
    is_grant     => TRUE, 
    privilege    => 'connect');
      END;
    
    BEGIN
        --4. 将此 ACL 与邮件服务器相关联,

  DBMS_NETWORK_ACL_ADMIN.assign_acl (
      acl         => 'network_services.xml',
      host        => '172.10.0.56', --SMTP服务器地址
      lower_port  => NULL,
      upper_port  => NULL);
    COMMIT;
      END;
    
复制代码

4.触发器访问网络

    p_url:='http://172.10.0.56/fd/app/ChangeResidentPhone';
    http_req:=utl_http.begin_request(p_url,'GET');        
    http_resp := utl_http.get_response(http_req, TRUE);
    loop
        utl_http.read_raw(http_resp, l_raw,1024);
        l_r:=l_r||utl_raw.cast_to_varchar2(l_raw);
    end loop;
    utl_http.end_response(http_resp);

 

posted @   leolzi  阅读(172)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示