sql触发器

SQL Server(触发器)

心已入冬 提交于 2019-11-29 08:21:26
一.触发器概述 触发器是一种特殊类型的存储过程,当指定表中的数据发生变化时触发器自动生效。它与表紧密相连,可以看做是表定义的一部分。触发器不能通过名称被直接调用,更不允许设置参数。 在SQL Server中一张表可以有多个触发器。用户可以使用INSERT、UPDATE或DELETE语句对触发器进行设置,也可以对一张表上的特定操作设置多个触发器。触发器可以包含复杂的Transact-SQL语句。不论触发器所进行的操作有多复杂,触发器都只作为一个独立的单元被执行,被看作是一个事务。如果在执行触发器的过程中发生了错误,则整个事务将会自动回滚。 二.触发器优点 触发器的优点表现在以下几个方面: (1)触发器自动执行,对表中的数据进行修改后,触发器立即被激活。 (2)为了实现复杂的数据库更新操作,触发器可以调用一个或多个存储过程,甚至可以通过调用外部过程(不是数据库管理系统本身)完成相应的操作。 (3)触发器能够实现比CHECK约束更为复杂的数据完整性约束。在数据库中,为了实现数据完整性约束,可以使用CHECK约束或触发器。CHECK约束不允许引用其他表中的列来完成检查工作,而触发器可以引用其他表中的列。它更适合在大型数据库管理系统中用来约束数据的完整性。 (4)触发器可以检测数据库内的操作,从而取消了数据库未经许可的更新操作,使数据库修改、更新操作更安全,数据库的运行也更稳定。 (5

MySQL触发器

送分小仙女□ 提交于 2019-11-29 05:38:21
触发器的特性 触发器的应用场景 查看触发器 删除触发器 创建触发器 关于触发器的进一步介绍 触发器的特性 需要MySQL 5 对触发器的支持是在MySQL 5中增加的 仅支持表 只有表才支持触发器,视图不支持(临时表也不支持)。 保持每个数据库的触发器名唯一 在MySQL 5中,触发器名必须在每个表中唯一,但不是在每个数据库中唯一。这表示同一数据库中的两个表可具有相同名字的触发器。这在其他每个数据库触发器名必须唯一的DBMS中是不允许的,而且以后的MySQL版本很可能会使命名规则更为严格。因此,现在最好是在数据库范围内使用唯一的触发器名。 触发器失败 如果BEFORE触发器失败,则MySQL将不执行请求的操作。此外,如果BEFORE触发器或语句本身失败,MySQL将不执行AFTER触发器(如果有的的话) BEFORE或AFTER 通常,将BEFORE用于数据验证和净化(目的是保证插入表中的数据确实是需要的数据) 触发器的应用场景 需要在某个表发生更改时自动处理。 例如: 每当增加一个顾客到某个数据库表时,都检查其电话号码格式是否正确,州的缩写是否为大写; 每当订购一个产品时,都从库存数量中减去订购的数量; 无论何时删除一行,都在某个存档表中保留一个副本。 触发器是MySQL响应以下任意语句而 自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语 句): 

sql server 第一个触发器

夙愿已清 提交于 2019-11-28 17:45:41
create trigger UpdateQueueTableInfo on his_queue after update as begin declare @sysDate datetime; declare @queueDate datetime; declare @appointsid varchar(50); declare @flag int; declare @oldflag int; select @sysDate=GETDATE() from deleted select @queueDate=APPOINTSDATE,@appointsid=APPOINTSID,@flag=FLAG from deleted select @oldflag=FLAG from inserted; --print '更新前flag' --print '更新后flag' --提前转登记 if(@sysDate<@queueDate and (@flag=2 or @flag=3) and @oldflag<>@flag) update QUEUEDETAIL set ISPREREGISTER='1' where APPOINTSID=@appointsid; update HIS_QUEUE set ISPREREGISTER='1' where APPOINTSID=

用触发器更新SQL记录

梦想的初衷 提交于 2019-11-27 15:13:19
CREATE FUNCTION reorder_priority() RETURNS TRIGGER AS $$ BEGIN CASE TG_OP WHEN 'UPDATE' THEN UPDATE link SET priority = priority + 1 WHERE link.priority >= NEW.priority AND NOT link.priority > OLD.priority; END CASE; RETURN NULL; END; $$ LANGUAGE plpgsql;正确解法 BEGIN CASE TG_OP WHEN 'UPDATE' THEN UPDATE link SET priority = priority + 1 WHERE link.priority >= NEW.priority AND NOT link.priority >= OLD.priority; END CASE; RETURN NEW; END; 来源: https://www.cnblogs.com/gamecenter/p/11368029.html

存储过程和存储函数和触发器示例

久未见 提交于 2019-11-26 15:40:35
1、存储过程示例:为指定的职工在原工资的基础上长10%的工资 SQL > create or replace procedure raiseSalary(empid in number ) as pSal emp.sal % type; begin select sal into pSal from emp where empno = empid; update emp set sal = sal * 1.1 where empno = empid; dbms_output.put_line( ' 员工号: ' || empid || ' 涨工资前 ' || psal || ' 涨工资后 ' || psal * 1.1 ); end ; / Procedure created SQL > set serveroutput on SQL > exec raisesalary( 7369 ); 员工号:7369涨工资前 800涨工资后880 PL/SQL procedure successfully completed 2、存储函数示例:查询某职工的年收入。 SQL> /** 查询某职工的总收入    */ create or replace function queryEmpSalary(empid in number ) return number as pSal number ;