Heim  >  Artikel  >  Datenbank  >  oracle创建触发器与常见问题

oracle创建触发器与常见问题

WBOY
WBOYOriginal
2016-06-07 17:46:011249Durchsuche

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;

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn