SQL触发器语法参考
SQL触发器的使用及语法
===以下转/blog/424789定义:何为触发器?在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分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
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触发器[1]-常用参数及示例
SQL触发器[1]-常⽤参数及⽰例SQL 触发器[1] - 常⽤参数及⽰例1、常⽤参数:create trigger 创建触发器alter trigger 修改触发器drop trigger 删除触发器sp_rename 重命名触发器例如:exec sp_rename '旧触发器','新触发器'2、⽰例:2.1 插⼊数据触发器if exists(select name from sysobjects where name='sss' and type='TR')drop trigger sssgocreate trigger ssson 数据表名称after insert --创建insert触发器(三种:insert、update、delete)asprint ('欢饮加⼊本公司!')go/*执⾏插⼊操作*/insert into 数据表名 (,,) values('','','')2.2 创建具有触发条件的触发器(当向HF表插⼊数据时,检查在users表是否有这个⼈,如果没有就输出错误)use TJgoif exists(select name from sysobjects where name='sss' and type='TR')drop trigger sssgocreate trigger ssson HFafter insert --创建insert触发器(三种:insert、update、delete)asdeclare @hf_hname nvarchar(20)select @hf_hname=hf_hname from hfif (@hf_hname not in(select u_uname from users))beginrollback transactionprint ('输⼊错误的⼈员名称,请重新输⼊')endgoinsert into hf (hf_hname,hf_content) values ('ss','dd')创建时间:2020.09.16 更新时间:。
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触发器是一种特殊类型的存储过程,它是在数据库中一些特定的操作发生时自动执行的。
触发器可以用于在数据被插入、更新或删除时执行一系列的操作。
本文将详细介绍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查询触发器语句
sql查询触发器语句SQL触发器是一种特殊的数据库对象,它可以在特定的数据库操作(例如插入、更新、删除)发生时自动执行一些预定义的动作。
触发器可以用于实现复杂的业务逻辑和数据完整性约束。
下面列举了10个常见的SQL触发器语句:1. 在员工表上创建触发器,当有新员工加入时,自动在工资表中插入一条新记录:```sqlCREATE TRIGGER insert_employeeAFTER INSERT ON employeesFOR EACH ROWBEGININSERT INTO salaries (employee_id, salary) VALUES (NEW.employee_id, 0);END;```2. 在订单表上创建触发器,当订单状态更新为已发货时,自动更新库存表中对应商品的数量:```sqlCREATE TRIGGER update_inventoryAFTER UPDATE ON ordersFOR EACH ROWBEGINIF NEW.status = '已发货' THENUPDATE inventory SET quantity = quantity - NEW.quantity WHERE product_id = NEW.product_id;END IF;END;```3. 在学生表上创建触发器,当有新学生加入时,自动更新班级表中的学生人数:```sqlCREATE TRIGGER update_class_sizeAFTER INSERT ON studentsFOR EACH ROWBEGINUPDATE classes SET size = size + 1 WHERE class_id = NEW.class_id;END;```4. 在商品表上创建触发器,当商品数量低于阈值时,自动发送库存警报邮件:```sqlCREATE TRIGGER send_inventory_alertAFTER UPDATE ON productsFOR EACH ROWBEGINIF NEW.quantity < 10 THEN-- 发送邮件的逻辑END IF;END;```5. 在订单表上创建触发器,当订单被删除时,自动将对应的商品数量加回库存:```sqlCREATE TRIGGER restore_inventoryAFTER DELETE ON ordersFOR EACH ROWBEGINUPDATE inventory SET quantity = quantity + OLD.quantity WHERE product_id = OLD.product_id;END;```6. 在员工表上创建触发器,当员工的工资被更新时,自动记录工资变动历史:```sqlCREATE TRIGGER log_salary_changeAFTER UPDATE ON employeesFOR EACH ROWBEGININSERT INTO salary_history (employee_id, old_salary, new_salary, change_date) VALUES (NEW.employee_id, OLD.salary, NEW.salary, NOW());END;```7. 在订单表上创建触发器,当有新订单完成支付时,自动更新销售统计表中的数据:```sqlCREATE TRIGGER update_sales_statsAFTER INSERT ON ordersFOR EACH ROWBEGINIF NEW.status = '已支付' THENUPDATE sales_stats SET total_sales = total_sales +NEW.total_amount, order_count = order_count + 1;END IF;END;```8. 在学生表上创建触发器,当学生的成绩被更新时,自动计算并更新班级的平均成绩:```sqlCREATE TRIGGER update_class_avg_scoreAFTER UPDATE ON studentsFOR EACH ROWBEGINUPDATE classes SET avg_score = (SELECT AVG(score) FROM students WHERE class_id = NEW.class_id) WHERE class_id = NEW.class_id;END;```9. 在商品表上创建触发器,当商品被删除时,自动更新订单表中的商品信息:```sqlCREATE TRIGGER update_order_productAFTER DELETE ON productsFOR EACH ROWBEGINUPDATE orders SET product_id = NULL WHERE product_id = OLD.product_id;END;```10. 在员工表上创建触发器,当员工的状态从在职变为离职时,自动将该员工从项目表中移除:```sqlCREATE TRIGGER remove_employee_from_projectAFTER UPDATE ON employeesFOR EACH ROWBEGINIF NEW.status = '离职' THENDELETE FROM projects WHERE employee_id = NEW.employee_id;END IF;END;```以上是10个常见的SQL触发器语句的示例,它们展示了触发器的灵活应用,可以帮助我们实现复杂的业务逻辑和数据完整性约束。
sqlserver 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分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:虚拟表Inserted 虚拟表Deleted在表记录新增时存放新增的记录不存储记录修改时存放用来更新的新记录存放更新前的记录删除时不存储记录存放被删除的记录一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted 表,然后删除Student记录并写入新纪录。
创建触发器sql语句简单例子
创建触发器sql语句简单例子触发器(Trigger)是一种在数据库表上自动执行的特殊存储过程。
它根据特定的事件(如INSERT、UPDATE或DELETE)在表上触发执行,可以在数据更改之前或之后执行自定义的逻辑。
触发器能够实现诸如数据完整性、数据一致性以及自动化任务等目标。
下面是一个简单的例子,以展示如何在MySQL数据库中创建一个触发器:```SQL-- 创建一个触发器,当在customer表上执行INSERT操作时,自动向 order_history 表中插入一条记录CREATE TRIGGER after_customer_insertAFTER INSERTON customer FOR EACH ROWBEGININSERT INTO order_history (customer_id, event_type,event_time)VALUES (NEW.id, 'INSERT', NOW());END;```上述例子中,我们在customer表上创建了一个触发器after_customer_insert。
该触发器定义了在每次向customer表中插入一行数据后,自动将该插入事件的相关信息插入到order_history表中。
具体来说,触发器在数据库执行INSERT 操作后执行,它会在每次插入操作完成后,将相关的customer_id、event_type(在这里是'INSERT')以及event_time(当前时间)插入到order_history表中。
这个例子涵盖了触发器的四个重要的关键点:1. 触发器是针对特定的表的,必须在表上定义。
2. 触发器可以在指定的事件(INSERT、UPDATE或DELETE)发生时执行。
3. 触发器的逻辑可以由用户自定义,用户可以编写代码来实现特定的操作。
4. 触发器中可以引用一些特殊的变量,如NEW和OLD,分别代表了新插入的行和被更新/删除的旧行。
sql 触发器的语法
sql 触发器的语法SQL触发器是用于在数据库中自动执行某些操作的一种机制。
它们可以在特定的数据库事件发生时触发,并执行预定义的操作。
SQL 触发器可以用于实现数据的验证、约束、日志记录等功能,从而提高数据库的安全性和可靠性。
SQL触发器的语法如下:```CREATE TRIGGER trigger_name{BEFORE | AFTER} {INSERT | UPDATE | DELETE}ON table_name[FOR EACH ROW]trigger_body```其中,trigger_name是触发器的名称,可以根据实际需求自行命名。
BEFORE和AFTER关键字指定了触发器在事件发生前还是事件发生后执行。
INSERT、UPDATE和DELETE关键字指定了触发器在插入、更新或删除数据时触发。
table_name是触发器所在的表名。
触发器可以在每一行数据上触发,也可以在整个表上触发。
通过FOR EACH ROW关键字来指定触发器的触发范围。
如果不指定FOR EACH ROW,则触发器将在整个表上触发。
trigger_body是触发器的主体部分,可以包含一系列的SQL语句。
触发器的主体部分可以包含SELECT、INSERT、UPDATE和DELETE等SQL语句,用于实现具体的操作。
例如,可以在触发器中插入一条记录到另一个表中,或者更新另一个表的数据。
下面是一个示例,演示了如何创建一个在用户表中插入数据时触发的触发器:```CREATE TRIGGER insert_user_triggerAFTER INSERTON userFOR EACH ROWBEGININSERT INTO log(user_id, action) VALUES(er_id, 'insert');END;```上述示例中,创建了一个名为insert_user_trigger的触发器,在每次向user表中插入数据时触发。
sql触发器实例
sql触发器实例触发器(Trigger)是数据库管理系统(DBMS)中的一种规则,它会在指定的数据库表发生特定事件(如插入、更新或删除)时自动执行。
下面我将为你展示一个简单的SQL 触发器示例。
示例场景假设我们有一个名为employees的表,用于存储员工信息,包括id, name, 和salary。
我们想创建一个触发器,确保每当有新员工添加时,他们的工资不能超过某个特定的值。
1.创建employees 表sqlCREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100),salary DECIMAL(10, 2));2.创建触发器我们创建一个名为check_salary的触发器,当在employees表中插入新记录时,它会检查工资是否超过了5000。
如果超过了,触发器将中止插入操作。
sqlDELIMITER //CREATE TRIGGER check_salary BEFORE INSERT ON employeesFOR EACH ROWBEGINIF NEW.salary > 5000THENSIGNAL SQLSTATE'45000'SET MESSAGE_TEXT = 'Salary exceeds maximum limit';END IF;END;//DELIMITER ;在这个触发器中:•BEFORE INSERT ON employees指定了触发器是在向employees表插入新记录之前触发。
•FOR EACH ROW表示这个触发器会对插入操作中的每一行单独触发。
•IF NEW.salary > 5000检查即将插入的新记录的工资是否超过5000。
•SIGNAL SQLSTATE '45000'在工资超过限制时发出一个错误信号,中止插入操作。
3.测试触发器现在我们尝试插入一些记录来测试触发器的功能。
SQL Server触发器语法
SQL触发器语法参考CreateTRIGGER trigger_nameON{table|view}[WITH ENCRYPTION]{{{FOR|AFTER|INSTEAD OF}{[Insert][,][Updat e]}[WITH APPEND][NOT FOR REPLICATION]AS[{IF Update(column)[{AND|or}Update(column)][...n]|IF(COLUMNS_UpdateD(){bitwise_operator}updated _bitmask){comparison_operator}column_bitmask[...n] }]sql_statement[...n]}}参数trigger_name是触发器的名称。
触发器名称必须符合标识符规则,并且在数据库中必须唯一。
可以选择是否指定触发器所有者名称。
Table|view是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。
可以选择是否指定表或视图的所有者名称。
WITH ENCRYPTION加密syscomments表中包含Create TRIGGER语句文本的条目。
使用WITH ENCRYPTION可防止将触发器作为SQL Server复制的一部分发布。
AFTER指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才激发。
所有的引用级联操作和约束检查也必须成功完成后,才能执如果仅指定FOR关键字,则AFTER是默认设置。
不能在视图上定义AFTER触发器。
INSTEAD OF指定执行触发器而不是执行触发SQL语句,从而替代触发语句的操作。
在表或视图上,每个Insert、Update或Delete语句最多可以定义一个INSTEAD OF触发器。
然而,可以在每个具有INSTEAD OF触发器的视图上定义视图。
INSTEAD OF触发器不能在WITH CHECK OPTION的可更新视图上定义。
SQL触发器语法参考
SQL触发器语法参考CreateTRIGGER trigger_nameON { table | view }[ WITH ENCRYPTION ]{{ { FOR |AFTER | INSTEAD OF } { [ Insert ] [ , ] [ Update ] }[ WITH APPEND ][ NOT FOR REPLICATION ]AS[ { IF Update ( column )[ { AND | or } Update ( column ) ][ ...n ]| IF ( COLUMNS_UpdateD ( ) { bitwise_operator } updated_bitmask){ comparison_operator } column_bitmask [ ...n ]} ]sql_statement [ ...n ]}}参数trigger_name是触发器的名称。
触发器名称必须符合标识符规则,并且在数据库中必须唯一。
可以选择是否指定触发器所有者名称。
Table | view是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。
可以选择是否指定表或视图的所有者名称。
WITH ENCRYPTION加密syscomments 表中包含Create TRIGGER语句文本的条目。
使用WITH ENCRYPTION 可防止将触发器作为SQL Server复制的一部分发布。
AFTER指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才激发。
所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。
如果仅指定FOR 关键字,则AFTER是默认设置。
不能在视图上定义AFTER 触发器。
INSTEAD OF指定执行触发器而不是执行触发SQL语句,从而替代触发语句的操作。
在表或视图上,每个Insert、Update 或Delete语句最多可以定义一个INSTEAD OF 触发器。
使用SQL语句创建触发器
使用SQL语句创建触发器创建触发器可以使用以下的SQL语句:```sqlCREATE TRIGGER trigger_name{BEFORE , AFTER} {INSERT , UPDATE , DELETE} ON table_name FOREACHROWBEGIN--触发器执行的逻辑END;```其中- `trigger_name` 是触发器的名称,可根据实际需求自行命名。
-`BEFORE`或`AFTER`表示触发器执行的时机,可以在插入(`INSERT`)、更新(`UPDATE`)或删除(`DELETE`)操作之前或之后触发。
-`INSERT`、`UPDATE`、`DELETE`是触发器监听的操作类型。
- `table_name` 是触发器所属的表名。
-`FOREACHROW`表示每当每一行数据受到上述监听的操作影响时,触发器都会执行。
-`BEGIN`和`END`之间是触发器执行的逻辑,可以根据实际需求编写SQL语句。
下面是一个示例,演示如何创建一个触发器,当在`orders`表中进行插入操作时,自动更新`customers`表中相应的订单数量字段:```sqlCREATE TRIGGER update_order_countAFTER INSERT ON ordersFOREACHROWBEGINUPDATE customersSET order_count = order_count + 1WHERE customer_id = NEW.customer_id;END;```以上示例中,`update_order_count` 是触发器的名称,`AFTER INSERT ON orders` 表示触发器在`orders`表中进行插入操作之后触发,`FOR EACH ROW` 表示每插入一行数据,就执行一次触发器的逻辑。
在逻辑中,使用`UPDATE`语句更新`customers`表中相应的订单数量字段,其中`NEW.customer_id`表示插入操作的新数据中的`customer_id`字段值。
SQLSERVER各类触发器的完整语法及参数说明(拓展)
SQLSERVER各类触发器的完整语法及参数说明(拓展)语法:Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)CREATE TRIGGER [ schema_name . ]trigger_nameON { table | view }[ WITH <dml_trigger_option> [ ,...n ] ]{ FOR | AFTER | INSTEAD OF }{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }[ WITH APPEND ][ NOT FOR REPLICATION ]AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }<dml_trigger_option> ::=[ ENCRYPTION ][EXECUTE AS Clause ]<method_specifier> ::=assembly_name.class_name.method_nameTrigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or UPDATE STATISTICS statement (DDL Trigger)CREATE TRIGGER trigger_nameON { ALL SERVER | DATABASE }[ WITH <ddl_trigger_option> [ ,...n ] ]{ FOR | AFTER } { event_type | event_group } [ ,...n ]AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier > [ ; ] }<ddl_trigger_option> ::=[ ENCRYPTION ][ EXECUTE AS Clause ]<method_specifier> ::=assembly_name.class_name.method_nameTrigger on a LOGON event (Logon Trigger)CREATE TRIGGER trigger_nameON ALL SERVER[ WITH <logon_trigger_option> [ ,...n ] ]{ FOR| AFTER } LOGONAS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier > [ ; ] }<logon_trigger_option> ::=[ ENCRYPTION ][ EXECUTE AS Clause ]<method_specifier> ::=assembly_name.class_name.method_name参数:schema_nameDML 触发器所属架构的名称。
SQLite 触发器的SQL语法
SQLite 触发器的SQL语法CREATE TRIGGERsql-statement::=CREATE [TEMP | TEMPORARY] TRIGGER trigger-name[ BEFORE | AFTER ]database-event ON [database-name.]table-nametrigger-actionsql-statement::=CREATE [TEMP | TEMPORARY] TRIGGER trigger-nameINSTEAD OFdatabase-event ON [database-name.]view-nametrigger-actiondatabase-event::=DELETE |INSERT |UPDATE |UPDATE OF column-listtrigger-action::=[ FOR EACH ROW | FOR EACH STATEMENT ][ WHENexpression]BEGINtrigger-step ; [trigger-step ; ]*ENDtrigger-step::=update-statement|insert-statement|delete-statement|select-statementCREATE TRIGGER语句用于向数据库schema中添加触发器。
触发器是一些在特定的数据库事件(database-event) 发生时自动进行的数据库操作(trigger-action).触发器可由在特殊表上执行的DELETE, INSERT, UPDATE等语句触发,或UPDATE 表中特定的字段时触发。
现在SQLite仅支持FOR EACH ROW触发器,不支持FOR EACH STATEMENT触发。
因此可以不用明确说明FOR EACH ROW .FOR EACH ROW的意思是由trigger-steps 说明的SQL语句可能在(由WHEN子句决定的)数据库插入, 更改或删除的每一行触发trigger.WHEN子句和trigger-steps可以使用"NEW.column-name"和"OLD.column-name" 的引用形式访问正在被插入,更改或 删除的行的元素,column-name是触发器关联的表中的字段名。
sql触发器的使用及语法
sql触发器的使用及语法
数据库触发器(Database Trigger)是指在特定条件出发时,自
动执行由用户定义的sql语句或存储过程的数据库功能。
它和视图、
存储过程、函数、索引一样,都是数据库对象,也是定制数据库应用
系统优化的重要工具。
触发器是在特定事件(通常是在表上发生操作的时候)发生时,
自动触发执行的一系列sqldml语句,可以在预定的约束条件下实现完
整的逻辑校验功能,从而保证数据的有效性。
一个触发器的语法格式:`CREATE TRIGGER trigger_name` `ON table_name` `[AFTER|BEFORE]` `[INSERT|UPDATE|DELETE]` `AS`
`[FOR EACH ROW]` `BEGIN -- trigger body END`
它的各个部分的含义依次为:
创建触发器:`CREATE TRIGGER` 是触发器首部,用于声明开始
和结束触发器定义,并定义触发器的名称;
触发表:`ON table_name` 是触发器触发条件,即表上发生变动
时触发器才会被触发;
触发事件:`[AFTER|BEFORE] [INSERT|UPDATE|DELETE]` 是定义
触发器触发时间及操作,也就是定义在什么时候要触发(`AFTER` 或
`BEFORE`),用什么操作触发(`INSERT`、`UPDATE` 或 `DELETE`);
`AS`:用来标识触发器的有效范围,`FOR EACH ROW` 是指每笔
资料发生变化时都会触发;
触发体:`BEGIN -- trigger body END` 是定义具体要触发的操作。
SQL触发器的使用及语法
===以下转/blog/424789定义:何为触发器?在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分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
sqlserver触发器语法
sqlserver触发器语法SQL Server触发器是一种特殊类型的存储过程,它会在特定的数据库表上自动执行。
触发器可以在插入、更新或删除数据时触发,从而允许开发人员实现复杂的业务逻辑和数据完整性约束。
触发器的语法如下:sql.CREATE TRIGGER trigger_name.ON table_name.AFTER INSERT, UPDATE, DELETE.AS.BEGIN.-触发器逻辑。
END;其中,`trigger_name` 是触发器的名称,`table_name` 是触发器所绑定的表名。
`AFTER INSERT, UPDATE, DELETE` 指定了触发器在哪些操作之后执行。
`BEGIN` 和 `END` 之间是触发器的逻辑代码。
触发器可以根据需要在不同的操作后触发,例如,可以创建一个在插入数据后触发的触发器,以执行特定的业务逻辑。
触发器可以访问插入、更新或删除操作影响的数据,并根据需要对其进行修改。
在触发器的逻辑代码中,可以使用 INSERTED 和 DELETED 表来访问触发操作影响的数据。
INSERTED 表包含了插入或更新操作后的新数据,而 DELETED 表包含了更新或删除操作前的旧数据。
除了上述的基本语法,触发器还可以包括条件判断、事务处理和错误处理等逻辑。
需要注意的是,触发器的复杂性和执行频率应该被谨慎考虑,以避免对数据库性能产生负面影响。
总之,SQL Server触发器是一种强大的数据库对象,通过合理使用触发器,可以实现数据完整性约束、业务逻辑的复杂处理以及数据审计等功能。
在使用触发器时,需要充分理解其语法和行为,以确保数据库的稳定性和性能。
sql触发器实例
SQL触发器实例1. 什么是SQL触发器?在SQL中,触发器(Trigger)是一种特殊的存储过程,它会在指定的数据库操作(如插入、更新、删除)发生时自动执行。
触发器可以用于实现复杂的业务逻辑和数据完整性约束。
触发器通常与表相关联,当表上的指定操作被执行时,触发器会自动触发并执行相应的代码逻辑。
2. 触发器的语法下面是一个简单的创建触发器的语法:CREATE TRIGGER trigger_name{BEFORE | AFTER} {INSERT | UPDATE | DELETE}ON table_nameFOR EACH ROWBEGIN-- 触发器执行的代码逻辑END;其中: - trigger_name是触发器的名称,需要在数据库中唯一。
- BEFORE或AFTER指定了触发器执行的时间点,分别在操作之前或之后。
- INSERT、UPDATE或DELETE指定了要监视和响应的数据库操作类型。
- table_name是与触发器相关联的表名。
- FOR EACH ROW表示对每一行数据都会执行相应代码块。
3. 触发器示例3.1 在插入数据时更新相关表假设我们有两个表:用户表(users)和订单表(orders)。
当向订单表插入一条新记录时,我们希望自动更新用户表中的订单数量字段。
首先,我们创建一个触发器来实现这个逻辑:CREATE TRIGGER update_order_countAFTER INSERT ON ordersFOR EACH ROWBEGINUPDATE users SET order_count = order_count + 1 WHERE id = er_id; END;在上述触发器中,我们指定了在orders表上插入数据之后执行触发器逻辑。
每当插入一条新记录时,触发器会自动执行一个SQL语句来更新对应用户的订单数量。
3.2 在删除数据时进行级联操作假设我们有两个表:部门表(departments)和员工表(employees)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SQL触发器语法参考CreateTRIGGER trigger_nameON { table | view }[ WITH ENCRYPTION ]{{ { FOR |AFTER | INSTEAD OF } { [ Insert ] [ , ] [ Update ] }[ WITH APPEND ][ NOT FOR REPLICATION ]AS[ { IF Update ( column )[ { AND | or } Update ( column ) ][ ...n ]| IF ( COLUMNS_UpdateD ( ) { bitwise_operator } updated_bitmask){ comparison_operator } column_bitmask [ ...n ]} ]sql_statement [ ...n ]}}参数trigger_name是触发器的名称。
触发器名称必须符合标识符规则,并且在数据库中必须唯一。
可以选择是否指定触发器所有者名称。
Table | view是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。
可以选择是否指定表或视图的所有者名称。
WITH ENCRYPTION加密syscomments 表中包含Create TRIGGER语句文本的条目。
使用WITH ENCRYP TION 可防止将触发器作为SQL Server复制的一部分发布。
AFTER指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才激发。
所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。
如果仅指定FOR 关键字,则AFTER是默认设置。
不能在视图上定义AFTER 触发器。
INSTEAD OF指定执行触发器而不是执行触发SQL语句,从而替代触发语句的操作。
在表或视图上,每个Insert、Update 或Delete语句最多可以定义一个INSTEAD OF 触发器。
然而,可以在每个具有INSTEAD OF 触发器的视图上定义视图。
INSTEAD OF 触发器不能在WITH CHECK OPTION的可更新视图上定义。
如果向指定了WITH CHECK OPTION选项的可更新视图添加INSTEAD OF 触发器,SQL Server 将产生一个错误。
用户必须用Alter VIEW 删除该选项后才能定义INSTEADOF 触发器。
{ [Delete] [,] [Insert] [,][Update] }是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。
必须至少指定一个选项。
在触发器定义中允许使用以任意顺序组合的这些关键字。
如果指定的选项多于一个,需用逗号分隔这些选项。
对于INSTEAD OF 触发器,不允许在具有ON Delete级联操作引用关系的表上使用De lete 选项。
同样,也不允许在具有ONUpdate 级联操作引用关系的表上使用Update 选项。
WITH APPEND指定应该添加现有类型的其它触发器。
只有当兼容级别是65或更低时,才需要使用该可选子句。
如果兼容级别是70或更高,则不必使用WITH APPEND子句添加现有类型的其它触发器(这是兼容级别设置为70 或更高的CreateTRIGGER 的默认行为)。
有关更多信息,请参见sp_dbcmptlevel。
WITH APPEND 不能与INSTEAD OF触发器一起使用,或者,如果显式声明AFTER触发器,也不能使用该子句。
只有当出于向后兼容而指定FOR 时(没有INSTEAD OF 或AFTER),才能使用WITH APPEND。
以后的版本将不支持WITH APPEND 和FOR(将被解释为AFTER)。
NOT FOR REPLICATION表示当复制进程更改触发器所涉及的表时,不应执行该触发器。
AS是触发器要执行的操作。
sql_statement是触发器的条件和操作。
触发器条件指定其它准则,以确定Delete、Insert 或Update 语句是否导致执行触发器操作。
当尝试Delete、Insert 或Update操作时,Transact-SQL语句中指定的触发器操作将生效。
触发器可以包含任意数量和种类的Transact-SQL语句。
触发器旨在根据数据修改语句检查或更改数据;它不应将数据返回给用户。
触发器中的Transact-SQL 语句常常包含控制流语言。
Create TRIGGER语句中使用几个特殊的表:deleted 和inserted是逻辑(概念)表。
这些表在结构上类似于定义触发器的表(也就是在其中尝试用户操作的表);这些表用于保存用户操作可能更改的行的旧值或新值。
例如,若要检索deleted 表中的所有值,请使用:Select *FROM deleted如果兼容级别等于70,那么在Delete、Insert 或Update 触发器中,SQL Server 将不允许引用inserted 和deleted 表中的text、ntext 或image 列。
不能访问inserted 和del eted 表中的text、ntext 和image 值。
若要在Insert 或Update触发器中检索新值,请将inserted 表与原始更新表联接。
当兼容级别是65或更低时,对inserted 或deleted 表中允许空值的text、ntext 或image列,将返回空值;如果这些列不可为空,则返回零长度字符串。
当兼容级别是80 或更高时,SQL Server 允许在表或视图上通过INSTEADOF 触发器更新text、ntext 或image 列。
n是表示触发器中可以包含多条Transact-SQL语句的占位符。
对于IF Update (column)语句,可以通过重复Update(column) 子句包含多列。
IF Update (column)测试在指定的列上进行的Insert 或Update操作,不能用于Delete 操作。
可以指定多列。
因为在ON子句中指定了表名,所以在IF Update子句中的列名前不要包含表名。
若要测试在多个列上进行的Insert 或Update 操作,请在第一个操作后指定单独的Update(colu mn) 子句。
在Insert 操作中IF Update 将返回TRUE值,因为这些列插入了显式值或隐性(NULL) 值。
说明IF Update (column) 子句的功能等同于IF、IF...ELSE 或WHILE 语句,并且可以使用BEGIN...END语句块。
有关更多信息,请参见控制流语言。
可以在触发器主体中的任意位置使用Update (column)。
是要测试Insert 或Update 操作的列名。
该列可以是SQL Server支持的任何数据类型。
但是,计算列不能用于该环境中。
有关更多信息,请参见数据类型。
IF (COLUMNS_UpdateD())测试是否插入或更新了提及的列,仅用于Insert 或Update触发器中。
COLUMNS_Updat eD 返回varbinary位模式,表示插入或更新了表中的哪些列。
COLUMNS_UpdateD函数以从左到右的顺序返回位,最左边的为最不重要的位。
最左边的位表示表中的第一列;向右的下一位表示第二列,依此类推。
如果在表上创建的触发器包含8 列以上,则COLUMNS_UpdateD返回多个字节,最左边的为最不重要的字节。
在Inse rt 操作中COLUMNS_UpdateD 将对所有列返回TRUE值,因为这些列插入了显式值或隐性(NULL) 值。
可以在触发器主体中的任意位置使用COLUMNS_UpdateD。
bitwise_operator是用于比较运算的位运算符。
updated_bitmask是整型位掩码,表示实际更新或插入的列。
例如,表t1 包含列C1、C2、C3、C4 和C5。
假定表t1 上有Update 触发器,若要检查列C2、C3 和C4 是否都有更新,指定值14;若要检查是否只有列C2有更新,指定值2。
comparison_operator是比较运算符。
使用等号(=) 检查updated_bitmask中指定的所有列是否都实际进行了更新。
使用大于号(>) 检查updated_bitmask 中指定的任一列或某些列是否已更新。
column_bitmask是要检查的列的整型位掩码,用来检查是否已更新或插入了这些列。
注释触发器常常用于强制业务规则和数据完整性。
SQL Server通过表创建语句(Alter TABLE 和Create TABLE)提供声明引用完整性(DRI);但是DRI不提供数据库间的引用完整性。
若要强制引用完整性(有关表的主键和外键之间关系的规则),请使用主键和外键约束(A lterTABLE 和Create TABLE 的PRIMARY KEY 和FOREIGN KEY关键字)。
如果触发器表存在约束,则在INSTEAD OF 触发器执行之后和AFTER 触发器执行之前检查这些约束。
如果违反了约束,则回滚INSTEAD OF触发器操作且不执行(激发)AFTER 触可用sp_settriggerorder 指定表上第一个和最后一个执行的AFTER触发器。
在表上只能为每个Insert、Update 和Delete操作指定一个第一个执行和一个最后一个执行的AFTE R触发器。
如果同一表上还有其它AFTER触发器,则这些触发器将以随机顺序执行。
如果Alter TRIGGER语句更改了第一个或最后一个触发器,则将除去已修改触发器上设置的第一个或最后一个特性,而且必须用sp_settriggerorder 重置排序值。
只有当触发SQL语句(包括所有与更新或删除的对象关联的引用级联操作和约束检查)成功执行后,AFTER触发器才会执行。
AFTER触发器检查触发语句的运行效果,以及所有由触发语句引起的Update 和Delete 引用级联操作的效果。
触发器限制Create TRIGGER必须是批处理中的第一条语句,并且只能应用到一个表中。
触发器只能在当前的数据库中创建,不过触发器可以引用当前数据库的外部对象。
如果指定触发器所有者名称以限定触发器,请以相同的方式限定表名。
在同一条Create TRIGGER 语句中,可以为多种用户操作(如Insert 和Update)定义相同的触发器操作。
如果一个表的外键在Delete/Update操作上定义了级联,则不能在该表上定义INSTEAD OF Delete/Update触发器。
在触发器内可以指定任意的SET 语句。
所选择的SET选项在触发器执行期间有效,并在触发器执行完后恢复到以前的设置。