第一章
客户机/
服务器和关系数据库
使用数据库的好处:
l
确保数据的完整性与一致性
l
确保数据的安全性
l
解决数据共享的问题
l
解决数据的并行存取问题
l
高效率的存取数据
l
缩短应用软件的开发时间
l
极佳的数据备份和还原能力
第二章
SQL Server 2000
安装与简介
安装选项有两个步骤的设置是需要特别注意的:一个是在排序和排序原则的步骤时,另一个值得注意的地方是在网络通讯协议的设置上。
SQL Server
的网络程序库:
l
命名管道(安装在
winnt/2000 server
上的默认值):提供客户机和
sql server2000
之间的通讯
l
TCP/IP
套接字:使用
windows socket
与
TCP/IP
来连接,您必须在
TCP/IP
中指定端口号:这样才能与
window Socket
连接,默认端口号为
1433
l
多协议:他是
sql sever2000
的网络协议库,使用
RPC
而不用设置参数,目的是支持
IPX/SPX
与
TCP/IP
并支持加密,可以用本程序库来集成安全措施。
l
NW/LINK IPX/SPC
:是
NetWare
上所使用的通讯协议,提供连接并使用
sql server
。
l
AppleTalk ADSP
:可以让
Apple Macintosh
的用户连接
SQL server
l
Banyan VINES
:这是通过
Banyan VINES Sequenced Packet Protocol
来与
BanyanVinES
网络协议连接。
SQL Server 2000
多重实例:默认实例和命名实例。
数据库文件类型:
l
主要数据文件(
Primary
):里面包含了数据库启动的信息,用来存储数据,所有数据库都有一个主要数据文件,扩展名为
.mdf.
l
次要数据文件(
Secondary
):放置不适合放在主要数据文件中的或主要文件放不下的数据,一个数据库可能包含
0
至多个,扩展名为
ndf
。
l
日志文件(
log
)每个数据库至少包含一个,扩展名为
ldf
。
刚安装好的数据库有
4
个系统数据库和
2
个用户数据库,系统数据库用来记录系统信息或当作系统的工作空间。
l
MASTER
:主要数据库:系统表格和环境信息都存储在这个数据库内。
l
MODEL
:这个数据库是我们在创建新数据库时的样板,亦当我们下达
CREATE DATABASE
命令时,创建数据库的第一步骤就是将
model
数据库内容完全的复制过来,然后再根据我们的需求修改。
l
TEMPDB
:用来当作工作空间的数据库。
l
MSDB
:
SQL Server Agent
用来安排警告(
Alerts
)、工作(
jobs
)以及记录操作的数据库。
l
NORTHWIND
和
PUBS:SQL Server 2000
所附的两个示范数据库
2.7SQL Server2000
管理工具
l
企业管理器:新建
SQL server
注册,然后通过编辑注册属性,可以屏蔽许多系统对象。
l
事件探查器:可以即时获得服务器的活动,帮助我们监控
SQL Server
所产生的事件。
l
查询分析器:服务器选择中“
.
”表示使用本地计算机上的默认实例。可以使用模板双击,或者选择自动编写脚本执行。
l
客户机网络工具程序:一般没有问题,进入该工具后需要确认所启用的通讯协议,比如
win98
不支持命名管道协议,就要加入
TCP/IP
l
服务器网络工具程序:一般没有问题,为个别实例设置通讯协议,通讯协议的属性(例如
TCP/IP
的连接端口)以及启用强制通讯协议加密等功能。
l
服务管理器
l
在
IIS
中配置
SQL XML
的支持:单击该选项以
MMC
(
Microsoft Management Console
)嵌入
IIS
服务管理元的类型。
l
导入导出
l
联机丛书
第三章:新建数据库与数据查询
数据库例子:
表
3.1
兆阳公司订单表格,表格名称
orders
列名
|
列简述
|
列数据类型
|
order_num
|
订单号码
|
Integer
|
order_date
|
订购日期
|
Datetime
|
distri_num
|
经销商号码
|
Integer
|
paid_date
|
付款日期
|
Datetime
|
表
3.2
兆阳公司经销商表格,表格名称为
distributors
列名
|
列简述
|
列数据结构
|
distri_num
|
经销商名称
|
Integer
|
boss_name
|
负责人姓名
|
Char(16)
|
company
|
公司名称
|
Char(20)
|
hsienshi_code
|
所属县市码
|
Char(3)
|
address
|
公司地址
|
Char(30)
|
phone
|
电话号码
|
Char(12)
|
表
3.3
兆阳公司订单项目表格,表格名称为
Items
列名
|
列简述
|
列数据结构
|
item_num
|
订单项目号码
|
Integer
|
order_num
|
订单号码
|
Integer
|
prod_num
|
产品号码
|
Integer
|
supp_code
|
供应商代码
|
Char(3)
|
quantity
|
单项订购数量
|
Integer
|
total_price
|
单项总价
|
Money
|
表
3.4
兆阳公司产品表格
表格名称为
products
列名
|
列简述
|
列数据类型
|
prod_num
|
产品号码
|
Integer
|
supp_code
|
供应商代码
|
Char(3)
|
descriptions
|
产品名称
|
Char(3)
|
unit_price
|
产品单价
|
Money
|
表
3.5
兆阳公司供应商表格,表格名称为
suppliers
列名
|
列简述
|
列数据类型
|
supp_code
|
供应商代码
|
Char(3)
|
supp_name
|
供应商名称
|
Char(3)
|
表
3.6
兆阳公司县市表格,表格名称为
hsienshi
列名
|
列简述
|
列数据类型
|
hsienshi_code
|
县市代码
|
Char(3)
|
hsienshi_name
|
县市名称
|
Char(10)
|
选取唯一值:
select distinct distri_num from orders
选取子字符串:
select substring(phone,1,2) from distributors
语法结构:
SUBSTRING(expression, start,length)
功能:返回一个字符串、二进制、
text
或是
image
运算式的某一个子集合
参数说明:
expression
:为一个字符串,二进制、
text
或是
image
运算式
start
:为一个整数值,说明想要截取子字符串的开始位置
length
:为一个整数值,说明要截取的子字符串的长度(返回值的字节数)
GO
的作用是强制运行前面已输入的语句
选取介于某一范围的数据:
select description,unit_price from products where unit_price between 20 and 30
等价于
select description,unit_price from products where (unit_price>=20) and (unit_price<=30)
选取属于某一子集合的数据:
select distri_num from distributors where distri_num in (1018,1014)
等价于
where distri_num=1018 or distri_num=1014
搜索子字符串:
select * from distributors where phone like ‘0227%’
在
SQL Server2000
中
%
表示任意长度的字符串
搜索单一长度的任意字符串:
select * from suppliers where supp_code like ‘H_T’
order by
子句:
asc
默认从小到大,
desc
相反
使用算术运算式:
select unit_price*1.05 from products order by unit_price
为虚拟列命名:上式计算列输出结果中没有列名,可以为其加上
new_price
select unit_price*1.05 new_price from products order by unit_price
注释:
/* */
或者
--
常用的字符串函数:
LEN
,
LOWER
,
LTRIM
,
RTRIM
,
REVERSE
,
UPPER
第四章
高级数据查询与处理
常用数学函数:
ABS
,
CELLING
,
FLOOR
,
PI
,
ROUND
,
SQUARE
,
SQRT
常用时间函数:
DAY
(
date
)
date
为一个
datetime
或
smalldatetime
类型的运算式
select day
(
’03/12/1998’
)
MONTH
(
date
),
YEAR
(
date
),
GETDATE
()
常用的集总函数:
COUNT
(
{[ALL|DISTINCT]expression|*}
)
ALL:表示施用于所有的数值,为默认值
DISTINCT:表示COUNT返回唯一且非NULL数值的个数
expression:分一非uniqueidentifier、text、image或ntext类型的运算式
‘*’:表示计算一个表格所有记录的总笔数,COUNT(*)不能与DISTINCT并用(不会删除重复和NULL记录)
SUM({[ALL|DISTINCT]expression|*})
AVG({[ALL|DISTINCT]expression|*})
MAX(expression)
MIN (expression)
集合数据排序与
HAVING
子句:请查询每一笔订单的总金额并根据总金额由小到大排序
select order_num,sum(total_price) total_price from items group by order_num order by 2
order by 2
表示以第二列
sum(total_price)
来排序
列出订单超过
4
的订单总价:
select* from items group by order_num having count(*)>4
创建暂存表格:一个暂存表格存储于暂存数据库
tempdb
中,系统会在连接结束后自动清除
SELECT column_list INTO temporary_table_name FROM table_name
使用表格别名:
select d.distri_num, o.order_num, item_num, total_price from distributors d, orders o, items I where d.distri_num = o.distri_num and o.order_num = i.order_num and d.distri_num = 1004
外部合并:查询每一经销商的下单明细,列出经销商号码、负责人姓名以及订单号码
select distributors.distri_num, boss_name, order_num from distributors,orders where distributors
.distri_num = order.distri_num
内部合并(
inner join
)并不会列出列为
null
数据的
外部合并(
outer join
):
select distributous.distri_num,boss_num,order_num from distributors left outer join orders on distributous.distri_num = orders.distri_num
table1 LEFT OUTER JOIN table2
的意思是
table1
与
table2
进行外部合并,
table1
中的每一笔数据都会被取出来,不论能否在
table2
中找到相匹配的数据,合并的条件是用
ON
关键字来连接(不用
WHERE
),同理也可以用
table1 RIGHT OUTER JOIN table2
一个表格与自己进行合并:查询供应相同产品的供应商代码,列出产品名称与供应商代码,并以成对的方式列出
select p1.descriptions, p1.supp_code,p2.supp_code from products p1,products p2 where p1.description = p2.description and p1.supp_code != p2.supp_code
但查询结果一定是重复的,重复倍数是
2,
可以使用以下方法:
select p1.descriptions, p1.supp_code,p2.supp_code from products p1,products p2 where p1.description = p2.description and p1.supp_code> p2.supp_code
在
select
语句中使用自查询:
select * from distributors where hsienshi_code = (select hsienshi_code from distributors where boss_name =’zhangyue’)
该方法只能用在确定自查询只返回一个值的情况,如果多个值可以用
IN
select * from distributors where hsienshi_code in (select hsienshi_code from distributors where boss_name =’zhangyue’)
与主查询有关的子查询
前面介绍的子查询有一个特点,他们与主查询无关,而且只运行一次,并将查询结果供主查询用,实际上,子查询可能依赖于主查询,而有可能每一个主查询的每一笔数据筛选都需要运行一次子查询
查询所有订单项目的单项总价大于所属订单最小单项总价两倍的订单项目数据
select order_num,prod_num,supp_code,total_price from items i where total_price>(select 2*min(total_price) from items where order_num = i.order_num)
每次运行一次主查询都要运行一次子查询,速度慢耗资源
查询每个经销商的经销商名称与最早订货日期
select company,order_date from distributors d, order o where d.distri_num=o.distri_num and order_date=(select min(order_date) from orders o1 where o1.distri_num = o.distri_num group by distri_num)
将中间结果保存起来
使用
UNION
运算符:查询单价大于
25
或是订货项目数量小于
2
的产品数据
select prod_num, supp_code from products where unit_price>25 UNION select prod_num, , supp_code from items where quantity<2 UNION会删除重复的记录
第五章
数据库组件介绍
视图:视图可以想象成另一种存取数据的方式:一个建立在实际存储数据的表格之上的虚拟表格。通过这个虚拟表格来查看数据库中的数据,就如使用数据库中的其他表格一样,您同样可以对视图作数据的存取、添加、更新或者删除,这些操作都会影响到真正的基准表格
存储过程:
EXEC sp_procedure_name
也可以省略
exec
用户自定义数据类型与自定义函数:
SQLSERVER2000
支持以下三类自定义函数,数值类函数,内嵌表数值函数,多重语句表数值函数,用户自定义函数可以使用
0
或多个输入参数,并会返回数值类值或表,在用户自定义函数中不支持输出参数
列约束:主键约束,外键约束,唯一性约束,检查约束,默认值约束,列的可否
NULL
约束
触发器:是一种特殊类型的存储过程,当您在对待表格进行特定的数据处理(
insert
,
update
,
delete
)时,触发器就会根据表格发生操作的情况而自动被
SQL server
触发而运行,触发器是创建在特定表格的特定动作之上的,所以删除表格也会删除一并删除创建在其上的触发器。使用触发器有以下好处:
l
触发器可作“级联式”(
Cascading
)数据更新
l
触发器可取消整个事务
l
触发器可实现复杂的数据约束
l
触发器可实现简单的数据判断及分析
第六章
数据库与表格设计
6.4SQL server2000
系统数据类型
数值数据类型:
整数类型:
bigint,int
或
integer
,
smallint,tinyint
十进制小数类型:
decimal,numerric
decimal[(precision[,scale])]或者numeric[(precision[,scale])]
precision参数表示存储在列中数据的最大数值总位数scale表示小数位数
近似数值类型:
float,real
金钱类型:
money,smallmoney
在此种数据类型的显示前会加
$
符号,每个千分位会有
’,’
号
日期和时间类型:
datetime,smalldatetime
字符串类型:
一般字符类型:
char
存储固定长度的非
unicode
字符串,最长
8000
字
varchar存储不固定长度的非unicode数据,最长8000字
text
储存不固定长度非
unicode
的大量文字数据
Unicode
的字符串类型:
nchar,nvarchar,ntext
储存
unicode
字符串
二进制数据类型:
binary,varbinary, image可以储存大量二进制数据通常储存图像声音等
特殊数据类型:
bit
用来储存
0
或
1
的值
timestamp,curso,uniqueidentifier,sql_variant,
表
数据类型的转换:用户看不到的隐含转换,系统自动进行
使用
CAST
或
CONVERT
转换函数
CAST( expression AS date_type)
CONVERT (data_type[(length)], expression[,style])
Experssion
是任何有效的
SQL SERVER
表示式
Date_type
目标系统提供的数据类型,不包括用户自定义的类型
Length
数据类型长度的可选参数
Style
用来转换
datetime
或
smalldatetime
数据为字符数据的日期格式或字符串格式
查询数据的类型:
sp_datetype_info
新建表设置主键可以按
shift
或者
ctrl
产生新建表格的脚本文件:可以在表格的
[
所有任务]
中选择
[
生成SQL
脚本]
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[orders_1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[orders_1]
GO
CREATE TABLE [dbo].[orders_1] (
[order_num] [int] IDENTITY (101, 1) NOT NULL ,
[order_date] [datetime] NOT NULL ,
[distri_num] [int] NOT NULL ,
[paid_date] [datetime] NULL
) ON [PRIMARY]
GO
在这工具中的三个选项卡中可以设置脚本,在
[
选项]
中选择了主键设置后会加上
ALTER TABLE [dbo].[orders_1] WITH NOCHECK ADD
CONSTRAINT [PK_orders_1] PRIMARY KEY CLUSTERED
(
[order_num]
) ON [PRIMARY]
GO
跨数据库的数据选取,要在表前加上数据库名称与拥有者名称例如:
TradeDB.dbo.orders
第七章
高级数据库设计
7
.
1
设置列的默认值
可以在企业管理器中设置,比如上表查询就可以用如下方法
insert into order_1 values(‘2000/10/22’,default,NULL)
或者
insert into orders_1(order_date) values(‘2000/10/22’)
7.2
新建与删除默认值
企业管理器:
[
默认]
[
新建默认]
,填入名称和值,字符串要加单引号,删除和重新命名也可以在其中完成
Transact-sql
语句:
新建默认值:
CREATE DEFAULT default_name AS constant_expression
范例
create default today as getdate()
昨天则为
create default yesterday as getdate()-1
默认值重名名:
sp_rename old_default_name,new_default_name
7.3
默认值与列的结合
企业管理器:双机默认值名字,
[
绑定列]
进入然后选择表
[
添加]
,[
应用][
确定]
,
然后再设计表中就可以看到
dbo.default_name
Transact-sql
语句:
Sp_bindefault ‘default_name’, ‘object_name’ [,’futureonly’]
Default_name
为默认值的名称
,object_name
为欲结合对象的名称
futureonly
设置这个默认值的生效时间是从现在开始,但此参数值可以用在用户自定义数据类型上
Sp_unbindefault ‘object_name’ [, ‘futureonly’]
7.4
设置列
NULL
和标识
标识这个属性可以决定这个列在此表格中的唯一性,因此具有标识属性的列可以用来当作主键,但只有整数类型的列方能使用标识,所以在使用
Transact-sql
语句添加数据时必须把列跳过,如果您真想自行决定标识列内的值,要使用
SET
命令将
identity_insert
选项设为
ON
删除设有标识属性列的数据后,这个系统所赋予的值就不再出现,即唯一性,感觉和
sony
的照相机的效果一样。
当然你使用
SET
命令将
identity_insert
选项设为
ON
后要
OFF
set identity_insert table_name off
7.5
用户自定义数据类型
企业管理器:
[
用户自定义的数据类型][
新建用户定义数据类型]
Transact-sql
语句:
Sp_addtype user_define_type, ‘system_date_type’ [,’null’|’not null’]
其中
user_define_type
为自定义数据类型的名称,而
system_date_type
为实际系统数据类型,最后面的是这个自定义类型是否接受
null
值
sp_droptype user_define_type
7.6
用户自定义的数据类型与列相结合
设计表中已经可以选自定义的类型了
create table order_2(
[order_num] [int] ,
[distri_num] DISTNUM
)
7.7
默认值与自定义数据类型结合
企业管理器:如前面所示选
[
绑定UDT]
或者
[
自定义数据类型]
的
[
属性]
中选择
7.8
规则的创建
Transact-sql
语句:
CREATE RULE rule_name AS condition_expression
Create rule qty_range as @range>=1 and @range<=200
企业管理器:
[
规则][
新建规则]
,
填入名称和文本中填入
condition_expression
7.9
规则与列结合
企业管理器:规则
属性
中选绑定
UDT
或者绑定列
Transact-sql
语句:
sp_bindrule ‘rule_name’, ‘obj_name’ [,futureonly]
其中的
object_name
可以是列或是自定义的数据类型的名称,而
futureonly
参数选项只是用于用户自定义类型
注:解除对象与规则的结合之后,此规则并不会从数据库中删除,自定义类型解除的方法是绑定复选框解除就是解除绑定,而列绑定就是删除让列移至
[
未绑定的列]
7.10
规则的修改、删除与重命名
企业管理器:
[
重名名][
删除]
DROP RULE rule_name1[, rule_name1…]
无论我们使用何种方法删除规则,只要试图删除一个已经和列或自定义类型结合的规则,就会出现错误信息,我们必须在
[
显示相关性]
来观察此规则究竟与多少个对象结合,以便解除他们的结合。
7.11
设置计算列
限制:
l
计算列所引用的列必须位于同一个表格
l
计算列的创建不能包含子查询
l
计算列所引用的列不能是主键、外键或是唯一索引键的一部分
l
如果将默认值与计算列结合,则默认值的设置无效
l
计算列不能接受
insert
与
update
语句
create table computed_tab
(
price money NOT NULL,
quantity int NOT NULL,
subtotal as price*quanity
)
7.12
数据的完整性
完整性分为:定义域完整性,引用完整性,实体完整性
删除与更新外键所引用的目标时需做如下考虑:
l
删除外键引用的目标:
(1)
NO Action(Restricted):
在无外键引用的情况之下方可删除
(2)
Cascade:
同时删除引用到该目标的相关数据
l
更新外键所引用的目标:
(1)
NO Action(Restricted):
在无外键引用的情况下方可修改
(2)
Cascade
:同时修改引用到该目标的相关数据
7.13
外键的设置
被外键引用的列必须是主键或具有唯一性约束的列
Transact-sql
语句:
[CONSTRAINT constraint_name] FOREIGN KEY [( column_name1,…)] REFERENCES ref_table [(ref_column,…)]
constraint_name
是可选的项目,如果不使用他系统则会替该约束命名,但是这样的话你无法使用
DROP
方式将此删除
create table [dbo].[orders] (
[order_num] [int] IDENTITY (101,1) NOT NULL,
[order_date] [datetime] NOT NULL,
[distri_num] [int] NOT NULL,
[paid_date] [datetime] NULL,
constraint [PK_orders] primary key NONCLUSTERED
(
[order_num]
) on [PRIMARY] ,
constraint [FK_orders_distributors] FOREIGN KEY
(
[distri_num]
) REFERENCE [dbo].[distributors] (
[distri_num]
)
) ON [PRIMARY]
添加外键约束:
alter table [dbo].[orders_1] with nocheck add CONSTRAINT [FK_orders1_distributors1] FOREIGN KEY ([distri_num1]) REFERENCES [dbo].[distributor_1] ([distri_num] )
删除约束:
alter table_orders_1 drop constraint FK_orders1_distributors
7.14
创建视图
CREATE VIEW view_name [(column [,…n])]
[WITH ENCRYPTION]
AS
Select_statement
[WITH CHECK OPTION]
WITH ENCRYPTION
是说明是否要将此视图的源代码加密选项,而
WITH CHECK OPTION
选项意义为强制当我们在视图上运行数据更新命令时,视图都要检查添加或者更新数据是否符合视图本身的定义条件。
企业管理器:
[
新建视图][
添加表][
验证SQL][
运行][
保存]
也可以选择
[
视图][
运行向导]
7.15
视图的修改、删除与重命名
[
设计视图]
或者
[
属性]
sp_helptex viewname
察看视图
sp_rename old_view_name,new_view_name
重名名视图
修改视图:
ALTER VIEW view_name[(column [,…n])]
[WITH ENCRYPTION]
AS
Select_statement
[WITH CHECK OPTION]
删除视图:
DROP VIEW view_name1,view_name2,…
7.16
视图的类型
投影,合并,集总,计算列,使用现有视图创建新视图
第八章
存储过程和触发器
存储过程是经过实现编译好的属于服务器端的程序,能节省语法分析时间,还能减低网络的通讯量。
存储过程分两种:一种是存取数据,一种不返回结果集
触发器可以实现数据的引用完整性,也可以做到级联式的数据更新
8
.
1
创建存储过程
CREATE PRO[EDURE] procedure_name[;number]
[
{@parameter date_type} [VARYING] [= default] [OUTPUT]
]
[,…n]
[WITH
{
RECOMPILE
| ENCRYPTION
| RECOMPILE,
E
NCRYTION
}
]
[FOR REPLICATION]
AS
Sql_statements
Number
是存储过程组中的编号,可以利用相同的名称不同的编号来组成一个存储过程组,但是删除时会将同一组的存储过程一并删除,无法单独删除组内的个别成员
企业管理器:
[
新建存储过程]
填入语句
[
检查语法][
确定]
或者使用向导
8.2
存储过程的修改、删除与重命名
修改存储过程:
ALTER PRO[EDURE] procedure_name[;number]
[
{@parameter date_type} [VARYING] [= default] [OUTPUT]
]
[,…n]
[WITH
{
RECOMPILE
| ENCRYPTION
| RECOMPILE,
E
NCRYTION
}
]
[FOR REPLICATION]
AS
Sql_statements
删除存储过程:
DROP PROCEDURE {procedure_name1,procedure_name2…}
重命名:
sp_rename old_proc_name,new_proc_name
8.3
创建传递参数的存储过程
CREATE PROCEDURE [owner.]procedure_name
@parameter_name1 datetype,
@parameter_name2 datetype,…
@parameter_result datetype output
AS sql_statements
其中前两个是传入的参数,后一个是返回的参数
执行:
EXEC proc_name [value[,value]…]
或者使用与参数名称对应的方法:
EXEC proc_name
[@parameter_name2=value2 ] [OUTPUT]
[@parameter_name1 = value1]…
OUTPUT
是设计返回的参数
例
create proc dis_name @pname varchar(20) as select * from distributors where company like @pname
exec dis_name ‘%
资
%’
或者
exec dis_name @pname =’%
资
%’
代返回值的:
create procedure dis_num @dis_no int,@dis_name char(20) OUTPUT as select @dis_name=company from distributors where distri_num=@dis_no
执行:
declare @company char(20)
exec dis_num 1004,@company OUTPUT
print @company
或者:
declare @company char(20)
exec dis_num
@dis_name=@company OUTPUT,
@dis_no=1004
print @company
8.4
使用
RECOMPILE
与
ENCRYPTION
加入
WITH RECOMPILE
选项告诉
sql server
创建这个存储过程时不要存储查询计划,而是在每次运行时创建一个新的查询计划。执行时要
exec pro_name with recompile
WITH ENCRYPTION
表示无法察看原来的
SQL
语句
8.6
创建触发器
CREATE TRIGGER trigger_name
ON table_name
[WITH ENCRYTION]
{
{FOR{[DELETE ][,] [INSERT] [,] [UPDATE] }
[WITH APPEND]
[NOT FOR REPLICATION]
AS
Sql_statements
}
|
{{FOR{[DELETE ][,] [INSERT] [,] [UPDATE] }
[WITH APPEND]
[NOT FOR REPLICATION]
AS
{
IF UPDATE (column_name)
[{AND|OR} UPDATE (column_name)] […n]
}
sql_statements
}
}
create trigger ins_message
on orders
for insert
as
print ‘
添加一笔订单
!’
create trigger update_message
on orders
for update
as
if update(paid_date)
print ‘
付款日期
’
8.7
递归式触发器与触发多个触发器
自己触发自己的叫做递归式调用要设置
recursive trigger
参数为
true
sp_dboption TradeDB, ‘recursive trigger’,TRUE
触发多个触发器可以使用
with append
选项或者使用系统存储过程将兼容级别设为
79
或
80
sp_dbcmptlevel,database_name,80
所有的触发器保存在
master
数据库的
sysobjects
之中
用
sp_helptext
察看触发器定义
企业管理器中可以通过
[
所有任务][
管理触发程序]
察看
8.9 INSERTED
与
DELETED
表格
当进行
delete
和
insert
时,系统会产生两个特殊的表格
inserted
和
deleted
create trigger show_insert
on orders
for insert
as
print ‘
添加数据
’
select * from inserted
一次最多删除
3
比数据的话可以使用触发器
create trigger del_items_rest
on items
for delete
as
declare @del_count int
select @del_count=count(*) from DELETED
if @del_count >3
begin
print ‘此表一次最多只能删除3笔数据’
rollback transaction
end
使用
insert
语句时,系统会将数据添加至
inserted
表,使用
delete
时系统会将数据添加到
deleted
表,使用
update
语句时,会将原数据添加至
deleted
表,更新数据添加至
inserted
表