存储过程这一节根本没看懂(未完......)
(SQL Server 中所有局部变量名都以@起头)
使用事务处理(transaction processing),通过确保成批的 SQL 操作要么完全执行要么完全不执行来维护数据库的完整性
事务处理是一种机制,用来管理必须成批执行的 SQL 操作,保证数据库不包含不完整的操作结果。利用事务处理,可以保证一组操作不会中途停止,它要么完全执行,要么完全不执行(除非明确指示)。如果没有错误发生,整组语句提交给(写到)数据库表;如果发生错误,则进行回退(撤销),将数据库恢复到某个已知且安全的状态
在使用事务处理时,有几个反复出现的关键词。下面是关于事务处理需要知道的几个术语:
事务(transaction)指一组 SQL 语句;
回退(rollback)指撤销指定 SQL 语句的过程;
提交(commit)指将未存储的 SQL 语句结果写入数据库表;
保留点(savepoint)指事务处理中设置的临时占位符(placeholder),可以对它发布回退(与回退整个事务处理不同)。
输入
BEGIN TRANSACTION
...
COMMIT TRANSACTION
分析
在这个例子中,BEGIN TRANSACTION 和 COMMIT TRANSACTION 语句之间的 SQL 必须完全执行或者完全不执行。
输入▼
DELETE FROM Orders;
ROLLBACK;
分析▼
在此例子中,执行 DELETE 操作,然后用 ROLLBACK 语句撤销。虽然这是最有用的例子,但它的确能够说明,在事务处理块中,DELETE 操作(与INSERT 和 UPDATE 操作一样)并不是最终的结果。
输入▼
BEGIN TRANSACTION
INSERT INTO Customers(cust_id, cust_name)
VALUES('1000000010', 'Toys Emporium');
SAVE TRANSACTION StartOrder;
INSERT INTO Orders(order_num, order_date, cust_id)
VALUES(20100,'2001/12/1','1000000010');
IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder;
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity,
➥item_price)
VALUES(20100, 1, 'BR01', 100, 5.49);
IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder;
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity,
➥item_price)
VALUES(20100, 2, 'BR03', 100, 10.99);
IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder;
COMMIT TRANSACTION
分析▼
这里的事务处理块中包含了 4 条 INSERT 语句。在第一条 INSERT 语句之后定义了一个保留点,因此,如果后面的任何一个 INSERT 操作失败,事务处理能够回退到这里。在 SQL Server 中,可检查一个名为@@ERROR的变量,看操作是否成功。(其他 DBMS 使用不同的函数或变量返回此信息。)如果@@ERROR 返回一个非 0 的值,表示有错误发生,事务处理回退到保留点。如果整个事务处理成功,发布 COMMIT 以保留数据。
游标(cursor)是一个存储在 DBMS 服务器上的数据库查询,它不是一条 SELECT 语句,而是被该语句检索出来的结果集。
不同的 DBMS 支持不同的游标选项和特性。常见的一些选项和特性如下。
能够标记游标为只读,使数据能读取,但不能更新和删除。
能控制可以执行的定向操作(向前、向后、第一、最后、绝对位置、相对位置等)。
能标记某些列为可编辑的,某些列为不可编辑的。
规定范围,使游标对创建它的特定请求(如存储过程)或对所有请求可访问。
指示 DBMS 对检索出的数据(而不是指出表中活动数据)进行复制,使数据在游标打开和访问期间不变化。
使用游标涉及几个明确的步骤
在使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的 SELECT 语句和游标选项。
一旦声明,就必须打开游标以供使用。这个过程用前面定义的 SELECT语句把数据实际检索出来。
对于填有数据的游标,根据需要取出(检索)各行。
在结束游标使用时,必须关闭游标,可能的话,释放游标(有赖于具体的 DBMS)。
输入▼
DECLARE CustCursor CURSOR
FOR
SELECT * FROM Customers
WHERE cust_email IS NULL
输入▼
OPEN CURSOR CustCursor
分析▼
在处理 OPEN CURSOR 语句时,执行查询,存储检索出的数据以供浏览和滚动。
21.2 使用游标 | 187
输入▼
DECLARE TYPE CustCursor IS REF CURSOR
RETURN Customers%ROWTYPE;
DECLARE CustRecord Customers%ROWTYPE
BEGIN
OPEN CustCursor;
FETCH CustCursor INTO CustRecord;
CLOSE CustCursor;
END;
分析▼
在这个例子中,FETCH 用来检索当前行(自动从第一行开始),放到声明的变量 CustRecord 中。对于检索出来的数据不做任何处理
输入▼
CLOSE CustCursor
DEALLOCATE CURSOR CustCursor
分析▼
CLOSE 语句用来关闭游标。一旦游标关闭,如果不再次打开,将不能使用。第二次使用它时不需要再声明,只需用 OPEN 打开它即可。
高级 SQL 特性
唯一约束用来保证一列(或一组列)中的数据是唯一的。它们类似于主键,但存在以下重要区别。
表可包含多个唯一约束,但每个表只允许一个主键。
唯一约束列可包含 NULL 值
唯一约束列可修改或更新。
唯一约束列的值可重复使用。
与主键不一样,唯一约束不能用来定义外键。
检查约束用来保证一列(或一组列)中的数据满足一组指定的条件。检查约束的常见用途有以下几点。
检查最小或最大值。例如,防止 0 个物品的订单(即使 0 是合法的数)。
指定范围。例如,保证发货日期大于等于今天的日期,但不超过今天起一年后的日期。
只允许特定的值。例如,在性别字段中只允许 M 或 F。
索引用来排序数据以加快搜索和排序操作的速度。
在开始创建索引前,应该记住以下内容。
索引改善检索操作的性能,但降低了数据插入、修改和删除的性能。在执行这些操作时,DBMS 必须动态地更新索引。
索引数据可能要占用大量的存储空间
并非所有数据都适合做索引。取值不多的数据(如州)不如具有更多可能值的数据(如姓或名),能通过索引得到那么多的好处。
索引用于数据过滤和数据排序。如果你经常以某种特定的顺序排序数据,则该数据可能适合做索引。
可以在索引中定义多个列(例如,州加上城市)。这样的索引仅在以州加城市的顺序排序时有用。如果想按城市排序,则这种索引没有用处。
触发器是特殊的存储过程,它在特定的数据库活动发生时自动执行。触发器可以与特定表上的 INSERT、UPDATE 和 DELETE 操作(或组合)相关联。
下面是触发器的一些常见用途
保证数据一致。例如,在 INSERT 或 UPDATE 操作中将所有州名转为大写。
基于某个表的变动在其他表上执行活动。例如,每当更新或删除一行时将审计跟踪记录写入某个日志表。
进行额外的验证并根据需要回退数据。例如,保证某个顾客的可用资金不超限定,如果已经超出,则阻塞插入。
计算计算列的值或更新时间戳