文章目录
一、触发器
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表 事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对一个表 进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务 规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。 【触发器和存储过程的区别】 触发器与存储过程的区别是运行方式的不同,触发器不能执行EXECUTE语句调用,而是在用户执行 Transact-SQL语句时自动触发执行而存储过程需要用户,应用程序或者触发器来显示地调用并执行。
【触发器的优点】
a.触发器是自动的。当对表中的数据做了任何修改之后立即被激活。 b.触发器可以通过数据库中的相关表进行层叠修改。 c.触发器可以强制限制。这些限制比用CHECK约束所定义的更复杂。与CHECK约束不同的是,触发器可 以引用其他表中的列。
【触发器的作用】
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂参照完整性和数据的一致性,它能够 对数据库中的相关表进行级联修改,提高比CHECK约束更复杂的的数据完整性,并自定义错误消息。 触发器的主要作用主要有以下接个方面: 强制数据库间的引用完整性 级联修改数据库中所有相关的表,自动触发其它与之相关的操作 跟踪变化,撤销或回滚违法操作,防止非法修改数据 返回自定义的错误消息,约束无法返回信息,而触发器可以 触发器可以调用更多的存储过程
【触发器的分类】
SqlServer包括三种常规类型的触发器:DML触发器、DDL触发器和登录触发器。
1.DML(数据操作语言,Data Manipulation Language)触发器
DML触发器是一些附加在特定表或视图上的操作代码,当数据库服务器中发生数据操作语言事件时执 行这些操作。
SqlServer中的DML触发器有三种:
insert触发器:向表中插入数据时被触发;
delete触发器:从表中删除数据时被触发;
update触发器:修改表中数据时被触发。
当遇到下列情形时,应考虑使用DML触发器: 通过数据库中的相关表实现级联更改 防止恶意或者错误的insert、update和delete操作,并强制执行check约束定义的限制更为复杂的其他 限制。 评估数据修改前后表的状态,并根据该差异才去措施。
2.DDL(数据定义语言,Data Definition Language)触发器
DDL触发器是当服务器或者数据库中发生数据定义语言(主要是以create,drop,alter开头的语句)事件时 被激活使用,使用DDL触发器可以防止对数据架构进行的某些更改或记录数据中的更改或事件操作。
【触发器的工作原理】
触发器触发时: 系统自动在内存中创建deleted表或inserted表;只读,不允许修改,触发器执行完成后,自动删 除。
inserted表: 临时保存了插入或更新后的记录行; 可以从inserted表中检查插入的数据是否满足业务需求; 如果不满足,则向用户发送报告错误消息,并回滚插入操作。
deleted表: 临时保存了删除或更新前的记录行; 可以从deleted表中检查被删除的数据是否满足业务需求; 如果不满足,则向用户报告错误消息,并回滚插入操作。
【创建触发器】
CREATE TRIGGER trigger_name
ON table_name
[WITH ENCRYPTION]
FOR | AFTER | INSTEAD OF [DELETE, INSERT, UPDATE]
AS
GO
T-SQL语句
– with encryption 表示加密触发器定义的sql文本
– delete,insert,update指定触发器的类型
二、事务和锁
事务是SQL Server中单个的逻辑工作单元,该单元被作为一个整体进行处理,事务保证连续多个操 作必须全部执行成功,否则必须立即恢复到任何操作执行前的状态,即执行事务的结果是要么全部将数据所 要执行的操作完成,要么全部数据修改。
事务作为单个逻辑工作单元执行的一系列操作,事务的处理必须满足ACID原则。
BEGIN TRAN:设置起始点。
COMMIT TRAN:使事务成为数据库中永久的、不可逆转的一部分。 ROLLBACK TRAN:本质上说想要忘记它曾经发生过。
SAVE TRAN:创建一个特定标记符,只允许部分回滚。
锁是一种防止在某对象执行动作的一个进程与已在该对象上执行的其他进行相冲突的机制。也就是说, 如果有其他人在操作某个对象,那么你旧不能在该对象上进行操作。你能否执行操作取决于其他用户正在进 行的操作。
代码示例
use testdbs
go
-- 一、操作之前准备的数据
CREATE TABLE student
(
stno char(6) NOT NULL PRIMARY KEY,
stname char(8) NOT NULL,
stsex char(2) NOT NULL,
stbirthday date NOT NULL,
speciality char(12) NULL,
tc int NULL
)
GO
CREATE TABLE course
(
cno char(3) NOT NULL PRIMARY KEY,
cname char(16) NOT NULL,
credit int NULL,
tno char (6) NULL,
)
GO
CREATE TABLE score
(
stno char (6) NOT NULL,
cno char(3) NOT NULL,
grade int NULL,
PRIMARY KEY(stno,cno)
)
GO
CREATE TABLE teacher
(
tno char (6) NOT NULL PRIMARY KEY,
tname char(8) NOT NULL,
tsex char (2) NOT NULL,
tbirthday date