Sql触发器referencing(数据库触发器代码报错!急!在线等!)

2024-04-19 01:40:03 :20

sql触发器referencing(数据库触发器代码报错!急!在线等!)

“sql触发器referencing”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看sql触发器referencing(数据库触发器代码报错!急!在线等!)!

本文目录

数据库触发器代码报错!急!在线等!

没有看到报错原因,不知道哪里错了,但是感觉语法都有问题,我给你看一个例子吧,你直接copy到PL/SQL中,看以来方便点create or replace trigger C_PRIVILEGE_SYN_TRIG after insert or delete or update on mes_frame_role_user for each rowdeclare -- local variables here newuser varchar2(20); newrole varchar2(20); olduser varchar2(20);begin newuser := :new.emp_no; newrole := :new.roleid; olduser := :old.emp_no; case when inserting then --insert the new authority to the old system insert into c_privilege( select distinct newuser, ’’, mf.function, 2, mf.module from mes_frame_role_authority ra inner join mes_frame_menu m on ra.menuid = m.id inner join mes_frame_menu m2 on m.tonode = m2.id inner join c_module_fun_t mf on m.caption = mf.function and m2.caption = mf.module where ra.roleid = newrole); when updating then delete c_privilege where emp = newuser; insert into c_privilege( select distinct newuser, ’’, mf.function, 2, mf.module from mes_frame_role_authority ra inner join mes_frame_menu m on ra.menuid = m.id inner join mes_frame_menu m2 on m.tonode = m2.id inner join c_module_fun_t mf on m.caption = mf.function and m2.caption = mf.module where ra.roleid = newrole); when deleting then delete c_privilege where emp = olduser; end case;end C_PRIVILEGE_SYN_TRIG;

MySQL中如何定义trigger

对的,MYSQL不用referencing,百度可以搜索MYSQL5中文手册呀,说得非常非常清楚,我粘贴到下面:21.1. CREATE TRIGGER语法CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。触发程序与命名为tbl_name的表相关。tbl_name必须引用永久性表。不能将触发程序与TEMPORARY表或视图关联起来。trigger_time是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。trigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:· INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。· UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。· DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。请注意,trigger_event与以表操作方式激活触发程序的SQL语句并不很类似,这点很重要。例如,关于INSERT的BEFORE触发程序不仅能被INSERT语句激活,也能被LOAD DATA语句激活。可能会造成混淆的例子之一是INSERT INTO .. ON DUPLICATE UPDATE ...语法:BEFORE INSERT触发程序对于每一行将激活,后跟AFTER INSERT触发程序,或BEFORE UPDATE和AFTER UPDATE触发程序,具体情况取决于行上是否有重复键。对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。例如,对于某一表,不能有两个BEFORE UPDATE触发程序。但可以有1个BEFORE UPDATE触发程序和1个BEFORE INSERT触发程序,或1个BEFORE UPDATE触发程序和1个AFTER UPDATE触发程序。trigger_stmt是当触发程序激活时执行的语句。如果你打算执行多个语句,可使用BEGIN ... END复合语句结构。这样,就能使用存储子程序中允许的相同语句。请参见20.2.7节,“BEGIN ... END复合语句”。在MySQL 5.1中,可以编写包含按名称对表进行直接引用的触发程序,如下例中所示的名为testref的触发程序:CREATE TABLE test1(a1 INT);CREATE TABLE test2(a2 INT);CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);CREATE TABLE test4( a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b4 INT DEFAULT 0); DELIMITER | CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 SET a2 = NEW.a1; DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END| DELIMITER ; INSERT INTO test3 (a3) VALUES (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL); INSERT INTO test4 (a4) VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0), (0);如果将下述值插入表test1,如下所示:mysql》 INSERT INTO test1 VALUES -》 (1), (3), (1), (7), (1), (8), (4), (4);Query OK, 8 rows affected (0.01 sec)Records: 8 Duplicates: 0 Warnings: 0那么4个表中的数据如下:mysql》 SELECT * FROM test1;+------+| a1 |+------+| 1 || 3 || 1 || 7 || 1 || 8 || 4 || 4 |+------+8 rows in set (0.00 sec) mysql》 SELECT * FROM test2;+------+| a2 |+------+| 1 || 3 || 1 || 7 || 1 || 8 || 4 || 4 |+------+8 rows in set (0.00 sec) mysql》 SELECT * FROM test3;+----+| a3 |+----+| 2 || 5 || 6 || 9 || 10 |+----+5 rows in set (0.00 sec) mysql》 SELECT * FROM test4;+----+------+| a4 | b4 |+----+------+| 1 | 3 || 2 | 0 || 3 | 1 || 4 | 2 || 5 | 0 || 6 | 0 || 7 | 1 || 8 | 1 || 9 | 0 || 10 | 0 |+----+------+10 rows in set (0.00 sec)使用别名OLD和NEW,能够引用与触发程序相关的表中的列。OLD.col_name在更新或删除它之前,引用已有行中的1列。NEW.col_name在更新它之后引用将要插入的新行的1列或已有行的1列。激活触发程序时,对于触发程序引用的所有OLD和NEW列,需要具有SELECT权限,对于作为SET赋值目标的所有NEW列,需要具有UPDATE权限。注释:目前,触发程序不会被级联的 外键动作激活。该限制将会被尽早放宽。CREATE TRIGGER语句需要SUPER权限。

sql server UPDATE 触发器的问题

altertriggerddondingdanxinxiafterupdateasbeginsetnocounton;declare@idint,@chaint,@newint,@oldintselect@id=商品编号,@old=数量fromdeletedselect@new=数量frominsertedif@new》@oldbeginset@cha=@new-@oldupdatekucunxinxiset库存数量=库存数量+@chawhere商品编号=@idendelsebeginset@cha=@new-@oldupdatekucunxinxiset库存数量=库存数量+@chawhere商品编号=@idendend你的代码设计有问题,库存数量=库存数量+@chawhere商品编号=@id,还有就是:else后也是一个整体,要用begin……end,我都改过了,自己在看一下……,不懂的话,继续问哈!!!

请问SQL server2008r2触发器怎么写看了半天没个例子,不容易明白!

你这个写法是oracle的。sqlserver没有for each row也没有referencing。

create trigger 月工资变动on 考勤after update begindeclare @一月份缺勤扣薪_old numeric(10,4)declare @一月份缺勤扣薪_new numeric(10,4)declare @员工编号 intif update(一月份缺勤扣薪)begin   select @一月份缺勤扣薪_old = 一月份缺勤扣薪 from deleted   select @一月份缺勤扣薪_new = 一月份缺勤扣薪,@员工编号 = 员工编号 from inserted   if( @一月份缺勤扣薪_old != @一月份缺勤扣薪_new )      update 员工月工资 set 一月份工资 = 一月份工资 - b.一月份扣薪 + c.一月份扣薪   from 员工月工资 a,inserted b,deleted  where a.员工编号=b.员工编号 and a.员工编号 = c.员工编号end

关于SQL触发器的问题

有可能是没有权限,你到这表所在用户下,把这个表的权限赋予一下你操作的用户,或者建一个公共同义词,赋给你操作的用户:create public synonym sc to sc;grant all on sc to public;

SQL主从表的触发器

没测,参考下CREATE OR REPLACE TRIGGER congbiao_t BEFORE DELETE ON zhubiao REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROWDECLARE x_count NUMBER;BEGIN SELECT COUNT (*) INTO x_count FROM zhubiao WHERE zhubiao = congbiao; IF x_count 《》 0 THEN raise_application_error (num =》 -20000, msg =》 ’Cannot delete from zhubiao’ ); END IF;END; CREATE OR REPLACE TRIGGER congbiao_t BEFORE DELETE ON zhubiao REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROWDECLARE x_count NUMBER;BEGIN IF DELETING THEN DELETE zhubiao WHERE zhubiao = :OLD.congbiao; END IF;END;

如果你还想了解更多这方面的信息,记得收藏关注本站。

sql触发器referencing(数据库触发器代码报错!急!在线等!)

本文编辑:admin
Copyright © 2022 All Rights Reserved 威海上格软件有限公司 版权所有

鲁ICP备20007704号

Thanks for visiting my site.