sqlserver2000 详解

来源:互联网 发布:人工智能电影 编辑:程序博客网 时间:2024/06/01 07:50
 
第一章 客户机/服务器和关系数据库
使用数据库的好处:
l         确保数据的完整性与一致性
l         确保数据的安全性
l         解决数据共享的问题
l         解决数据的并行存取问题
l         高效率的存取数据
l         缩短应用软件的开发时间
l         极佳的数据备份和还原能力
 
第二章 SQL Server 2000安装与简介
安装选项有两个步骤的设置是需要特别注意的:一个是在排序和排序原则的步骤时,另一个值得注意的地方是在网络通讯协议的设置上。
SQL Server的网络程序库:
l         命名管道(安装在winnt/2000 server上的默认值):提供客户机和sql server2000之间的通讯
l         TCP/IP套接字:使用windows socketTCP/IP来连接,您必须在TCP/IP中指定端口号:这样才能与window Socket连接,默认端口号为1433
l         多协议:他是sql sever2000的网络协议库,使用RPC而不用设置参数,目的是支持IPX/SPXTCP/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         MSDBSQL Server Agent 用来安排警告(Alerts)、工作(jobs)以及记录操作的数据库。
l         NORTHWINDPUBS: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的支持:单击该选项以MMCMicrosoft 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
 
注释:/* */或者--
 
常用的字符串函数:LENLOWERLTRIMRTRIMREVERSEUPPER
 
 
第四章  高级数据查询与处理
常用数学函数:ABSCELLINGFLOORPIROUNDSQUARESQRT
常用时间函数:DAYdate date为一个datetimesmalldatetime类型的运算式
select day’03/12/1998’
MONTHdate),YEARdate),GETDATE()
 
常用的集总函数:COUNT{[ALL|DISTINCT]expression|*}
                ALL:表示施用于所有的数值,为默认值
                            DISTINCT:表示COUNT返回唯一且非NULL数值的个数
                            expression:分一非uniqueidentifiertextimagentext类型的运算式
                            ‘*’:表示计算一个表格所有记录的总笔数,COUNT*)不能与DISTINCT并用(不会删除重复和NULL记录)
                   SUM{[ALL|DISTINCT]expression|*}
                AVG{[ALL|DISTINCT]expression|*}
                MAXexpression
                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的意思是table1table2进行外部合并,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约束
 
触发器:是一种特殊类型的存储过程,当您在对待表格进行特定的数据处理(insertupdatedelete)时,触发器就会根据表格发生操作的情况而自动被SQL server触发而运行,触发器是创建在特定表格的特定动作之上的,所以删除表格也会删除一并删除创建在其上的触发器。使用触发器有以下好处:
l         触发器可作“级联式”(Cascading)数据更新
l         触发器可取消整个事务
l         触发器可实现复杂的数据约束
l         触发器可实现简单的数据判断及分析
 
 
第六章 数据库与表格设计
6.4SQL server2000系统数据类型
数值数据类型:
整数类型:bigint,intintegersmallint,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用来储存01的值
timestamp,curso,uniqueidentifier,sql_variant,
 
数据类型的转换:用户看不到的隐含转换,系统自动进行
                使用CASTCONVERT转换函数
CAST( expression AS date_type)
CONVERT (data_type[(length)], expression[,style])
Experssion是任何有效的SQL SERVER表示式
Date_type目标系统提供的数据类型,不包括用户自定义的类型
Length数据类型长度的可选参数
Style用来转换datetimesmalldatetime数据为字符数据的日期格式或字符串格式
 
查询数据的类型: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
 
第七章 高级数据库设计
71设置列的默认值
可以在企业管理器中设置,比如上表查询就可以用如下方法
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         计算列不能接受insertupdate语句
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视图的类型
投影,合并,集总,计算列,使用现有视图创建新视图
 
 
第八章 存储过程和触发器
存储过程是经过实现编译好的属于服务器端的程序,能节省语法分析时间,还能减低网络的通讯量。
存储过程分两种:一种是存取数据,一种不返回结果集
触发器可以实现数据的引用完整性,也可以做到级联式的数据更新
81创建存储过程
CREATE PRO[EDURE] procedure_name[;number]
[
    {@parameter date_type} [VARYING] [= default] [OUTPUT]
]
[,…n]
[WITH
 {
        RECOMPILE
        | ENCRYPTION
| RECOMPILE, ENCRYTION
 }
]
[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, ENCRYTION
 }
]
[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使用RECOMPILEENCRYPTION
加入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选项或者使用系统存储过程将兼容级别设为7980
sp_dbcmptlevel,database_name,80
所有的触发器保存在master数据库的sysobjects之中
sp_helptext察看触发器定义
企业管理器中可以通过[所有任务][管理触发程序]察看
 
8.9 INSERTEDDELETED表格
当进行deleteinsert时,系统会产生两个特殊的表格inserteddeleted
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
 
原创粉丝点击