SQL触发器使用教程和命名规范

合集下载

sql 触发器语法

sql 触发器语法

sql 触发器语法一、什么是 SQL 触发器?SQL 触发器是一种特殊的存储过程,它在特定的数据库操作(如INSERT、UPDATE 或DELETE)执行时自动触发。

当满足特定条件时,触发器可以在表上执行操作或调用其他存储过程。

二、SQL 触发器的语法SQL 触发器的语法如下:CREATE TRIGGER trigger_name{BEFORE | AFTER} {INSERT | UPDATE | DELETE}ON table_name [FOR EACH ROW]BEGIN-- 触发器执行的 SQL 语句END;其中:- trigger_name:触发器名称,用户自定义。

- BEFORE/AFTER:指定触发时间,即在数据库操作之前或之后执行。

- INSERT/UPDATE/DELETE:指定触发事件,即在进行插入、更新或删除操作时执行。

- table_name:指定要监视的表名。

- FOR EACH ROW:可选参数,表示为每一行数据都会执行此触发器。

- BEGIN 和 END:包含了要执行的 SQL 语句。

三、SQL 触发器示例1. 创建一个在插入数据时自动更新修改日期的触发器:CREATE TRIGGER update_dateBEFORE INSERT ON usersFOR EACH ROWBEGINSET NEW.modify_date = NOW();END;2. 创建一个在删除订单时自动将订单中商品数量归零的触发器:CREATE TRIGGER reset_quantityAFTER DELETE ON ordersFOR EACH ROWBEGINUPDATE products SET quantity = 0 WHERE product_id = OLD.product_id;END;3. 创建一个在更新用户信息时自动记录修改日志的触发器:CREATE TRIGGER log_changesAFTER UPDATE ON usersFOR EACH ROWBEGININSERT INTO user_logs (user_id, change_date, change_type) VALUES (er_id, NOW(), 'update');END;四、SQL 触发器的注意事项1. 触发器应该尽可能简单,避免使用复杂的逻辑。

sql server触发器的基本语法和使用方法

sql server触发器的基本语法和使用方法

sql server触发器的基本语法和使用方法一、引言SQL Server触发器是一种数据库对象,它在数据库表上定义在特定事件发生时自动执行的操作。

触发器基于定义的事件和条件进行触发,并执行一系列预定的操作。

本文将介绍SQL Server触发器的基本语法和使用方法,帮助您更好地理解和应用触发器。

二、触发器的语法触发器的语法主要由以下几个部分组成:1. 触发器名称:指定触发器的名称,以便在创建触发器时进行命名和识别。

2. 触发器事件:指定触发器应何时触发,常见的触发器事件包括INSERT、UPDATE和DELETE等。

3. 触发器模式:指定触发器在事件发生时执行的操作,包括对表数据的插入、更新和删除等操作。

4. 触发器所在的架构:指定触发器所在的架构,以便在创建触发器时指定正确的架构。

基本语法示例:CREATE TRIGGER trigger_name ON table_name FOR INSERT, UPDATE, DELETE AS BEGIN -- 触发器操作代码 END;三、触发器的使用方法1. 创建触发器:使用CREATE TRIGGER语句创建触发器,指定触发器的名称、事件、模式和所在的架构。

2. 禁用和启用触发器:使用ALTER TRIGGER语句来禁用和启用触发器,以满足特定需求或临时更改触发器的行为。

3. 修改触发器:使用ALTER TRIGGER语句修改现有触发器的名称、事件、模式和位置等属性。

4. 删除触发器:使用DROP TRIGGER语句删除不再需要的触发器。

5. 触发器的嵌套:在触发器内部可以定义其他触发器,形成嵌套结构,实现更复杂的逻辑。

6. 触发器的权限:确保创建、修改和删除触发器的用户具有足够的权限。

7. 异常处理:在触发器操作代码中添加适当的异常处理机制,以应对可能出现的错误和异常情况。

四、示例以下是一个简单的示例,展示如何使用SQL Server触发器在表上定义一个插入操作时自动添加日志:1. 创建表:首先创建一个包含要记录的字段的表。

sql触发器语句的使用流程

sql触发器语句的使用流程

SQL触发器语句的使用流程1. 触发器简介触发器是SQL中一种特殊的过程,它会在SQL语句执行之前或之后自动被触发执行。

通过触发器,我们可以在数据库中插入、更新或删除记录时执行一系列的操作。

本文将介绍SQL触发器语句的使用流程。

2. 创建触发器在SQL中,创建触发器需要使用CREATE TRIGGER语句。

下面是创建触发器的语法:CREATE TRIGGER trigger_nameAFTER/BEFORE INSERT/UPDATE/DELETE ON table_nameFOR EACH ROWBEGIN-- 触发器的操作语句END;•trigger_name为触发器的名称,可以根据具体需求自行命名。

•AFTER/BEFORE指定触发器是在SQL语句执行之前还是之后触发执行。

•INSERT/UPDATE/DELETE指定触发器是在插入、更新或删除记录时触发执行。

•table_name为触发器所属的表名。

•FOR EACH ROW表示触发器是逐行触发执行的。

3. 触发器的操作语句在触发器的BEGIN和END之间可以编写一系列的操作语句。

这些操作语句可以是SQL语句、条件语句、循环语句等。

下面是一个示例,创建一个触发器在插入记录时更新另一个表中的记录:CREATE TRIGGER update_another_tableAFTER INSERT ON table1FOR EACH ROWBEGINUPDATE table2 SET column1 =NEW.column1 WHERE id=NEW.id;END;在上述示例中,每当向table1表中插入一条记录时,触发器就会自动执行。

执行的操作是将插入的记录中的column1的值更新到table2表中对应记录的column1字段。

4. 激活和禁用触发器在某些情况下,我们可能需要临时禁用触发器或重新激活触发器。

可以使用DISABLE TRIGGER和ENABLE TRIGGER语句来完成这个操作。

简单使用触发器SQL触发器的使用及语法

简单使用触发器SQL触发器的使用及语法

简单使用触发器SQL触发器的使用及语法SQL触发器是一种特殊类型的存储过程,它是在数据库中一些特定的操作发生时自动执行的。

触发器可以用于在数据被插入、更新或删除时执行一系列的操作。

本文将详细介绍SQL触发器的使用和语法。

1.触发器的类型:SQL触发器可以分为三种类型:插入触发器(INSERT trigger)、更新触发器(UPDATE trigger)和删除触发器(DELETE trigger)。

根据业务需求选择相应的触发器类型。

2.创建触发器:创建触发器需要使用CREATETRIGGER语句。

语法如下:CREATE TRIGGER <trigger_name>{BEFORE,AFTER,INSTEADOF}{INSERT,UPDATE,DELETE}[ON <table_name>][FOREACHROW][WHEN (<condition>)]BEGIN--触发器执行的操作END;其中,trigger_name是触发器的名称;BEFORE / AFTER / INSTEAD OF表示触发器在所指定操作之前、之后或者代替进行;INSERT / UPDATE/ DELETE表示触发器响应的操作类型;table_name是触发器所绑定的表名;FOR EACH ROW表示该触发器对每一行数据都执行;condition是触发器的条件。

3.触发器执行的操作:在触发器的BEGIN和END之间,可以进行一系列的操作,如执行SQL 语句、调用存储过程等。

可以根据业务需求在触发器中编写逻辑代码来满足需求。

4.触发器的应用场景:-数据完整性:可以使用触发器在插入、更新或删除数据时进行一些验证,确保数据的完整性。

例如,在插入新用户之前,可以在触发器中检查用户的必填字段是否为空。

-数据同步:可以使用触发器在数据更新时自动更新其他相关表中的数据,确保数据的同步。

例如,在更新订单信息时,可以在触发器中更新库存表中的相应数据。

sql server触发器的使用及语法

sql server触发器的使用及语法

SQL Server触发器是一种特殊的数据库对象,它可以在表上定义,用于在特定的数据操作(如插入、更新、删除)发生时自动执行一段代码。

触发器可以用于实现数据约束、数据审计、数据变更记录等功能。

以下是SQL Server触发器的使用及语法:.创建触发器:CREATE TRIGGER trigger_name{AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE} ON table_name[WITH ENCRYPTION][FOR | AFTER] {INSERT | UPDATE | DELETE}ASBEGIN-- 触发器执行的代码END.删除触发器:DROP TRIGGER [schema_name.]trigger_name.触发器的类型:•AFTER触发器:在数据操作之后触发执行。

•INSTEAD OF触发器:在数据操作之前触发执行,可以替代原始操作。

.触发器的事件:•INSERT:在向表中插入数据时触发。

•UPDATE:在更新表中的数据时触发。

•DELETE:在从表中删除数据时触发。

.触发器的执行时间:•FOR:在数据操作之前或之后触发执行。

•AFTER:在数据操作之后触发执行。

触发器的代码:触发器的代码可以包含SQL语句、存储过程、函数等。

可以使用INSERTED和DELETED临时表来访问触发器操作的数据。

INSERTED表包含已插入或已更新的数据,DELETED表包含已删除或已更新的数据。

触发器的加密:使用WITH ENCRYPTION选项可以对触发器的定义进行加密,防止他人查看触发器的代码。

需要注意的是,触发器的使用应该谨慎,过多或复杂的触发器可能会影响数据库的性能。

在设计和使用触发器时,要考虑到对数据库性能的影响,并经过充分测试和优化。

SQL触发器语法(1)

SQL触发器语法(1)

SQL触发器一、触发器的基本概念1、触发器的定义触发器是一种特殊的存储过程,它和表密切相连,可以看作是表格定义的一部分。

当用户对指定表操作时,触发器会自动执行。

触发器在update、insert、delete等操作执行结束后才执行。

2、触发器的功能(1)级联更新数据库中相关表的数据;(2)实现多表之间数据的一致性;(3)执行比检查约束更复杂的约束操作;(4)调用存储过程;(5)在一张表的update、insert、delete操作上可设置多个触发器。

3、使用触发器应注意的问题(1)当使用约束、规则、默认值等方法能够实现数据的完整性,就不用触发器实现;T1,T2 INSERT(2)只有表的拥有者才可以在表上创建或删除触发器,这种权限不准转授;(3)使用update语句可以一次对多行数据进行修改,而触发器只被触发一次;(4)触发器只能在当前数据库中创建,触发器的命名必须要遵守标识符的命名规则。

4、触发器的优点(1)触发器是自动的;(2)触发器可以通过数据库中的相关表进行层叠更改;(3)触发器可以强制限制,这些限制比用check 所定义的约束更复杂5、触发器的工作原理inserted表和deleted表的特点如下:(1)这两张表是逻辑表,由数据库管理,用户不能对他们进行修改;(2)这两张表存储在内存中,而不是存储在数据库中;(3)这两张表的结构与被该触发器作用的表结构相同;(4)当触发器完成操作后,这两张表会自动删除;(5)两张表中保存的数据是因用户操作而被影响到的原数据或新数据;(6)这两张表是只读表。

二、触发器的建立SQL触发器语法CREATE TRIGGER trigger_name ON { table | view }[ WITH ENCRYPTION ]{{ { FOR | AFTER | INSTEAD OF } { [ INS ERT ] [ DELETE ] [ UPDATE ] }ASSQL语句参数说明:trigger_name是触发器的名称。

sql server触发器的使用及语法

sql server触发器的使用及语法

sql server触发器的使用及语法SQL Server触发器是一种数据库对象,它可以在指定的表上自动执行程序,以响应特定的数据库事件或操作。

通过使用触发器,可以在不直接修改应用程序代码的情况下,实现对数据库的自动化操作和控制。

本文将介绍SQL Server触发器的使用及其语法。

一、触发器的基本概念触发器是与表相关联的特殊类型的存储过程。

当插入、更新或删除表中的数据时,触发器可以自动执行一系列的操作。

触发器可以用于实现数据的验证、约束和业务逻辑的处理。

它们可以在数据被更改之前或之后触发,以及在每一行被更改之前或之后触发。

二、触发器的创建和使用在SQL Server中,可以使用CREATE TRIGGER语句来创建触发器。

语法如下:```CREATE TRIGGER trigger_nameON table_name{FOR | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}ASBEGIN-- 触发器的逻辑代码END```其中,trigger_name是触发器的名称,table_name是触发器所属的表名,{FOR | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}是触发器的触发事件,BEGIN和END之间是触发器的逻辑代码。

三、触发器的类型SQL Server中的触发器可以分为三种类型:INSERT触发器、UPDATE触发器和DELETE触发器。

1. INSERT触发器INSERT触发器在向表中插入新记录之前或之后触发。

可以在INSERT触发器中执行一些额外的逻辑操作,例如记录日志、更新其他表等。

2. UPDATE触发器UPDATE触发器在更新表中的记录之前或之后触发。

可以在UPDATE触发器中进行一些数据验证、约束或业务逻辑处理。

3. DELETE触发器DELETE触发器在从表中删除记录之前或之后触发。

SQL触发器的使用及语法

SQL触发器的使用及语法

SQL触发器的使⽤及语法定义:何为触发器?在SQL Server⾥⾯也就是对某⼀个表的⼀定的操作,触发某种条件,从⽽执⾏的⼀段程序。

触发器是⼀个特殊的存储过程。

常见的触发器有三种:分别应⽤于Insert , Update , Delete 事件。

我为什么要使⽤触发器?⽐如,这么两个表:Create Table Student( --学⽣表StudentID int primary key, --学号…)Create Table BorrowRecord( --学⽣借书记录表BorrowRecord int identity(1,1), --流⽔号StudentID int , --学号BorrowDate datetime, --借出时间ReturnDAte Datetime, --归还时间…)⽤到的功能有:1.如果我更改了学⽣的学号,我希望他的借书记录仍然与这个学⽣相关(也就是同时更改借书记录表的学号);2.如果该学⽣已经毕业,我希望删除他的学号的同时,也删除它的借书记录。

等等。

这时候可以⽤到触发器。

对于1,创建⼀个Update触发器:Create Trigger truStudentOn Student --在Student表中创建触发器for Update --为什么事件触发As --事件触发后所要做的事情if Update(StudentID)beginUpdate BorrowRecordSet StudentID=i.StudentIDFrom BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted临时表Where br.StudentID=d.StudentIDend理解触发器⾥⾯的两个临时的表:Deleted , Inserted 。

注意Deleted 与Inserted分别表⽰触发事件的表“旧的⼀条记录”和“新的⼀条记录”。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SQL触发器使用教程和命名规范1,触发器简介触发器(Trigger)是数据库对象的一种,编码方式类似存储过程,与某张表(Table)相关联,当有DML语句对表进行操作时,可以引起触发器的执行,达到对插入记录一致性,正确性和规范性控制的目的。

在当年C/S时代盛行的时候,由于客户端直接连接数据库,能保证数据库一致性的只有数据库本身,此时主键(Primary Key),外键(Foreign Key),约束(Constraint)和触发器成为必要的控制机制。

而触发器的实现比较灵活,可编程性强,自然成为了最流行的控制机制。

到了B/S时代,发展成4层架构,客户端不再能直接访问数据库,只有中间件才可以访问数据库。

要控制数据库的一致性,既可以在中间件里控制,也可以在数据库端控制。

很多的青睐Java的开发者,随之将数据库当成一个黑盒,把大多数的数据控制工作放在了Servlet中执行。

这样做,不需要了解太多的数据库知识,也减少了数据库编程的复杂性,但同时增加了Servlet编程的工作量。

从架构设计来看,中间件的功能是检查业务正确性和执行业务逻辑,如果把数据的一致性检查放到中间件去做,需要在所有涉及到数据写入的地方进行数据一致性检查。

由于数据库访问相对于中间件来说是远程调用,要编写统一的数据一致性检查代码并非易事,一般采用在多个地方的增加类似的检查步骤。

一旦一致性检查过程发生调整,势必导致多个地方的修改,不仅增加工作量,而且无法保证每个检查步骤的正确性。

触发器的应用,应该放在关键的,多方发起的,高频访问的数据表上,过多使用触发器,会增加数据库负担,降低数据库性能。

而放弃使用触发器,则会导致系统架构设计上的问题,影响系统的稳定性。

2,触发器示例触发器代码类似存储过程,以PL/SQL脚本编写。

下面是一个触发器的示例:新建员工工资表salarycreate table SALARY(EMPLOYEE_ID NUMBER, --员工IDMONTH VARCHAR2(6), --工资月份AMOUNT NUMBER --工资金额)创建与salary关联的触发器salary_trg_rai1 Create or replace trigger salary_trg_rai2 After insert on salary3 For each row4 declare5 Begin6 Dbms_output.put_line(‘员工ID:’ || :new.employee_id);7 Dbms_output.put_line(‘工资月份:’ || :new.month);8 Dbms_output.put_line(‘工资:’ || :new.amount);9 Dbms_output.put_line(‘触发器已被执行’);10 End;打开一个SQL Window窗口(使用PL/SQL Developer工具),或在sqlplus中输入:Insert into salary(employee_id, month, amount) values(1, ‘200606’, 10000);执行后可以在sqlplus中,或在SQL Window窗口的Output中见到员工ID:1工资月份:200606工资:10000触发器已执行在代码的第一行,定义了数据库对象的类型是trigger,定义触发器的名称是salary_trg_rai第二行说明了这是一个after触发器,在DML操作实施之后执行。

紧接着的insert说明了这是一个针对insert 操作的触发器,每个对该表进行的insert操作都会执行这个触发器。

第三行说明了这是一个针对行级的触发器,当插入的记录有n条时,在每一条插入操作时都会执行该触发器,总共执行n次。

Declare后面跟的是本地变量定义部分,如果没有本地变量定义,此部分可以为空Begin和end括起来的代码,是触发器的执行部分,一般会对插入记录进行一致性检查,在本例中打印了插入的记录和“触发器已执行”。

其中:new对象表示了插入的记录,可以通过:new.column_name来引用记录的每个字段值3,触发器语法和功能触发器的语法如下CREATE OR REPLACE TRIGGER trigger_name<before | after | instead of><insert | update | delete> ON table_name[FOR EACH ROW]WHEN (condition)DECLAREBEGIN--触发器代码END;Trigger_name是触发器的名称。

<before | after | instead of>可以选择before或者after或instead of。

Before 表示在DML语句实施前执行触发器,而after表示在在dml语句实施之后执行触发器,instead of触发器用在对视图的更新上。

<insert | update | delete>可以选择一个或多个DML语句,如果选择多个,则用or 分开,如:insert or update。

Table_name是触发器关联的表名。

[FOR EACH ROW]为可选项,如果注明了FOR EACH ROW,则说明了该触发器是一个行级的触发器,DML语句处理每条记录都会执行触发器;否则是一个语句级的触发器,每个DML语句触发一次。

WHEN后跟的condition是触发器的响应条件,只对行级触发器有效,当操作的记录满足condition时,触发器才被执行,否则不执行。

Condition中可以通过new对象和old对象(注意区别于前面的:new和:old,在代码中引用需要加上冒号)来引用操作的记录。

触发器代码可以包括三种类型:未涉及数据库事务代码,涉及关联表(上文语法中的table_name)数据库事务代码,涉及除关联表之外数据库事务代码。

其中第一种类型代码只对数据进行简单运算和判断,没有DML语句,这种类型代码可以在所有的触发器中执行。

第二种类型代码涉及到对关联表的数据操作,比如查询关联表的总记录数或者往关联表中插入一条记录,该类型代码只能在语句级触发器中使用,如果在行级触发器中使用,将会报ORA-04091错误。

第三种类型代码涉及到除关联表之外的数据库事务,这种代码可以在所有触发器中使用。

从触发器的功能上来看,可以分成3类:●重写列(仅限于before触发器)●采取行动(任何触发器)●拒绝事务(任何触发器)“重写列”用于对表字段的校验,当插入值为空或者插入值不符合要求,则触发器用缺省值或另外的值代替,在多数情况下与字段的default属性相同。

这种功能只能在行级before触发器中执行。

“采取行动”针对当前事务的特点,对相关表进行操作,比如根据当前表插入的记录更新其他表,银行中的总帐和分户帐间的总分关系就可以通过这种触发器功能来维护。

“拒绝事务”用在对数据的合法性检验上,当更新的数据不满足表或系统的一致性要求,则通过抛出异常的方式拒绝事务,在其上层的代码可以捕获这个异常并进行相应操作。

下面将通过举例说明,在例子中将触发器主体的语法一一介绍,读者可以在例子中体会触发器的功能。

4,例一:行级触发器之一CREATE OR REPLACE TRIGGER salary_raiuAFTER INSERT OR UPDATE OF amount ON salaryFOR EACH ROWBEGINIF inserting THENdbms_output.put_line(‘插入’);ELSIF updating THENdbms_output.put_line(‘更新amount列’);END IF;END;以上是一个after insert和after update的行级触发器。

在第二行中of amount on salary的意思是只有当amount列被更新时,update触发器才会有效。

所以,以下语句将不会执行触发器:Update salary set month = ‘200601’ where month = ‘200606’;在触发器主体的if语句表达式中,inserting, updating和deleting可以用来区分当前是在做哪一种DML操作,可以作为把多个类似触发器合并在一个触发器中判别触发事件的属性。

5,例二:行级触发器之二新建员工表employmentCREATE TABLE EMPLOYMENT(EMPLOYEE_ID NUMBER, --员工IDMAXSALARY NUMBER --工资上限)插入两条记录Insert into employment values(1, 1000);Insert into employment values(2, 2000);CREATE OR REPLACE TRIGGER salary_raiuAFTER INSERT OR UPDATE OF amount ON salaryFOR EACH ROWWHEN ( NEW.amount>= 1000 AND (old.amount IS NULL OR OLD.amount<= 500))DECLAREv_maxsalary NUMBER;BEGINSELECT maxsalaryINTO v_maxsalaryFROM employmentWHERE employee_id = :NEW.employee_id;IF :NEW.amount>v_maxsalary THENraise_application_error(-20000, '工资超限');END IF;END;以上的例子引入了一个新的表employment,表中的maxsalary字段代表该员工每月所能分配的最高工资。

下面的触发器根据插入或修改记录的employee_id,在employment表中查到该员工的每月最高工资,如果插入或修改后的amount超过这个值,则报错误。

代码中的when子句表明了该触发器只针对修改或插入后的amount值超过1000,而修改前的amount 值小于500的记录。

New对象和old对象分别表示了操作前和操作后的记录对象。

对于insert操作,由于当前操作记录无历史对象,所以old对象中所有属性是null;对于delete操作,由于当前操作记录没有更新对象,所以new对象中所有属性也是null。

但在这两种情况下,并不影响old和new对象的引用和在触发器主体中的使用,和普通的空值作同样的处理。

相关文档
最新文档