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 触发器if条件写法

sql 触发器if条件写法

sql 触发器if条件写法在SQL 中,触发器(Trigger)可以在表上执行自动化的操作,当满足特定事件(如插入、更新、删除)时触发。

在触发器中使用`IF` 条件通常涉及到使用`IF...THEN...ELSE` 结构或`CASE` 表达式,具体取决于你的数据库管理系统(DBMS)的支持和语法。

以下是一个简单的示例,展示了在触发器中使用`IF` 条件的一般写法:```sql-- 创建触发器CREATE TRIGGER example_triggerAFTER INSERT ON your_tableFOR EACH ROWBEGIN-- 使用IF 条件IF NEW.column_name = 'some_value' THEN-- 在此执行某些操作-- ...ELSE-- 在条件不满足时执行其他操作-- ...END IF;-- 或者使用CASE 表达式CASEWHEN NEW.column_name = 'some_value' THEN-- 在此执行某些操作-- ...ELSE-- 在条件不满足时执行其他操作-- ...END CASE;END;```在这个示例中:- `NEW.column_name` 表示插入操作中新插入的行的某个列的值。

- `AFTER INSERT ON your_table` 意味着触发器将在插入`your_table` 表中的数据后执行。

请注意,上述示例中的`IF` 条件和`CASE` 表达式中的条件和操作应根据实际需求进行修改。

具体的语法和功能可能会因使用的数据库管理系统而异,例如,MySQL、SQL Server、Oracle 等数据库系统可能具有不同的语法和支持程度。

SQL触发器实例讲解

SQL触发器实例讲解

SQL触发器实例讲解2008-11-27 16:16:45| 分类:PROCEDURE | 标签:|字号大中小订阅SQL触发器实例1定义:何为触发器?在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.StudentIDWhere br.StudentID=d.StudentIDend理解触发器里面的两个临时的表:Deleted , Inserted 。

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

一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:虚拟表Inserted 虚拟表Deleted在表记录新增时存放新增的记录不存储记录修改时存放用来更新的新记录存放更新前的记录删除时不存储记录存放被删除的记录一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。

mssql 触发器写法例子

mssql 触发器写法例子

在MSSQL中,触发器是一种特殊类型的存储过程,它会在特定的事件(如INSERT、UPDATE 或DELETE)发生时自动执行。

以下是一个简单的MSSQL触发器示例:假设我们有一个名为`employees`的表,其中包含员工的信息,如下所示:```sqlCREATE TABLE employees (id INT PRIMARY KEY,name NVARCHAR(50),department NVARCHAR(50),salary DECIMAL(10, 2));```现在,我们想要在向`employees`表中插入新员工时自动更新员工的xs。

为此,我们可以创建一个AFTER INSERT触发器,如下所示:```sqlCREATE TRIGGER trg_update_salaryON employeesAFTER INSERTASBEGIN--获取新插入的员工ID和部门DECLARE @new_employee_id INT;DECLARE @new_employee_department NVARCHAR(50);SELECT @new_employee_id = id, @new_employee_department = department FROM inserted;--根据部门计算新的xsDECLARE @new_salary DECIMAL(10, 2);IF @new_employee_department = 'IT'SET @new_salary = 6000.00;ELSE IF @new_employee_department = 'HR'SET @new_salary = 5000.00;ELSESET @new_salary = 4000.00;--更新新员工的xsUPDATE employeesSET salary = @new_salaryWHERE id = @new_employee_id;END;```这个触发器会在向`employees`表中插入新员工后自动执行。

sqlserver触发器例题

sqlserver触发器例题

sqlserver触发器例题SQL Server 触发器是一种数据库对象,它可以在特定表上的数据发生更改时自动执行一系列操作。

触发器可以用于实现业务规则和数据完整性约束,以及跟踪数据变化等功能。

在本文中,我们将介绍两个 SQL Server 触发器的例题及其解决方案。

例题一:在一张名为"Employee"的表上创建一个触发器,以便在插入新员工记录时自动将当前日期作为"hire_date"字段的默认值。

解决方案:首先,我们需要使用下面的 SQL 命令创建一个名为"Employee"的表,并在该表中添加一个"hire_date"字段:```sql CREATE TABLE Employee ( employee_id INT PRIMARY KEY, employee_name VARCHAR(50), hire_date DATE ) ```接下来,我们可以使用下面的 SQL 命令创建一个名为"trg_Employee_Insert"的触发器:```sql CREATE TRIGGER trg_Employee_Insert ON Employee FOR INSERT AS BEGIN UPDATE Employee SET hire_date = GETDATE() WHERE employee_id IN (SELECT employee_id FROM inserted) END ```在这个触发器中,我们使用了"FOR INSERT"来指定触发器在插入操作之后执行。

然后,我们使用了"GETDATE()"函数来获取当前日期,并将其更新到"hire_date"字段中。

现在,当我们向"Employee"表中插入一条新的员工记录时,触发器将自动将当前日期作为"hire_date"字段的默认值:```sql INSERT INTO Employee (employee_id, employee_name) VALUES (1, 'John') ```例题二:在一张名为"Orders"的表上创建一个触发器,以便在删除订单记录时自动将相应的产品库存加回去。

sql server中的删除触发器实例

sql server中的删除触发器实例

SQL Server中的删除触发器是一种可以在删除数据时自动执行的特殊类型的存储过程。

它可以用于在删除操作执行之前或之后执行一些特定的逻辑。

在本文中,我们将探讨SQL Server中删除触发器的实际应用和实例。

删除触发器的基本语法如下:```sqlCREATE TRIGGER trigger_nameON table_nameAFTER DELETEASBEGIN-- Trigger logic hereEND```在这个语法中,`trigger_name`是触发器的名称,`table_name`是将要应用触发器的表的名称,`AFTER DELETE`指示该触发器将在删除操作之后触发,`BEGIN`和`END`之间是触发器的执行逻辑。

接下来,我们将通过一个具体的实例来展示SQL Server中删除触发器的应用。

实例:假设我们有一个名为`Employees`的表,该表存储了员工的信息,包括员工ID、尊称和部门。

现在,我们希望在删除员工信息时,自动将该员工相关的所有订单信息也一并删除。

这时,我们可以使用删除触发器来实现这个功能。

我们需要创建一个名为`DeleteEmployeeOrdersTrigger`的删除触发器,它将应用于`Employees`表,并在删除员工信息之后触发。

```sqlCREATE TRIGGER DeleteEmployeeOrdersTriggerON EmployeesAFTER DELETEASBEGINDELETE FROM OrdersWHERE EmployeeID IN (SELECT deleted.EmployeeID FROM deleted)END```在这个实例中,`DeleteEmployeeOrdersTrigger`是触发器的名称,`Employees`是应用触发器的表的名称,`AFTER DELETE`指示该触发器将在删除操作之后触发,`DELETE FROM Orders WHERE EmployeeID IN (SELECT deleted.EmployeeID FROM deleted)`是触发器的执行逻辑,它将删除`Orders`表中与被删除员工ID相关的订单信息。

sql查询触发器语句

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 触发器示例

sqlserver 触发器示例

sqlserver 触发器示例1--检查当前触发器是否已存在2IF exists(SELECT*FROM sysobjects WHERE xtype='TR'AND [name]='TR_INSERTUserInfo_LoginLog')3--存在即删除该触发器4DROP TRIGGER TR_INSERTUserInfo_LoginLog5go6--触发器创建在UserInfo表上当对UserInfo表执行INSERT操作后自动执行触发器中的SQL语句7CREATE TRIGGER TR_INSERTUserInfo_LoginLog8ON UserInfo9FOR INSERT10AS11BEGIN12--定义接受新建用户ID的参数13DECLARE@userID VARCHAR(50);14--查询INSERTED临时表获取新建用户ID15SELECT@userID=UserID FROM Inserted16--向用户登录日志表中添加新建用户登录日志17INSERT INTO LoginLog VALUES(@userID,getDate())18END19GO2021IF EXISTS(SELECT*FROM sysobjects WHERE xtype='TR'AND [name]='TR_Update_UserInfo_ManagerLog')22DROP TRIGGER TR_Update_UserInfo_ManagerLog23GO24CREATE TRIGGER TR_Update_UserInfo_ManagerLog25ON UserInfo26FOR UPDATE27AS28--接受被更新用户信息的ID29DECLARE@userId INT30--接受更新前用户密码的变量31DECLARE@oldPwd VARCHAR(50)32--接受更新后用户密码的变量33DECLARE@newPwd VARCHAR(50)34--接受更新前用户邮件的变量35DECLARE@oldEmail VARCHAR(50)36--接受更新后用户邮件的变量37DECLARE@newEmail VARCHAR(50)38--从DELETED临时表中获取数据更新前用户数据39SELECT@userId=UserId,@oldPwd=password,@oldEmail=Em ail FROM Deleted40--从INSERTED临时表中获取数据更新后的用户数据41SELECT@newPwd=password,@newEmail=Email FROM Inserte d42--向系统日志表中插入数据43INSERT INTO managerlog VALUES('修改ID为:['+CAST(@use rId AS VARCHAR(5))+']用户信息:<br/>Password:{'+@oldPwd+'}-->Password:{'+@newPwd+'}<br/>Email:{'+@oldEmail+'}-->{'+@ newEmail+'}',getDate())44Go454647--创建当用户表插入新数据时,添加工资表对应记录的触发器48IF EXISTS(SELECT*FROM sysobjects WHERE[xtype]='TR'AN D[name]='Insert_Emp_EmpPayment')49DROP TRIGGER Insert_Emp_EmpPayment50go51CREATE TRIGGER Insert_Emp_EmpPayment52ON Employee153FOR INSERT54AS55DECLARE@empId INT56SELECT@empId=EmpId FROM Inserted57INSERT INTO EmpPayMent VALUES(@empId,800.00,null) 58go5960--创建当向工资表插入数据时,更新工资表中员工奖金61IF EXISTS(SELECT*FROM sysobjects WHERE[xtype]='TR'AN D[name]='Insert_EmpPayment')62DROP TRIGGER Insert_EmpPayment63go64CREATE TRIGGER Insert_EmpPayment65ON EmpPayMent66FOR INSERT67AS68DECLARE@empId INT69SELECT@empId=EmpId FROM Inserted70UPDATE EmpPayMent SET Bonus=50.00WHERE EmpID=@empId 71go。

sql触发器实验

sql触发器实验

实验7 数据完整性实验一.实验目的本实验的目的是通过实验使学生加深对数据完整性的理解,学会创建和使用触发器。

二.相关知识SQL Server实现数据完整性的具体方法有4种:约束、缺省、规则和触发器。

其中约束和缺省在实验一中已接触过。

本实验重点学会创建和使用触发器。

触发器是实施复杂完整性的特殊类型的存储类型。

触发器不需要专门语句调用,当对它所保护数据进行修改时自动激活,以防止对数据进行不正确,未授权或不一致的修改。

创建触发器的语法为:CREA TE TRIGGER <触发器> ON <表名>[WITH ENCRYPTION]FOR {[DELETE][,][INSERT][,][UPDA TE]}[WITH APPEND][NOT FOR REPLICA TION]AS <SQL 语句组>其中:1)WITH ENCRYPTION 为加密选项。

2)DELETE 选项为创建DELETE 触发器。

DELETE触发器的作用是当对表执行DELETE操作时触发器被激活,并从指定表中删除元组,同时将删除的元组放入一个特殊的逻辑表(delete表)中。

触发器的动作可以检查delete表中的数据,以确定下一步该如何处理。

3)INSERT选项为创建INSERT触发器。

INSERT触发器在对指定表中执行插入数据操作时激活,激活后将插入表中的数据拷贝并送入一个特殊的逻辑表(inserted 表)中,触发器会根据INSERT表中的值决定如何处理。

4)UPDA TE选项为创建UPDA TE触发器。

UPDA TE触发器仅在对指定表中进行更新数据操作时激活。

UPDA TE触发器激活后把将要被更新的原数据移入delete表中再将要被更新后的新数据的备份送入insert表中,UPDA TE触发器对delete和inserted表进行检查,并决定如何处理。

5)NOT FOR REPLICA TION 选项说明当一个复制过程在修改一个触发器表时,与该表相关联的触发器不能被执行。

创建触发器sql语句简单例子

创建触发器sql语句简单例子

创建触发器sql语句简单例子在数据库中,触发器是一种特殊的存储过程,它在指定的数据库操作(如插入、更新或删除)发生时自动执行。

触发器可以用于实现数据一致性、完整性以及其他业务逻辑的需求。

本文将介绍创建触发器的SQL语句的简单例子。

在创建触发器之前,我们首先需要明确触发器要针对的表以及触发的事件类型(如插入、更新或删除)。

我们以一个简单的示例来说明,假设有两个表:`Customers`(顾客表)和`Orders`(订单表),并且要在`Orders`表中插入一条新记录时,在`Customers`表中自动更新顾客的订单数量。

以下是创建触发器的SQL语句的简单例子:```sqlCREATE TRIGGER update_order_countAFTER INSERT ON OrdersFOR EACH ROWBEGINUPDATE CustomersSET order_count = order_count + 1WHERE customer_id = NEW.customer_id;END;```解释一下上述SQL语句的具体含义:- `CREATE TRIGGER update_order_count`:创建一个名为`update_order_count`的触发器;- `AFTER INSERT ON Orders`:定义触发器在`Orders`表中插入记录后触发;- `FOR EACH ROW`:指定触发器对每一行的记录执行;- `BEGIN`和`END`之间的代码块:触发器的具体逻辑代码;- `UPDATE Customers SET order_count = order_count + 1 WHERE customer_id = NEW.customer_id;`:在触发器中执行的SQL语句,更新`Customers`表中符合条件的记录。

在上述例子中,每当在`Orders`表中插入一条新记录时,触发器会自动执行,将对应顾客的订单数量加1,并更新到`Customers`表中。

Oracle数据库之PLSQL触发器

Oracle数据库之PLSQL触发器

Oracle数据库之PLSQL触发器Oracle数据库之PL/SQL触发器1. 介绍触发器(trigger)是提供给程序员和数据分析员来保证数据完整性的⼀种⽅法,它是与表事件相关的特殊的存储过程,它的执⾏不是由程序调⽤,也不是⼿⼯启动,⽽是由事件来触发,⽐如当对⼀个表进⾏操作(insert,delete,update)时就会激活它执⾏。

触发器经常⽤于加强数据的完整性约束和业务规则等。

触发器有三种类型,分别是:DML触发器、替代触发器和系统触发器。

DML触发器顾名思义,DML触发器是由DML语句触发的。

例如数据库的INSERT、UPDATE、DELETE操作都可以触发该类型的触发器。

它们可以在这些语句之前或之后触发,或者在⾏级上触发(就是说对于每个受影响的⾏都触发⼀次)。

替代触发器替代触发器只能使⽤在视图上,与DML不同的是,DML触发器是运⾏在DML之外的,⽽替代触发器是代替激发它的DML语句运⾏。

替代触发器是⾏触发器。

系统触发器这种触发器是发⽣在如数据库启动或关闭等系统事件时,不是在执⾏DML语句时发⽣,当然也可以在DDL时触发。

触发器功能强⼤,轻松可靠地实现许多复杂的功能,但是我们也应该慎⽤。

为什么⼜要慎⽤呢?触发器本⾝没有过错,但如果我们滥⽤,会造成数据库及应⽤程序的维护困难。

在数据库操作中,我们可以通过关系、触发器、存储过程、应⽤程序等来实现数据操作,同时约束、缺省值也是保证数据完整性的重要保障。

如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。

2. 触发器组成触发器主要由以下⼏个要素组成:1. 触发事件:引起触发器被触发的事件。

2. 触发时间:触发器是在触发事件发⽣之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该触发器的操作顺序。

3. 触发操作:触发器被触发之后的⽬的和意图,是触发器本⾝要做的事情。

4. 触发对象:包括表、视图、模式、数据库。

SQL Server 2014触发器手把手实战

SQL Server 2014触发器手把手实战

原创内容,下载后删除举行图,内容可见
如何创建触发器(如何禁止递归)
• 多说几句:心细的人这里可能会问了。如果是Update触发 器引发新的Update,那岂不是一直循环下去了? • 确实有这种情况,称之为递归(recursion )。
触发器有两种递归方式: 1. 直接递归 A表上的触发器更改(插入/删除/更新)A表数据,导致A表的触发器再次触 发,这种状况称之为直接递归; 2. 间接递归 A表上的触发器更新B表数据,导致触发B表触发器;而B表触发器又更改A表 数据,导致A表触发器再次触发,这种状况称之为间接递归
如何创建触发器(4)
④ 编译并执行触发器,如下图按钮dentifier ”*****“ could not be bound.”诸如此类的,那肯定还是SQL语句的语法 有毛病,您再检查检查。
⑤ 如果触发器执行成功,则 会出现下面的画面:
若要禁用间接递归,请使用 sp_configure 将 nested triggers 服务器选项设置为 0
原创内容,下载后删除举行图,内容可见
exec sp_configure 'nested triggers', 0 --第二个参数为 1 则为允许
管理触发器
1,修改:修改触发器则是将创建它的语法中的create改成 alter就可以了。 2,删除:drop trigger 3,启用和禁用:alter table语句用于启用和禁用触发器,语 法:alter table table {enable|disable}trigger,其中enable为启 用,disable为禁用 4,列出所有触发器:我不知道别人是怎么做的。我只知道 脚本执行的方式,呵呵: select * from sysobjects where xtype='TR'

实验9 触发器

实验9  触发器

实验 9.1
【实验步骤】
创建和执行触发器
1.用企业管理器为表S创建一级联更新触发器TRIGGER_S。 (1)创建触发器。
创建触发器命令
触发器属性窗口
实验 9.1
创建和执行触发器
创建触发器
实验 9.1
(2)验证触发器的作用
创建和执行触发器
(a)数据表S
(b)数据表SC
(a)数据表S
(b)数据表SC
(a)数据表S 创建触发器TRIGGER_SC
(b)数据表SC
触发器级联更新表S和表SC中的数据
实验 9.1
创建和执行触发器
3.用SQL为表SC创建一触发器Score_sc_tri 要求:当插入一个记录或修改成绩时,确保此记录的成绩在0—100之间。 (1)创建触发器
创建触发器的SQL
数据库jxsk的触发器 对象
表S和表SC中的数据
触发器级联更新表S和表SC中的数据
实验 9.1
创建和执行触发器
2.企业管理器为表SC创建一限制更新触发器TRIGGER_SC 要求:若修改SC表中一记录的学号,则要检查表S中是否存在与该学号相 同的记录,若有则不许修改,若没有则可修改。 (1)创建触发器 (2)验证触发器的作用
实验 9.1
创建和执行触发器
3.用SQL为表SC创建一触发器Score_sc_tri 要求:当插入一个记录或修改成绩时,确保此记录的成绩在0~100之间。
(2)验证触发器的作用
表SC的数据表
验证触发器的SQL操作
操作后的表SC数据
实验 9.1
创建和执行触发器
4.用SQL为表C创建一个级联删除触发器TRIGGER_DC:通过课程名从C表中删 除某课程信息,同时删除SC表中与此课程相关的选课记录 (1)创建触发器

sql触发器的使用及语法

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触发器的使用及语法

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中的触发器是一种特殊的存储过程,它会在特定的数据库操作(如插入、更新、删除)发生时自动执行。

触发器可以用来维护数据的完整性、实现业务规则、日志记录等。

下面我将从触发器的创建、类型、语法和示例等方面介绍相关用法。

1. 创建触发器:在SQL中,可以使用CREATE TRIGGER语句来创建触发器。

语法通常如下:sql.CREATE TRIGGER trigger_name.{BEFORE | AFTER} {INSERT | UPDATE | DELETE}。

ON table_name.FOR EACH ROW.BEGIN.-触发器执行的操作。

END;在这个语法中,trigger_name是触发器的名称,BEFORE或AFTER表示触发的时间点,INSERT、UPDATE、DELETE表示触发的操作,table_name是触发器所在的表,FOR EACH ROW表示每行触发。

2. 触发器类型:BEFORE触发器,在触发操作执行之前触发,可以用来进行数据验证或修改。

AFTER触发器,在触发操作执行之后触发,可以用来记录日志或执行其他后续操作。

3. 触发器语法:触发器的语法包括触发时机(BEFORE或AFTER)、触发的操作(INSERT、UPDATE、DELETE)、触发的表和触发器执行的操作。

在BEGIN和END之间编写触发器的具体逻辑,可以是SQL语句或调用存储过程。

4. 触发器示例:下面是一个简单的触发器示例,当在表中插入新记录时,自动更新另一张表的相关数据:sql.CREATE TRIGGER update_other_table.AFTER INSERT.ON main_table.FOR EACH ROW.BEGIN.UPDATE other_table.SET related_column = related_column + 1。

WHERE id = NEW.id;END;在这个示例中,触发器update_other_table在main_table表中有新记录插入时触发,然后更新other_table表中相关的数据。

触发器实际例子

触发器实际例子

SQL触发器实例1定义:何为触发器?在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分别表示触发事件的表“旧的一条记录”和“新的一条记录”。

mysql的触发器语法

mysql的触发器语法

mysql的触发器语法MySQL中的触发器(Trigger)是一种特殊类型的存储过程,它在指定事件(如INSERT、UPDATE或DELETE)发生时自动执行。

以下是MySQL触发器的基本语法:```sqlCREATE TRIGGER trigger_name trigger_time trigger_event ONtable_name FOR EACH ROWBEGIN-- 触发器执行的SQL语句END;````trigger_name`:触发器的名称。

`trigger_time`:触发时间,指定触发器是在"BEFORE"还是"AFTER"指定的事件发生时执行。

`trigger_event`:触发的事件,指定触发器是在"INSERT"、"UPDATE"还是"DELETE"事件发生时执行。

`table_name`:触发器所关联的表名。

`BEGIN ... END`:触发器要执行的SQL语句块。

示例:创建一个在INSERT事件后执行的触发器,当在"employees"表中插入一条新记录后,将自动给该记录的"salary"列加薪10%。

```sqlCREATE TRIGGER after_insert_triggerAFTER INSERT ON employeesFOR EACH ROWBEGINUPDATE employees SET salary = salary WHERE id = ;END;```请注意,触发器的具体语法和功能可能会根据MySQL的版本和配置有所不同。

在使用触发器之前,请确保您已经仔细阅读了MySQL的官方文档,并根据您的数据库环境进行了适当的调整。

sql触发器实例

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)。

SQLServer触发器实例详解

SQLServer触发器实例详解

SQLServer触发器实例详解Microsoft SQL Server™ 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。

触发器是⼀种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。

触发器主要是通过事件进⾏触发被⾃动调⽤执⾏的。

⽽存储过程可以通过存储过程的名称被调⽤。

Ø 什么是触发器触发器对表进⾏插⼊、更新、删除的时候会⾃动执⾏的特殊存储过程。

触发器⼀般⽤在check约束更加复杂的约束上⾯。

触发器和普通的存储过程的区别是:触发器是当对某⼀个表进⾏操作。

诸如:update、insert、delete这些操作的时候,系统会⾃动调⽤执⾏该表上对应的触发器。

SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语⾔语句⽽激发,这些语句有create、alter、drop语句。

优点触发器可通过数据库中的相关表实现级联更改;通过级联引⽤完整性约束可以更有效地执⾏这些更改。

触发器可以强制⽐⽤ CHECK 约束定义的约束更为复杂的约束。

与 CHECK 约束不同,触发器可以引⽤其它表中的列。

例如,触发器可以使⽤另⼀个表中的 SELECT ⽐较插⼊或更新的数据,以及执⾏其它操作,如修改数据或显⽰⽤户定义错误信息。

触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。

DML触发器分为:1、 after触发器(之后触发)a、 insert触发器b、 update触发器c、 delete触发器2、 instead of 触发器(之前触发)其中after触发器要求只有执⾏某⼀操作insert、update、delete之后触发器才被触发,且只能定义在表上。

⽽instead of触发器表⽰并不执⾏其定义的操作(insert、update、delete)⽽仅是执⾏触发器本⾝。

既可以在表上定义instead of触发器,也可以在视图上定义。

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

SQL触发器实例讲解SQL 资料2009-07-23 14:44:07 阅读6072 评论9 字号:大中小订阅定义:何为触发器?在SQL Serv er里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。

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

常见的触发器有三种:分别应用于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表中创建触发器f or 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记录并写入新纪录。

对于2,创建一个Delet e触发器Create trigger trdStudentOn Studentf or DeleteAsDelete BorrowRecordFrom BorrowRecord br , Delted dWhere br.StudentID=d.StudentID从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。

SQL触发器实例2/*建立虚拟测试环境,包含:表[卷烟库存表],表[卷烟销售表]。

请大家注意跟踪这两个表的数据,体会触发器到底执行了什么业务逻辑,对数据有什么影响。

为了能更清晰的表述触发器的作用,表结构存在数据冗余,且不符合第三范式,这里特此说明。

*/USE MasterGOIF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ‟U‟ AND NAME = ‟卷烟库存表‟)DROP TABLE 卷烟库存表GOIF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ‟U‟ AND NAME = ‟卷烟销售表‟)DROP TABLE 卷烟销售表GO--业务规则:销售金额= 销售数量* 销售单价业务规则。

CREATE TA BLE 卷烟销售表(卷烟品牌VARCHAR(40) PRIMARY KEY NOT NULL,购货商VARCHAR(40) NULL,销售数量INT NULL,销售单价MONEY NULL,销售金额MONEY NULL)GO--业务规则:库存金额= 库存数量* 库存单价业务规则。

CREATE TABLE 卷烟库存表(卷烟品牌VARCHAR(40) PRIMARY KEY NOT NULL,库存数量INT NULL,库存单价MONEY NULL,库存金额MONEY NULL)GO--创建触发器,示例1/*创建触发器[T_INSERT_卷烟库存表],这个触发器较简单。

说明:每当[卷烟库存表]发生INSERT 动作,则引发该触发器。

触发器功能:强制执行业务规则,保证插入的数据中,库存金额= 库存数量* 库存单价。

注意:[INSERTED]、[DELETED]为系统表,不可创建、修改、删除,但可以调用。

重要:这两个系统表的结构同插入数据的表的结构。

*/IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ‟TR‟ AND NAME = ‟T_INSER T_卷烟库存表‟) DROP TRIGGER T_INSERT_卷烟库存表GOCREATE TRIGGER T_INSERT_卷烟库存表ON 卷烟库存表FOR INSERTAS--提交事务处理BEGIN TRANSACTION--强制执行下列语句,保证业务规则UPDATE 卷烟库存表SET 库存金额= 库存数量* 库存单价WHERE 卷烟品牌IN (SELECT 卷烟品牌f rom INSERTED)COMMIT TRANSAC TIONGO/*针对[卷烟库存表],插入测试数据:注意,第一条数据(红塔山新势力)中的数据符合业务规则,第二条数据(红塔山人为峰)中,[库存金额]空,不符合业务规则,第三条数据(云南映像)中,[库存金额]不等于[库存数量]乘以[库存单价],不符合业务规则。

第四条数据库存数量为0。

请注意在插入数据后,检查[卷烟库存表]中的数据是否库存金额= 库存数量* 库存单价。

*/INSERT INTO 卷烟库存表(卷烟品牌,库存数量,库存单价,库存金额)SELECT ‟红塔山新势力‟,100,12,1200 UNION ALLSELECT ‟红塔山人为峰‟,100,22,NULL UNION ALLSELECT ‟云南映像‟,100,60,500 UNION ALLSELECT ‟玉溪‟,0,30,0GO--查询数据SELECT * FROM 卷烟库存表GO/*结果集RecordId 卷烟品牌库存数量库存单价库存金额-------- ------------ -------- ------- ---------1 红塔山新势力100 12.0000 1200.00002 红塔山人为峰100 22.0000 2200.00003 云南映像100 60.0000 6000.00004 玉溪0 30.0000 .0000(所影响的行数为 4 行)*/--触发器示例2/*创建触发器[T_INSERT_卷烟销售表],该触发器较复杂。

说明: 每当[卷烟库存表]发生INSERT 动作,则引发该触发器。

触发器功能:实现业务规则。

业务规则: 如果销售的卷烟品牌不存在库存或者库存为零,则返回错误。

否则则自动减少[卷烟库存表]中对应品牌卷烟的库存数量和库存金额。

IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ‟TR‟ AND NAME = ‟T_INSER T_卷烟销售表‟) DROP TRIGGER T_INSERT_卷烟销售表GOCREATE TRIGGER T_INSERT_卷烟销售表ON 卷烟销售表FOR INSERTASBEGIN TRANSACTION--检查数据的合法性:销售的卷烟是否有库存,或者库存是否大于零IF NOT EXISTS (SELECT 库存数量FROM 卷烟库存表WHERE 卷烟品牌IN (SELECT 卷烟品牌FROM INSERTED))BEGIN--返回错误提示RAISERROR(‟错误!该卷烟不存在库存,不能销售。

‟,16,1)--回滚事务ROLLBACKRETURNENDIF EXISTS (SELECT 库存数量FROM 卷烟库存表WHERE 卷烟品牌IN (SELECT 卷烟品牌FROM INSERTED) AND库存数量<= 0)BEGIN--返回错误提示RAISERROR(‟错误!该卷烟库存小于等于0,不能销售。

‟,16,1)--回滚事务ROLLBACKRETURNEND--对合法的数据进行处理--强制执行下列语句,保证业务规则UPDATE 卷烟销售表SET 销售金额= 销售数量* 销售单价WHERE 卷烟品牌IN (SELECT 卷烟品牌FROM INSERTED)DECLARE @卷烟品牌VARCHAR(40)SET @卷烟品牌= (SELEC T 卷烟品牌FROM INSERTED)DECLARE @销售数量MONEYSET @销售数量= (SELEC T 销售数量FROM INSERTED)UPDATE 卷烟库存表SET 库存数量= 库存数量- @销售数量,库存金额= (库存数量- @销售数量)*库存单价WHERE 卷烟品牌= @卷烟品牌COMMIT TRANSAC TIONGO--请大家自行跟踪[卷烟库存表]和[卷烟销售表]的数据变化。

--针对[卷烟销售表],插入第一条测试数据,该数据是正常的。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)SELECT ‟红塔山新势力‟,‟某购货商‟,10,12,1200GO--针对[卷烟销售表],插入第二条测试数据,该数据销售金额不等于销售单价* 销售数量。

--触发器将自动更正数据,使销售金额等于销售单价* 销售数量。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)SELECT ‟红塔山人为峰‟,‟某购货商‟,10,22,2000GO--针对[卷烟销售表],插入第三条测试数据,该数据中的卷烟品牌在卷烟库存表中找不到对应。

--触发器将报错。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)SELECT ‟红河V8‟,‟某购货商‟,10,60,600GO/*结果集服务器: 消息50000,级别16,状态1,过程T_INSERT_卷烟销售表,行15错误!该卷烟不存在库存,不能销售。

*/--针对[卷烟销售表],插入第三条测试数据,该数据中的卷烟品牌在卷烟库存表中库存为0。

--触发器将报错。

相关文档
最新文档