sqlserver2000触发器

合集下载

SQLSERVER2024使用INSTEADOF触发器

SQLSERVER2024使用INSTEADOF触发器

SQLSERVER2024使用INSTEADOF触发器INSTEAD OF触发器是一种特殊的触发器,它可在SQL Server中首次
引入,它主要用来替换 DML 语句,取代了 SQL Server 以前的 DML 触发器,例如AFTER 或 BEFORE 形式的触发器。

INSTEAD OF触发器最初出现在SQL Server 2000 中,用于替换标准
的触发器,如 BEFORE 或 AFTER 触发器。

与标准触发器不同,INSTEAD
OF触发器可以定义在视图、表和更新视图上。

INSTEAD OF触发器不是用
来检测表中发生的更改,而是用来在更改发生前拦截这些更改,以便进行
处理。

INSTEADOF触发器具有多种应用,可以用来实现复杂的逻辑,还可以
替换有关的视图更新,而不必试图在表中使用触发器。

INSTEADOF触发器还可以用来管理分布式复制环境中的可能冲突。

例如,当多个客户端将更新发送到多个服务器时,可以使用INSTEADOF触发
器来确定谁是胜利者,谁可以更新表,而谁的更新将被丢弃。

INSTEAD OF触发器在SQL Server 2024 中也新增了一些功能。

例如,它可以在表上定义多个INSTEAD OF触发器,可以使用多条语句来定义触
发器,可以在INSTEAD OF触发器中定义新的标识符,以及可以在INSTEAD OF触发器中执行处理函数。

INSTEADOF触发器的使用除了可以替换传统触发器外,还可以实现一
些复杂或新的行为,可以替换更新视图,而不是更新表,可以控制分布式
复制环境中的多个客户端。

SQL Server 2000企业管理器

SQL Server 2000企业管理器

2.4配置服务器
常 规 属 性
2.4配置服务器(续)
安 全 属 性
2.4配置服务器(续)
连 接 属 性
SQL Server 2000企业管理器(续)

提供跨服务器的拖放控制操作 管理用户帐户 建立Transact-SQL命令语句及管理和控制 管理SQL Server 2000对象
2.2 启动和关闭、连接和断开服务器

启动与关闭服务器方法
二、SQL Server 2000企业管理器


管理SQL Server 2000的最重要工具 是一个服务器集成管理环境,以层叠列表的形 式显示和管理SQL Server 2000对象 具体管理内容


管理SQL Server 2000服务器 建立与管理数据库 建立与管理表、视图、存储过程、触发器、角色、规则、 默认值等数据库对及用户定义的数据类型 备份数据库和事务日志、恢复数据库、复制数据库 设置任务调度 设置警报


Windows启动时自动启动 SQL Server 2000服务管理器启动 企业管理器启动

例如
2.2 (续)
2.3注册服务器



SQL Server 2000中可以同时管理多个数 据库服务器,包括一个本地数据库服务 器和其它远程数据库服务器 安装SQL Server 2000后,通常将本机自 动作为一个数据库服务器 对于远程数据库服务器,必须进行注册

SQLSERVER课件触发器

SQLSERVER课件触发器
9
Insert 触发器
当试图向表中插入数据时,将执行Insert触 发器
Insert 触发器执行下列操作:
向Inserted表中插入一个新行的副本 检查Inserted表中的新行,确定是否要阻止该插
入操作。 如果所插入的行中的值是有效的,则将该行插
入到触发器表中。
10
Insert 触发器示例
Sp_configure ‘nested trigger’,1
要禁用触发器嵌套,请执行下面的语句:
Sp_configure ‘nested trigger’,0
21
触发器与性能
由触发器引起的开销通常较低。 大部分时间花费在引用逻辑表以外的其它表上。 Deleted和Inserted逻辑表始终位于内存中。
15
DELETE触发器示例
16
不能在触发器中使用的语句
17
INSTEAD OF 触发器
包含代替原始数据操作语句的代码 主要优点是可以使不能更新的视图支持更新 另外,可以拒绝批处理中的某系部分同事允许批
处理的其它部分成功
18
视图的INSTEAD OF触发器示例
19
级联触发器
级联触发器用于强制引用的完整性 当某个表发生修改时,级联触发器会修改
的更新
12
列级UPDATE触发器
13表级UPDATE触发器示例源自14DELETE触发器
当试图从表中删除数据时,将执行DELETE 触发器
DELETE触发器执行下列操作:
从触发器表中删除行。 将删除的行插入到Deleted表中。 检查Deleted表中的行,以确定是否需要或应如
何执行触发器操作。
3
触发器触发示例
员工表
退休员工表

第一章SQL Server 2000基础知识

第一章SQL Server 2000基础知识

一个数据库至少有一个主要数据文件和一个事务日 志文件。
1.3.1 SQL Server2000的系统数据库和示例数据库
安装SQL Server2000之后,系统会在Microsoft SQLServer\MSSQL\Data路径下自动创建4个系统数据库 (master、model、msdb、tempdb)和2个示例数据库 (Northwind、pubs)。 • Master数据库:它是SQLServer系统最重要的数据库,它记 录了SQLServer系统所有的系统信息。 • Model数据库:它是所有用户数据库和tempdb数据库的模板 数据库。 • Msdb数据库:它是代理服务数据库,为其警报、任务调度和 记录操作员的操作提供存储空间。 • Tempdb数据库:它是一个临时数据库,它为所有的临时表、 临时存储过程及其他临时操作提供存储空间。 • Northwind和pubs数据库:它们是两个实例数据库,可以作 为学习SQLServer的学习工具。
本章目标
了解数据库基本知识 掌握SQL Server2000的安装 熟悉SQL Server2000的主要管理工具 掌握数据库的基本操作
1.1 数据库基本知识
信息、数据、数据库、数据库管理系统、数据库系 统 关系型数据库的概念
1.1.1信息、数据、数据库、数据库管理系统、数据库系统
① 信息:通俗的讲,信息就是人们最关心事情的消息,信息是可感知的、 信息:
1.2.2 SQL Server2000 的主要管理工具
查询分析器(SQL Server Query Analyzer):是一个图形化 的执行T-SQL查询语句的强大工具。在查询分析器里可以交互式 地输入和执行各种T-SQL语句,并且在一个窗口中可以同时查看 T-SQL语句和其结果集;可以在查询分析器中同时执行多个TSQL语句,也可以执行脚本文件中的部分语句。

sqlserver 触发器if else语句

sqlserver 触发器if else语句

sqlserver 触发器if else语句在SQLServer中,触发器是一种特殊的存储过程,它们在数据库中的表上自动执行,通常用于在表上进行特定操作时执行其他操作。

在触发器中,可以使用 IF ELSE 语句以根据条件执行不同的操作。

以下是一个示例触发器,其中包含 IF ELSE 语句:CREATE TRIGGER [dbo].[trig_example]ON [dbo].[example_table]AFTER INSERT, UPDATE, DELETEASBEGIN-- Check if INSERTIF EXISTS (SELECT * FROM inserted)BEGINPRINT 'New rows added'-- Insert additional data into another tableINSERT INTO [dbo].[additional_table] (column1, column2) SELECT column3, column4 FROM insertedEND-- Check if UPDATEELSE IF EXISTS (SELECT * FROM deleted)BEGINPRINT 'Rows updated'-- Update data in another tableUPDATE [dbo].[additional_table] SET column1 =inserted.column3FROM [dbo].[additional_table]INNER JOIN inserted ON inserted.id =[dbo].[additional_table].idEND-- Check if DELETEELSEBEGINPRINT 'Rows deleted'-- Delete data from another tableDELETE FROM [dbo].[additional_table]WHERE id IN (SELECT id FROM deleted)ENDEND该触发器在 example_table 上创建,并根据 INSERT、UPDATE 和DELETE 操作执行不同的操作。

SQL Server 2000数据库中实现数据参照完整性的方法分析

SQL Server 2000数据库中实现数据参照完整性的方法分析

外键约束 、 触发器来保证数据的参照完整性。 关键词 S L evr00 数据完整性 参照完整性 外键约束 触发器 Q re 0 S 2
中图 分 类号 T 3 1 3 P 1. 2 1 文献 标 识 码 A 文章编号 1 13— 6 4 0 1 0 5 1
Th t f r nilne ryo ay i e Daa Re e e t t g i f aI t An lssi SQLSev r 0 0 Daa a e n re 0 t b s s 2
gvsa xm l t a a z o h Q e e 0 0 e srsrf e t neryo a ho g efri e i nea pe o n yehw teS L sr r2 0 nue e rn a itgi f t tru ht o g ky e l v e i l t da h en
一 首先创建用户数据库
商品销售
g o
dle货品表 et e we hr 品名称 = 蒙牛小利乐枕高钙牛奶 ’ e货 ’ 由于对货 品表进行修 改或删除记录的货品 “ 蒙牛小利乐枕 高钙牛奶” 已经被提货表所引用 , 即提货表 中存在“ 蒙牛小利乐
枕高钙牛奶” 的货 品记 录 , 外键 定义中的关键词 0 e t n - 1dle o c q e a tno p ae o c o 决 定对于货品表 中这样 的记 录是不允许 i nu dt n t ne ea

故上述两种操作不 能执行。 如果外键定 货品名称 vrhr4 )N TNU LP I R E 一 设置 进行修 改或删除操作的。 aca(0 O L R MA YK Y, 义中的关键词变成 o e t csae nu dtcsa e上述两个 ndl e acd p a cd , e o ea 主键 字 段 操作能够执行 , 只是提货表 中相关联的记 录将跟着一起 变化 , 即 库存量 i , n t 包含“ 牛小 利乐枕高钙牛奶 ” 蒙 的记录 的货 品名称都将变成 “ 蒙 单价 r l e , a

sqlserver 触发器死循环的解决方法

sqlserver 触发器死循环的解决方法SQL Server触发器是一种特殊类型的存储过程,它在特定的数据库操作(如插入、更新或删除)之前或之后自动执行。

然而,有时候触发器可能会陷入死循环,导致数据库性能下降甚至崩溃。

本文将介绍几种解决这个问题的方法。

1.检查触发器逻辑:首先,我们需要仔细检查触发器的逻辑,确保没有逻辑错误导致死循环。

可能的错误包括:触发器在更新操作中引发了其它更新操作,或者触发器没有正确处理更新操作。

确保触发器的逻辑正确并且没有死循环是解决问题的第一步。

2.检查触发器所依赖的表和视图:有时候,触发器可能会在被它所依赖的表或视图上进行更新操作,从而导致死循环。

因此,我们需要检查触发器所依赖的表和视图的更新规则和触发器的逻辑是否相互冲突。

如果存在冲突的情况,我们需要重新设计和优化数据库结构,以避免死循环的发生。

3.使用标志位或条件语句:在触发器的逻辑中,我们可以使用标志位或条件语句来避免死循环的发生。

例如,我们可以在触发器中添加一个标志位,用于记录触发器是否已经被执行过。

在触发器开始执行之前,我们检查该标志位的值,如果已经被执行过,则不再执行触发器的逻辑。

这种方法可以有效地避免死循环的发生。

4.使用INSTEAD OF触发器:SQL Server支持两种类型的触发器:AFTER触发器和INSTEAD OF 触发器。

AFTER触发器是在被触发的操作完成之后执行,而INSTEAD OF触发器是在被触发的操作之前执行。

如果我们发现AFTER触发器导致了死循环,我们可以考虑改用INSTEAD OF触发器来解决这个问题。

INSTEAD OF触发器可以用于替代原始的操作,从而避免触发器的递归调用。

5.限制触发器的级别:在SQL Server中,每个数据库可以包含多个触发器,这些触发器可以在不同的级别上进行定义和使用。

触发器的级别包括:表级触发器、行级触发器和语句级触发器。

如果我们发现触发器导致了死循环,我们可以尝试将触发器的级别进行调整,以限制触发器的执行范围,从而避免死循环的发生。

SQL Server 2000数据库中数据完整性解决方案

职 业 技 能
C E R HO Z AR E RI ON
S L S re 00 q ev r20 数据库中数据完整性解决方案
徐 也 可
摘要 : 保证数据库 中数据 的完整性 ,在数据库应用 中是十 数据完整性可 以分为 4种类型 :实体完整性 (ni nery 、 Ety I gi ) t t t 分 重要 的.它是衡量 数据库 中数据质 量的 重要标 志。在 S 域 完 整 性 (o i I ery 、 照 完 整 性 (ee nilnery 、 L Q D ma n gi ) 参 n t t Rfr t t i ) e a I gt Sre 2 0 e r 00中, 以通过 “ v 可 约束” 规则” 默认” 触发器” 用 户 定 义 的完 整 性 (sr df e nery 。 、“ 、“ 、“ 、 U e- ei d I gi ) n t t “ 存储 过程”等来达 到保证数据完整性 的 目的。 1实体 完 整性 。 实体 完 整 性也 称 为行 完 整 性 ,是规 定 表 中 . 关键词 :数据 库 ;S L Sre 2 0 ;数据完整性;约束 ; 的每一行数据在表 中保证惟一且非空值 ,即数据库 中所有的行 O evr 0 0
性别char2check性别男or性别女以上定义的全为列对象级数据完整性定义学号列为主键姓名列为非空值性别列通过检验checkcreatetable课程表课程名char20primarykeyconstraintkcxzidcheck课程性质考试or以上定义的约束constraintkcxzidcheck课程性质考试or课程性质考查为表对象级数据完整createtable学生成绩表学号char6课程名char20成绩intconstraintxhkcmidprimarykey学号课程constraintxhidforeignkey号references学生信息表学号constraintkcmidforeignkey名references课程表课程名以上三个约束全为表对象级约束约束constiaintxhkcmidprimarykey学号课程名保证学号课程名非空且惟一约束constraintxhidforelgnkey学号references学生信息表学号constraintkcmidforeignkey名references课程表课程名保证该表中的学号和课程名字段值只能取中已存在的学号值和中已存在的课举例2

SQL Server 2000系统


4 函数
在Transact-SQL语言中,函数被用来执行一些特 殊的运算以支持SQL Server的标准命令。TransactSQL 编程语言提供了三种函数: (1) 行集函数:行集函数可以在Transact-SQL语 句中当作表引用。 (2) 聚合函数:聚合函数用于对一组值执行计算并 返回一个单一的值。 如求titles表中所有行的price总和,用SUM()函数实 titles price SUM 现。 select sum(price) from titles (3) 标量函数:标量函数用于对传递给它的一个或 者多个参数值进行处理和计算,并返回一个单一的值。 如返回当前使用的数据库的名称,用DB_NAME()函 数实现。 select DB_NAME() as 'databasename'
2 批处理
批处理是一个T_SQL语句组,可以包含一条SQL语句, 也可以包含多条SQL语句,这些语句被应用程序一次 性地从客户机传递到服务器上执行。SQL Server将批 处理的所有语句作为一个整体进行编译和执行。因此, 如果在编译过程中出现错误,那么所有的语句都无法 执行。 可以一次提交给服务器多个批处理命令,所有的批处 理都使用GO作为结束标志,当编译器读到GO时,它 便把GO前面的所有语句当作一个批处理发送给服务器。 GO本身不是T_SQL语句的组成部分,它只是一个表 示批处理结束的命令。
3 变量
变量是一种语言中必不可少的组成部分。 Transact-SQL语言中有两种形式的变量,一种是用 户自己定义的局部变量,另外一种是系统提供的全局 变量。 (1)局部变量 局部变量是一个能够拥有特定数据类型的对象,它的 作用范围仅限制在程序内部。局部变量可以作为计数 器来计算循环执行的次数,或是控制循环执行的次数。 另外,利用局部变量还可以保存数据值,以供控制流 语句测试以及保存由存储过程返回的数据值等。局部 变量被引用时要在其名称前加上标志“@”,而且必 须先用DECLARE命令定义后才可以使用。

SQL Server 返回插入记录的自增编号

最近在开发项目的过程中遇到一个问题,就是在插入一条记录的后要立即获取所在数据库中ID,而该ID是自增的,怎么做?在sql server 2005中有几种方式可以实现。

要获取此ID,最简单的方法就是在查询之后select @@indentity--SQL语句创建数据库和表代码如下:create database dbdemogouse dbdemogocreate table tbldemo(id int primary key identity(1,1),name varchar(20))go--执行下面SQL语句就能查出来刚插入记录对应的自增列的值insert into tbldemo values('测试') select @@identitySQL Server 2000中,有三个比较类似的功能:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDE NTITY,它们都返回插入到 IDENTITY 列中的值。

1)IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值,它不受作用域和会话的限制,而受限于所指定的表。

2)@@IDENTITY返回为当前会话的所有作用域中的任何表最后生成的标识值。

3) SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。

SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。

但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。

例如,有两个表 T1 和 T2,在 T1 上定义了一个 INSERT 触发器。

当将某行插入 T1 时,触发器被激发,并在 T2 中插入一行。

此例说明了两个作用域:一个是在 T1 上的插入,另一个是作为触发器的结果在 T2 上的插入。

假设 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSER T 语句的最后返回不同的值。

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

sqlserver2000触发器 触发器是一种特殊的存储过程,类似于其它编程语言中的事件函数,SQL Serve2000 允许为 INSERT、UPDATE、DELETE 创建触发器,当在表(视图)中插入、更新、删除记录时,触发一个或一系列 T-SQL 语句。

本专题的目的并非是向您详尽地介绍触发器,而是系统地向您介绍触发器的常用知识与相关应用,并与您一起探讨应用经验,如果您需要了解触发器不常用的知识点,请参见 SQL Server2000 联机丛书(安装 SQL Server2000 时默认是安装的)。

在视图上创建普通触发器可能会出现“对象无效”的错误,实际上,我们不能在视图上创建 FOR 触发器,而应该创建 INSTEAD OF 触发器。在 SQL Server2000 联机丛书中,是没有说触发器不能在视图上创建的, 并且在语法解释中表明:在 CREATE TRIGGER 的 ON 之后可以是视图。 然而,事实似乎并不是如此,很多专家也说触发器不能在视图上创建。 我也专门作了测试,的确如此,不管是普通视图还是索引视图,都无法在上面创建触发器. 但是无可厚非的是:当在临时表或系统表上创建触发器时会遭到拒绝。 FOR CREATE TRIGGER 语句 FOR 关键字之后可以跟 INSERT、UPDATE、DELETE 中的一个或多个,也就是说在其它情况下是不会触发触发器的, 包括 SELECT、TRUNCATE、WRITETEXT、UPDATETEXT。

TRUNCATE TABLE 和不带 WHERE 的 DELETE 功能是一样的,都是删除表中的所有数据,不过 TRUNCATE TABLE 速度更快,占用的日志更少,这是因为 TRUNCATE TABLE 直接释放数据页并且在事务日志中也只记录数据页的释放,而 DELETE 是一行一行地删除,在事务日志中要记录每一条记录的删除。

那么可不可以用 TRUNCATE TABLE 代替不带 WHERE 的 DELETE 呢?在以下情况是不行的: 1、要保留标识的情况下不能用 TRUNCATE TABLE,因为 TRUNCATE TABLE 会重置标

识。 2、需要使用触发器的情况下不能使用 TRUNCATE TABLE ,它不会激发触发器。 3、对于由 FOREIGN KEY 约束引用的表(即主键所在的表,不是外键所在的表)不能使用 TRUNCATE TABLE。 4、对于参与了索引视图的表不能使用 TRUNCATE TABLE ,注意指索引视图,并非普通

视图。

触发器内部语句出错时,前面对数据更改操作将会无效。 举个例子,在表中插入数据时触发触发器,而触发器内部此时发生了运行时错误,那么将返回一个错误值,并且拒绝刚才的数据插入。

一个有趣的触发器应用 触发器回滚 我们看到许多注册系统在注册后都不能更改用户名,但这多半是由应用程序决定的, 如果直接打开数据库表进行更改,同样可以更改其用户名,在触发器中利用回滚就可以巧妙地实现无法更改用户名。 use 数据库名 go create trigger tr on 表名 for update as if update(userName) rollback tran 关键在最后两句,其解释为:如果更新了 userName 列,就回滚事务。

不能在触发器中使用的语句 触发器中可以使用大多数 T-SQL 语句,但如下一些语句是不能在触发器中使用的。 CREATE 语句,如:CREATE DATABASE、CREATE TABLE、CREATE INDEX 等。 ALTER 语句,如:ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。 DROP 语句,如:DROP DATABASE、DROP TABLE、DROP INDEX 等。 DISK 语句,如:DISK INIT、DISK RESIZE。 LOAD 语句,如:LOAD DATABASE、LOAD LOG。 RESTORE 语句,如:RESTORE DATABASE、RESTORE LOG。 RECONFIGURE 说明:有人说不能用 TRUNCATE TABLE 语句,其实是可以的。

查看某个触发器的内容 use 数据库名 go exec sp_helptext '触发器名称' 将会以表的样式显示触发器内容。 除了触发器外,sp_helptext 还可以显示 规则、默认值、未加密的存储过程、用户定义函数、视图的文本 用企业管理器查看

在表上点右键->“所有任务”->“管理触发器”,选择所要查看的触发器 查看当前数据库中有哪些触发器 在查询分析器中运行: use 数据库名 go select * from sysobjects where xtype='TR' sysobjects 保存着数据库的对象,其中 xtype 为 TR 的记录即为触发器对象。在 name 一列,我们可以看到触发器名称。 删除触发器 用查询分析器删除 在查询分析器中使用 drop trigger 触发器名称 来删除触发器。 也可以同时删除多个触发器:drop trigger 触发器名称,触发器名称... 注意:触发器名称是不加引号的。在删除触发器之前可以先看一下触发器是否存在: if Exists(select name from sysobjects where name=触发器名

称 and xtype='TR')

用企业管理器删除 在企业管理器中,在表上点右键->“所有任务”->“管理触发器”,选中所要删除的触发器,然后点击“删除”。 重命名触发器 用查询分析器重命名 exec sp_rename 原名称, 新名称 sp_rename 是 SQL Server2000 自带的一个存储过程,用于更改当前数据库中用户创建的对象的名称,如表名、列表、索引名等。

用企业管理器重命名 在表上点右键->“所有任务”->“管理触发器”,选中所要重命名的触发器,修改触发器语句中的触发器名称,点击“确定”。

查看触发器的属性 存储过程 sp_helptrigger 用于查看触发器的属性。

sp_helptrigger 有两个参数:第一个参数为表名;第二个为触发器类型,为 char(6) 类型,可以是 INSERT、UPDATE、DELETE,如果省略则显示指定表中所有类型触发器的属性。

例: use 数据库名 go exec sp_helptrigger tbl

触发器更多语法 INSTEAD OF 执行触发器语句,但不执行触发触发器的 SQL 语句,比如试图删除一条记录时,将执行触发器指定的语句,此时不再执行 delete 语句。例: create trigger f on tbl instead of delete as insert into Logs...

IF UPDATE(列名) 检查是否更新了某一列,用于 insert 或 update,不能用于 delete。例: create trigger f on tbl for update as if update(status) or update(title) sql_statement --更新了 status 或 title 列

inserted、deleted 这是两个虚拟表,inserted 保存的是 insert 或 update 之后所影响的记录形成的表,deleted 保存的是 delete 或 update 之前所影响的记录形成的表。例: create trigger tbl_delete on tbl for delete as declare @title varchar(200) select @title=title from deleted insert into Logs(logContent) values('删除了 title 为:' + title + '的记录') 说明:如果向 inserted 或 deleted 虚拟表中取字段类型为 text、image 的字段值时,所取得的值将会是 null。

慎用触发器 触发器功能强大,轻松可靠地实现许多复杂的功能,为什么又要慎用呢。 触发器本身没有过错,但由于我们的滥用会造成数据库及应用程序的维护困难。

在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作,比如删除 T1 表记录时期望删除 T2 表相关的记录,此时可以建立级联删除的关系,也可以为 T1 表建立触发器使同时删除 T2 表相关记录,也可以自定义存储过程删除 T1 和 T2 表的记录,也可以在应用程序中使用两个 SQL 语句来删除……到底用哪一种好呢,应该说我们建立通过建立关系来实现级联删除是最好的,除非更有高的需求。

触发器还有一个用途可以用来保障数据的完整性,但同时规则、约束、默认值也可以保障数据完整性,到底哪一个好呢,一般说来,较为简单的完整性要求我们不应该使用触发器。两者在运行机制上也是有区别的,像规则、约束、默认值这些是在数据更改之前进行数据验证,而触发器是在数据更改之后进行验证(如果事务回滚,该表将不会产生变化)。

总之,如果我们对触发器过分的依赖,就会造成遍地是程序的情况,因为触发器本身就需要别的程序给它一个触发条件,也就是说至少在两个地方存在着程序,同时我们抛弃了约束、默认值等而选用触发器,势必影响数据库的结构。

相关文档
最新文档