SQL触发器
- 格式:doc
- 大小:125.00 KB
- 文档页数:7
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查询触发器语句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触发器语句的示例,它们展示了触发器的灵活应用,可以帮助我们实现复杂的业务逻辑和数据完整性约束。
sql触发器触发器是⼀种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。
触发器主要是通过事件进⾏触发被⾃动调⽤执⾏的。
⽽存储过程可以通过存储过程的名称被调⽤。
Ø 什么是触发器触发器对表进⾏插⼊、更新、删除的时候会⾃动执⾏的特殊存储过程。
触发器⼀般⽤在check约束更加复杂的约束上⾯。
触发器和普通的存储过程的区别是:触发器是当对某⼀个表进⾏操作。
诸如:update、insert、delete这些操作的时候,系统会⾃动调⽤执⾏该表上对应的触发器。
SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语⾔语句⽽激发,这些语句有create、alter、drop语句。
DML触发器分为:1、 after触发器(之后触发)a、 insert触发器b、 update触发器c、 delete触发器2、 instead of 触发器(之前触发)其中after触发器要求只有执⾏某⼀操作insert、update、delete之后触发器才被触发,且只能定义在表上。
⽽instead of触发器表⽰并不执⾏其定义的操作(insert、update、delete)⽽仅是执⾏触发器本⾝。
既可以在表上定义instead of触发器,也可以在视图上定义。
触发器有两个特殊的表:插⼊表(instered表)和删除表(deleted表)。
这两张是逻辑表也是虚表。
有系统在内存中创建者两张表,不会存储在数据库中。
⽽且两张表的都是只读的,只能读取数据⽽不能修改数据。
这两张表的结果总是与被改触发器应⽤的表的结构相同。
当触发器完成⼯作后,这两张表就会被删除。
Inserted表的数据是插⼊或是修改后的数据,⽽deleted表的数据是更新前的或是删除的数据。
对表的操作Inserted逻辑表Deleted逻辑表增加记录(insert)存放增加的记录⽆删除记录(delete)⽆存放被删除的记录修改记录(update)存放更新后的记录存放更新前的记录Update数据的时候就是先删除表记录,然后增加⼀条记录。
sql触发器实例(原创版)目录1.SQL 触发器的概念2.SQL 触发器的分类3.SQL 触发器的实例4.SQL 触发器的使用场景5.SQL 触发器的优缺点正文1.SQL 触发器的概念SQL 触发器是一种在对数据库表执行某些操作(如插入、更新或删除数据)时自动执行的存储过程。
它可以在数据表发生变化时自动维护数据一致性,提高数据处理的效率。
2.SQL 触发器的分类根据触发时机,SQL 触发器可以分为以下三种类型:- BEFORE 触发器:在数据更改操作之前执行,可以用来验证数据是否符合要求。
- AFTER 触发器:在数据更改操作之后执行,可以用来记录数据变更历史。
- INSTEAD OF 触发器:在数据更改操作过程中执行,可以用来替代原始操作。
3.SQL 触发器的实例假设有一个名为“employees”的表,包含以下字段:id(主键)、name (姓名)、salary(工资)。
现在,我们希望在向该表插入新数据时,自动更新工资总额。
可以通过创建一个 AFTER 触发器来实现。
创建触发器的 SQL 语句如下:```sqlCREATE TRIGGER update_total_salaryAFTER INSERTON employees FOR EACH ROWBEGINUPDATE employeesSET total_salary = total_salary + NEW.salaryWHERE id = NEW.id;END;```4.SQL 触发器的使用场景SQL 触发器可以用于以下场景:- 强制数据一致性:例如,在更新某个字段时,确保其他相关字段也同时更新。
- 数据审计:记录数据变更历史,便于追踪和审计。
- 数据维护:在数据表中执行定期维护任务,如更新统计信息、删除无效数据等。
5.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.测试触发器现在我们尝试插入一些记录来测试触发器的功能。
第16章SQL触发器前面已经介绍过了表、视图、存储过程以及函数的创建。
一般而言,创建这些对象后,需要配置一些对应的操作。
例如,执行SELECT语句查询数据,执行EXEC命令执行存储过程等。
SQL也支持自动执行的对象,对数据的更改作出反应,即触发器。
16.1触发器的基本概念触发器是一种特殊的存储过程,它在表的数据变化时发生作用。
触发器可以维护数据完整性。
16.1.1触发器简介触发器在数据库里以独立的对象存储,与存储过程不同的是,存储过程通过其他程序来启动运行,而触发器是由一个事件来启动运行。
即当某个事件发生时,触发器自动地隐式运行。
并且,触发器不能接收参数。
触发器对象定义了触发器的特征和被调用时采取的行动。
而这些动作是通过一个或多个SQL语句来实现的。
SQL支持3种类型的触发器:INSERT(插入)、UPDATE(更新)和DELETE(删除)。
当向表中插入数据、更新数据或删除数据时,触发器就被调用。
通过给表定义一个或多个触发器,可以指定哪个数据修改时,可以激发触发器。
16.1.2触发器执行环境触发器执行环境包含了触发器正确执行所必需的信息。
这些信息主要是触发器本身的细节和触发器所定义的目标表。
另外,触发器执行环境还包括一个或两个测试表,称之为INSERTED 表和DELETED表。
测试表是虚表,用于保存目标表更新、插入或删除的数据信息。
这些测试表用来测试数据修改的结果,以及设置触发器行动的条件。
用户不能直接修改测试表中的数据,但能在SELECT语句中,使用这些表来检测INSERT,UPDATE或DELETE 的结果。
各种类型触发器用到的测试表如图16.1所示(针对SQL Server数据库系统而言)。
第16章SQL触发器**…新数据INSERTt r i g g e r表I n s e r e d表**…被删除数据DELETEt r i g g er表D e l e t e d表**…被删除数据UPDATEt r i g g e r表D e l e t e d表新数据(修改的数据)I n s e r e d表修改的数据图16.1触发器测试表deleted表存放了DELETE和UPDA TE语句中相关行的副本。
SQL触发器的创建和使用SQL触发器(trigger)是用来更改或响应数据库系统中的特定动作或事件的数据库对象,可以定义它们在表中特定数据发生一定的变化时自动地执行的SQL语句,一旦被触发,触发器就会自动地执行被定义的SQL语句。
在SQL Server 2005中,可以创建触发器来实现数据库的安全性和完整性。
触发器的定义可以放置在视图之外,以便于管理,可以动态地添加,修改和删除触发器,也可以创建多种不同的触发器。
一.创建触发器在SQL Server 2005中,可以使用CREATE TRIGGER语句来创建触发器。
如下所示:SQLCREATE TRIGGER trg_Customer_InsertON Customer FOR INSERTASBEGIN-- Trigger logic goes hereEND上面的语句创建一个名为 trg_Customer_Insert 的触发器,作用在Customer 表上,当 INSERT 操作发生时,则自动执行 Trigger logic。
二.使用触发器一旦触发器被创建,有两种方法可以使其起作用,即:对表的INSERT操作对表的UPDATE操作在使用触发器之前,有必要检查它的权限问题,因为只有拥有ALTER 权限的用户才能执行CREATETRIGGER或ALTERTRIGGER的操作。
1.对表的INSERT操作当插入一条记录到表中时,触发器将会自动执行:SQLINSERT INTO Customers( CustomerID, CustomerName, Address, City, State, ZipCode )2.对表的UPDATE操作当更新表中的记录时,触发器将会自动执行:SQLUPDATE CustomersSET Address = '456 Main Street'三.其他常用语句1.删除触发器。
SQL数据库触发器、事务触发器类型有两种:1、AFTER(FOR)触发器在动作执⾏之后触发(增删改执⾏完成后,触发器中的代码再执⾏),不能为视图指定for触发器,只能为表指定该触发器。
2、instead of触发器可以理解为替代触发操作执⾏,写了这个之后,写的执⾏代码就没有⽤了,就被触发器的代码覆盖了同时DML 触发器使⽤ deleted 和 inserted 逻辑(概念)表。
它们在结构上类似于定义了触发器的表,即对其尝试执⾏了⽤户操作的表。
在 deleted 和 inserted 表保存了可能会被⽤户更改的⾏的旧值或新值。
⑴对于INSERT 操作,inserted保留新增的记录,deleted⽆记录⑵对于DELETE 操作,inserted⽆记录,deleted保留被删除的记录⑶对于UPDATE操作,inserted保留修改后的记录,deleted保留修改前的记录创建触发器create trigger Insert_Student --命名规范on student --针对于哪⼀个表for insert --针对于哪⼀个动作来触发as触发执⾏的代码段gocreate trigger Delete_Infoon infoinstead of deleteasgocreate trigger Delete_Nationon nationfor deleteasgoView Code注:触发器常⽤的为级联删除:create trigger delete_studenton studentinstead of deleteas--如果要删除student表数据,那么需要级联删除declare @sno varchar(20);set @sno = sno from deleted --deleted固定格式,为删除执⾏所能删除的数据,并没有执⾏删除,⽽是把他们显⽰出来,在这获得要删除的数据的sno,然后先删除其他表中此sno的数据delete from score where sno = @sno;delete from student where sno = @sno;gocreate trigger Delete_Infoon infoinstead of deleteasdeclare@c varchar(20)select@c= code from deleteddelete from work where infocode=@cdelete from family where infocode=@cdelete from info where code=@cgoView Code事务数据库事务(Database Transaction) 是指作为单个逻辑⼯作单元执⾏的⼀系列操作。
sql 触发器类型SQL触发器类型一、什么是SQL触发器SQL触发器是一种数据库对象,它可以在特定的数据库事件发生时自动执行一段预定义的SQL代码。
当满足触发器定义的条件时,触发器会被激活并执行相应的操作,它可以用来实现数据的验证、约束和业务逻辑的处理等功能。
二、SQL触发器类型在SQL中,触发器可以分为三种类型:BEFORE触发器、AFTER触发器和INSTEAD OF触发器。
下面将分别介绍这三种触发器类型的特点和应用场景。
1. BEFORE触发器BEFORE触发器是指在触发事件之前被激活的触发器。
它可以在数据被插入、更新或删除之前执行一些操作,如数据验证、默认值设置等。
BEFORE触发器可以通过修改NEW关键字的值来改变将要插入、更新或删除的数据。
举例来说,当用户向订单表中插入一条数据时,BEFORE触发器可以检查该订单是否满足一定条件,如果不满足则阻止插入操作;或者可以在插入数据时自动设置一些默认值,如订单创建时间等。
2. AFTER触发器AFTER触发器是指在触发事件之后被激活的触发器。
它可以在数据被插入、更新或删除之后执行一些操作,如数据统计、日志记录等。
AFTER触发器不能修改将要插入、更新或删除的数据。
例如,当用户成功完成一笔订单支付时,AFTER触发器可以更新相关的统计数据,如销售额、订单数量等;或者可以记录支付日志,方便后续的查询和分析。
3. INSTEAD OF触发器INSTEAD OF触发器是指在触发事件之前被激活的触发器,但它与BEFORE触发器不同的是,INSTEAD OF触发器可以替代原始操作进行处理。
它可以在数据被插入、更新或删除之前执行自定义的操作,并决定是否执行原始操作。
举例来说,当用户向视图进行插入操作时,INSTEAD OF触发器可以拦截插入操作并执行一些额外的处理,如数据转换、数据过滤等。
这样可以保证视图的数据始终符合预期的规范和要求。
三、总结SQL触发器是一种强大的数据库对象,它可以在特定的数据库事件发生时自动执行一段预定义的SQL代码。
一、实验名称:触发器与存储过程
二、实验目的:在SQL Server环境下熟悉如何用SQL编写触发器和存储过程。
三、实验内容:创建一个供应商-项目-零件数据库spj,由四个数据表构成:S(sno,sname,status,city)
P(pno,pname,color,weight);
J(jno,jname,city);
Spj(sno,pno,jno,qty)
用SQL实现如下数据库操作:
1. 用SQL语句创建上述数据库,并满足一定的完整性约束(主键和外键)。
创建数据库SPJ,SQL语言如下:
S(sno,sname,status,city):
create table S
(
sno char(6) primary key,
sname char(6),
status int,
city char(4),
)
P(pno,pname,color,weight);
create table P
(
pno char(6) primary key,
color char(2),
weight int,
)
J(jno,jname,city);
create table J
(
jno char(6) primary key,
jname char(6),
city char(6),
)
Spj(sno,pno,jno,qty)
create table SPJ
(
sno char(6),
pno char(6),
jno char(6),
qty int,
primary key(sno,pno,jno),
foreign key(sno) references S(sno),
foreign key(pno) references P(pno),
foreign key(jno) references J(jno),
)
2.用SQL修改spj表,删除三个外键的约束。
(1)删除SPJ中三个外键的约束:
查询分析器——对象浏览器——RJXY68——SPJ——用户表——dbo.SPJ——约束——选中三个外键约束,右键单击删除
(2)查询语句中编写如下语句创建并命名外键:
alter table SPJ
add constraint fs foreign key(sno) references S(sno)
alter table SPJ
add constraint fp foreign key(pno) references p(pno)
alter table SPJ
add constraint fj foreign key(jno) references J(jno)
(3)删除已命名的外键:
alter table SPJ
drop constraint fs
alter table SPJ
drop constraint fp
alter table SPJ
drop constraint fj
3. (1)创建触发器t1,修改零件表p表的零件号pno的时候自动修改供应情况表spj表的pno. create trigger t1 on P
for update
as
if update(pno)
update SPJ
set SPJ.pno=inserted.pno
from SPJ,inserted,deleted
where SPJ.pno=deleted.pno
(2)查询p表和spj表。
select *
from P
select *
from SPJ
(3)将p表的pno=’p1’的记录更改成‘p8’,查询p表和spj表update P
set pno='P8'
where pno='P1'
4.(1)创建触发器t2,删除表s表的供应商时候自动删除供应情况表spj表的相关记录. create trigger t2 on S
for delete
as delete S
from SPJ,deleted
where SPJ.sno=deleted.sno
(2)查询s表和spj表。
select *
from S
select *
from SPJ
(3)将s表的sno=’s1’的记录删除。
delete from S
where sno='S1'
select *
from S
select *
from SPJ
5.创建一个存储过程ins1,可以向s表插入供应商记录。
create procedure ins1
(@sno char(6) ,
@sname char(6),
@status int,
@city char(4))
as insert into S
values(@sno,@sname,@status,@city)
exec ins1 'S6','',40,'河南'
select *
from S
6.为该数据库创建一个用户u1,并能进入访问该数据库。
sp_addlogin 'u1','123abc','SPJ'
sp_grantdbaccess 'u1','u1'
7.创建一个用户角色R1,具有查询、修改sname、和删除s表的权限。
sp_addrole 'R1'
grant select,update(sname),delete on S to R1
8. 将角色R1赋予用户u1
sp_addrolemember R1,u1。