第一章 客户机/ 服务器和关系数据库
使用数据库的好处:
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])]
其中0<=scale<=precision,0<precision<=38
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 表
sqlserver2000 详解相关推荐
- PowerBuilder命令行编译详解[1]
PowerBuilder命令行编译详解[1] www.educity.cn 发布者:bin0725 来源:网络转载 发布日期:2013年05月28日 公司的系统是使用PB9.0 + ...
- 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)
首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...
- JVM年轻代,老年代,永久代详解
秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...
- docker常用命令详解
docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...
- 通俗易懂word2vec详解词嵌入-深度学习
https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...
- 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法
深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...
- CUDA之nvidia-smi命令详解---gpu
nvidia-smi是用来查看GPU使用情况的.我常用这个命令判断哪几块GPU空闲,但是最近的GPU使用状态让我很困惑,于是把nvidia-smi命令显示的GPU使用表中各个内容的具体含义解释一下. ...
- Bert代码详解(一)重点详细
这是bert的pytorch版本(与tensorflow一样的,这个更简单些,这个看懂了,tf也能看懂),地址:https://github.com/huggingface/pytorch-pretr ...
- CRF(条件随机场)与Viterbi(维特比)算法原理详解
摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...
最新文章
- mysql 1115_从ADS1115 Python向MySQL插入数据
- java string()函数_从Java中的String函数返回String构建器?
- ubuntu14.04 LTS Python IDE专用编辑器PyCharm开发环境搭建
- Dcoker(系列) docker-redis警告处理
- Tomcat中的线程池(APR和ThreadPool)
- Android Studio 1.01 + BlueStacks 开发调
- mssql的T-SQL教程(从建登陆到建库、表和约束)
- Ubuntu 20.04 搜索引擎环境搭建 (PostgreSQL 12.3, Redis 6, ELK[Elasticsearch 7.8, Logstash 7.8, Kibana 7.8])
- Jmeter-【JSON Extractor】-响应结果中三级key取值
- ConcurrentHashMap原理,jdk7和jdk8的区别
- [转]使用npm发布vue组件
- mac 黑窗口连接mysql_mac上终端起动MySQL的方法
- 我的Java设计模式-单例模式
- 【常见Web应用安全问题】---12、URL redirection
- 手机查看基站位置信息
- web期末网站设计大作业:动漫网站设计——龙猫(10页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 动漫漫画网页设计...
- UOJ 180【UR #12】实验室外的攻防战
- 积分分汇界面将判断放到D层后,D层的写法
- Python,pandas中DataFrame的选取总结
- 【高等数学】函数与极限
热门文章
- 华北赛区承办学校:太原工业学院
- 《就这样享用word》word实用技巧总结-更新中
- 论文笔记 EMNLP 2021|Treasures Outside Contexts: Improving Event Detection via Global Statistics
- cocos2dx+JAVA手游《全民挂机》全套源码支持安卓+IOS双端
- 哪些自媒体平台收益高,每个自媒体平台的优势,新手抓紧收藏
- Occupancy Map(Occupancy Grid)的更新
- 【论文阅读】Occupancy Networks: Learning 3D Reconstruction in Function Space
- 洛克耶是如何发现氦元素的?
- 你写的JSP就是JSP么?
- UG\NX二次开发 判断两个圆柱面共轴的思路