oracle创建触发器与常见问题

oracle创建触发器与常见问题

Oracle   DBA   Studio   工具里面就能创建触发器

CREATE   TRIGGER  
  名称  
  CREATE   TRIGGER   —   创建一个新触发器    
   
  语法  
  CREATE   TRIGGER   name   {   BEFORE   |   AFTER   }   {   event   [OR   ...]   }  
          ON   table   FOR   EACH   {   ROW   |   STATEMENT   }  
          EXECUTE   PROCEDURE   func   (   arguments   )  
  输入  
  name    
  触发器名称.    
  table    
  表名称.    
  event    
  INSERT,DELETE   或   UPDATE   之一.    
  funcname    
  一个用户提供的函数.    
   
  输出  
  CREATE    
  如果触发器成功创建,返回此信息.    
   
  描述  
  CREATE   TRIGGER   将向现有数据库教程中增加一个新的触发器.触发器将与表   table   相联并且将执行声明的函数   funcname.    
  触发器可以声明为在对记录进行操作之前(在检查约束之前和   INSERT,UPDATE   或   DELETE   执行前)或之后(在检查约束之后和完成了   INSERT,UPDATE   或   DELETE   操作)触发.如果触发器在事件之前,触发器可能略过当前记录的操作或改变被插入的(当前)记录(只对   INSERT   和   UPDATE   操作有效).如果触发器在事件之后,所有更改,包括最后的插入,更新或删除对触发器都是"可见"的.    
   
  请参考   PostgreSQL   程序员手册   中SPI   和触发器章节获取更多信息.    
   
  注意  
  CREATE   TRIGGER   是一个   Postgres   语言扩展.    
  只有表所有者可以就此表创建一个触发器.    
   
  在当前的版本(v7.0),STATEMENT   触发器还没有实现.    
     
   
  请参考   DROP   TRIGGER   获取如何删除触发器的信息.    
   
  用法  
  在插入或更新表   films   之前检查一下声明的分销商代码是否存在于   distributors   表中:    
  CREATE   TRIGGER   if_dist_exists  
          BEFORE   INSERT   OR   UPDATE   ON   films   FOR   EACH   ROW  
          EXECUTE   PROCEDURE   check_primary_key   ('did',   'distributors',   'did');  
  在删除或更新一个分销商的内容之前,将所有记录移到表   films   中(译注:好象与例子意义不同):    
  CREATE   TRIGGER   if_film_exists    
          BEFORE   DELETE   OR   UPDATE   ON   distributors   FOR   EACH   ROW  
          EXECUTE   PROCEDURE   check_foreign_key   (1,   'CASCADE',   'did',   'films',   'did');  
  兼容性  
  SQL92  
  在   SQL92   里没有   CREATE   TRIGGER   语句.    
  上面第二个例子可以使用一个   FOREIGN   KEY   约束实现:    
   
  CREATE   TABLE   distributors   (  
          did             DECIMAL(3),  
          name           VARCHAR(40),  
          CONSTRAINT   if_film_exists  
          FOREIGN   KEY(did)   REFERENCES   films  
          ON   UPDATE   CASCADE   ON   DELETE   CASCADE      
  );

实例

create trigger tri_emp
    after insert on employees
    for each row
    insert into new values(:new.sno,:new.sname,:new.sex,:new.depart)
    --------------
    create trigger tri_emp_delete
    after delete on employees
    for each row
    delete from new where sno=:old.sno
    --------------
    create trigger tri_emp_update
    after update on employees
    for each row
    begin
    delete from new where sno=:old.sno;
    insert into new values(:new.sno,:new.sname,:new.sex,:new.depart);
    end;
    --------------
    注意;的使用,如果在begin和end子句中有多条语句的话,每条句子后面都应该有一个分号

最近最一个oracle的项目,需要自定义生成触发器,但是在组装的SQL语句生成的触发器却始终出现错误。将生产的SQL语句拿到SQLPLUS去执行(oracle 10g),出现

错误:Warning: Trigger created with compilation errors.

     进到企业管理器去查看触发器,会发现如下错误:

     “  Line # = 2 Column # = 128 Error Text = PL/SQL: ORA-00984: column not allowed here
        Line # = 2 Column # = 1 Error Text = PL/SQL: SQL Statement ignored

    ”

     确实不知道是什么错误,通过网络搜索“ column not allowed here”,有人说是字符(char)、整形的

类型转换问题,但这个问题如何解决呢?

     测试用表使用了两张字段相同的表,分别命名为userinfo_old,uerinfo_new.

    SQL生成的触发器如下:

   create trigger test_trigger
              after insert on userinfo_old
for each row  
      begin
            insert into userinfo_new values (userinfo_old.userid,userinfo_old.username,userinfo_old.userpass,userinfo_old.sex,userinfo_old.userqq);
       end;

时间: 2024-09-28 06:05:57

oracle创建触发器与常见问题的相关文章

oracle中创建触发器的语法

创建触发器 创建触发器的一般语法是: 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 {OL

oracle数据库如何创建触发器实例

Oracle   DBA   Studio   工具里面就能创建触发器 CREATE   TRIGGER     名称     CREATE   TRIGGER   -   创建一个新触发器           语法     CREATE   TRIGGER   name   {   BEFORE   |   AFTER   }   {   event   [OR   ...]   }             ON   table   FOR   EACH   {   ROW   |   STA

oracle 创建表空间、新用户及权限

刚开始学习ORCLE的时候,一般都是采用默认的系统账户,系统账户有时会有些局限性,尤其是做项目的时候,创建新的用户就成为必然的. 首先创建表空间,在这个表空间创建新用户,给新用户授权,然后使用新用户登录PL/SQL管理工具,最后创建数据库相关对象. 工具/原料 PL/SQL管理工具 方法/步骤 首先通过ORACLE默认的系统账户登录PL/SQL管理工具(如:system/manager) 新建查询窗口,执行表空间语句, 如:"Create tablespace ts1 datafile 'D:\

oracle中触发器与游标和包的联合问题。

问题描述 oracle中触发器与游标和包的联合问题. 1.创建临时表stu_temp.(临时表结构要和关联表结构一致) 2.创建一个包,包含两个存储过程,stu_insert用于在行级触发器中调用,往stu_temp临时表中装载更新或插入的记录.而stu_count用于在语句级触发器中检查人数是否超限. 3.创建行级触发器stu_in,目的是把更新后的记录插入stu_temp. 4.创建语句级触发器stu_cou,使用游标从stu_temp中逐条读取更新或插入的记录,取sno,在关联表stu中查

Oracle使用触发器和mysql中使用触发器的案例比较_oracle

一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志,自动通知好友,其实就是在增加日志的时候做一个出发,再向表中写入条目. --触发器的效率很高 举例:论坛的发帖,每插入一个帖子都希望将版面表中的最后发帖时间,帖子总数字段进行同步更新,这时使用触发器效率会很高. 二.Oracle 使用 PL/SQL 编写触发器 1.--PL/SQL创建触发器的一般语法

两种oracle创建字段自增长的实现方式_oracle

mysql等其他数据库中有随着记录的插入而表ID自动增长的功能,而oracle却没有这样的功能,我们有以下两种方式可以解决字段自增长的功能. 因为两种方式都需要通过创建序列来实现,这里先给出序列的创建方式. CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] [{CYCLE|NOCYCLE}] [{CACHE n|NOCACHE}]; 解析: 1)INCREMENT BY用

oracle 创建字段自增长实现方式_oracle

mysql等其他数据库中有随着记录的插入而表ID自动增长的功能,而oracle却没有这样的功能,我们有以下两种方式可以解决字段自增长的功能. 因为两种方式都需要通过创建序列来实现,这里先给出序列的创建方式. CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] [{CYCLE|NOCYCLE}] [{CACHE n|NOCACHE}]; 解析: 1)INCREMENT BY用

Oracle手动建库常见问题

Oracle手动建库常见问题 BLOG文档结构图 前言部分 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 10G和11g手动建库(重点) ② 各种组件安装 ③ 创建Sample Schemas数据 ④ 手动建库中常用脚本的解释 ⑤ sqlplus中的帮助命令 Tips: ① 本文在ITpub(http://blog.itpub.net/26736162)和博客园(http://www.cnblogs.com/lhr

创建触发器

  上面介绍了有关触发器的概念.作用和一些基本问题,下面我们将分别介绍在MS SQLServer 中如何用SQL Server 管理工具Enterprise Manager 和Transaction_SQL 来创建触发器.在创建触发器以前必须考虑到以下几个方面: CREATE TRIGGER 语句必须是批处理的第一个语句: 表的所有者具有创建触发器的缺省权限,表的所有者不能把该权限传给其它用户: 触发器是数据库对象,所以其命名必须符合命名规则: 尽管在触发器的SQL 语句中可以参照其它数据库中的