首页 > 学技术 > 技术网文 > Sybase > 正文

[精华] Adaptive Server Anywhere 7.0网上培训教材


来源 chinaunix.net 酷勤网整理

大家要是感兴趣,可以到:
http://www.sybase.com.cn/cn/content/goto.jsp?resID=158

查阅!



 jazy 回复于:2003-02-23 14:06:13

目标
§说明 Sybase Adaptive Server Anywhere的基本组件 
§解释如何使用Adaptive Server Anywhere的个人版及网络版 
§解释Adaptive Server Anywhere 如何进行复制 
§识别Adaptive Server Anywhere支持的5种数据库接口 
§解释Adaptive Server Anywhere 的各组件如何协同工作 
§说明在何处能找到语法和参考信息


 jazy 回复于:2003-02-23 14:07:24

内容
§Sybase Adaptive Server Anywhere基础 
§Adaptive Server Anywhere 数据库引擎 
§利用Adaptive Server Anywhere进行复制 
§数据库实用程序 
§数据库接口 
§各组件如何协同工作 
§启动Adaptive Server Anywhere 
§语法和参考信息


 jazy 回复于:2003-02-23 14:08:25

Adaptive Server Anywhere基础:

§数据库管理系统 
1 数据库引擎 (服务器) 
2 数据库实用程序 (管理和查询工具) 
3 数据库接口(客户连接方法) 
§复制 
1 双向的 
2 偶尔的或连续的连接


 jazy 回复于:2003-02-23 14:35:14

数据库引擎:

两种版本 

•单机服务器 
•网络服务器 
§相同的数据库功能 
§不同的网络能力 
§都能参与复制

单机服务器 :
驻留在用户机 
•开销很小 
§只能接受本地的请求 
•最大连接数为10 
§可执行的名字是 dbeng8


网络数据库服务器 
§驻留在网络服务器机 
§可以结束跨网络的客户请求 
§接点数取决于license 
§可执行的名字是dbsrv8

数据库引擎名:
软件的缺省安装位置(Windows 95/98/ME及 NT/2000): 
•DRIVER:\ Program Files\Sybase\SQL  Anywhere 8\win32 
§个人数据库引擎 
•dbeng8.exe 
§网络数据库服务器 
•dbsrv8.exe

复制:
Adaptive Server Anywhere 利用内置的SQL Remote完成复制 
•是基于消息的复制,适合与偶尔连接的客户 
•缺省情况为双向复制 
•也支持Adaptive Server Enterprise

Sybase Replication Server 
•针对不间断的连接 
•必须进行特殊安排才能实现双向复制 
•可与Adaptive Server Anywhere一同使用

双向复制:

• Receives changes from remotes
• Reconciles conflicts 
• Replicates consolidated changes to remotes

• May contain all or part of the tables in the consolidated 
• Can only replicate back tables that exist in the consolidated 
• Communication with other remote 数据库s is hierarchical through  the consolidated

基于消息的复制 :
§ 不需要实时的连接 
§ 利用消息系统或一个“drop box”文件来传送复制消息 
§ 当远程用户下一次运行dbremote时收到消息

可实现分层复制

数据库实用程序:
Sybase Centra Windows GUI管理接口 
交互ISQL 接受数据查询和系统管理命令
命令行实用程序 用在脚本中或是无法采用Sybase Central时

命令行实用程序:

§可用于完成如下的管理任务: 
•备份 >; dbbackup 
•压缩/解压缩   >; dbshrink 
•删除数据库 >; dberase 
•Load/unload 数据库 >; dbunload 
•校验数据库 >; dbvalid 
§实例: 
• dbbackup -c “uid=dba;pwd=sql;dbf=mydata" -r mydata.db
•备份数据库及事务日志并启动一个新的事务日志


数据库接口:

§Open Database Connectivity (ODBC) 
支持ODBC 3.51 ,ASA 7.0 要求 ODBC 3.51或更高,必要时安装升级文件
优点 :高级API,应用可移植
§OLE DB 
基于 Microsoft Component Object Model (COM) 
两种 OLE DB :
Sybase ASA OLE DB ProvProvider ,无须ODBC 组件就做为OLE DB数据源来连接 
Microsoft OLE DB Provider for ODBC 使ODBC 数据源当做OLE DB数据源
§Embedded SQL (ESQL) 
ANSI标准 
Adaptive Server Anywhere 天生的编程接口 
低级接口 
予编译器把嵌入SQL转换成调用 
用于微小型(UltraLite)应用的基本接口 

§OpenClient 
天生的API 
可移植到其它Sybase ASE数据库 
要求TCP/IP 
最适合用于 Adaptive Server Enterprise-可兼容数据库 ,可兼容性是建立数据库时的配置选项 

§Java Database Connectivity (JDBC)
利用jConnec可以把外部的Java连接到 Adaptive Server Anywhere 
jConnect是 Sybase JDBC驱动器产品
数据库用户可以调用内部Java应用
Java方法可以象存储过程那样被调用或者当做特殊的数据类型来使用

可支持的网络协议:

Windows 2000、XP, NT, Windows 95/98/ME 
  TCP/IP 
  SPX  
 NetBIOS(ASA8 not support)

Unix
 TCP/IP 
NetWare
 TCP/IP 
 SPX


利用命令行启动网络服务器:

语法---dbsrv8 [server-开关] [数据库-文件] [数据库-开关] 
常用开关: 
•-n [server-名] [数据库-名] 
•-ec{NONE|Simple|Certicom} 网络加密 
•-c num-MBs —指定cache size 
•-gt num-processors 
•@文件名 —指明包含连接参数的文件

实例: 
 dbsrv8 -n myserver mydata.db 
 dbsrv8 -n myserver mydata.db -n userdata 
 dbsrv8 -e -n myserver mydata.db 

利用Sybase Central启动网络服务器:

选择 Tools-》 Connection Profiles建立用于该服务器的profile 
  利用按钮设定相应的开关选项 
 作为选项,可以让它在启动Sybase Central时自动被启动 

选择 Tools-》 Connection Profiles 选择 Tools -》 Connection Profiles手动地连接和启动服务器


作为Windows NT Service(服务)启动网络服务器:

利用Sybase Central Services 文件夹可以把Adaptive Server Anywhere安装成一个Windows NT的service. 

把服务器作为用户的 LocalSystem来启动 
  Services的运行独立于任何用户
  当机器被引导时服务器被启动
利用NT Control Panel进行: 
   启动该service 
   设定该service为自动启动
  设定该service为自动启动

启动个人服务器:

利用dbeng8给出开关和参数,该命令的大多数开关与dbsrv8相同
在个人机上你可以:
  利用一个包含dbsrv8的应用来启动
 建立一个Windows菜单项或桌面图标来启动 Adaptive Server Anywhere

启动故障的排除:

  校验PATH 中包含Adaptive Server Anywhere安装目录 , 
      缺省:c:\Program files\Sybase\SQL Anywhere 8\win32 
   校验连接参数 

语法和参考信息:

Adaptive Server Anywhere 手册:
  利用Sybase Central,选择 Help-》 Adaptive Server Anywhere Plug-in Help 

 利用Start menu, 选择 Programs-》 Sybase SQL Anywhere 8.0 -》  SQL  Anywhere documentation 

Sybase Central Help: Help -》 Sybase Central Help 


小   结:


Adaptive Server Anywhere体系结构包含以下组件:
有两种版本的Sybase Adaptive Server Anywhere 数据库它们共享相同的核心技术:数据库引擎, 实用程序, 和接口.
  个人数据库引擎
  网络数据库服务器
数据库引擎运行一个服务器程序负责响应客户应用的请求. 
Adaptive Server Anywhere可以选用5种数据库接口

复  习  题:

1.Adaptive Server Anywhere的三个组件是什么? 
2.标识并说明说明两个版本的Adaptive Server Anywhere. 
3.解释以下的Adaptive Server Anywhere可执行程序: 
    dbeng7 
    dbsrv7 
4. Adaptive Server Anywhere能支持什么数据库接口? 
5. Adaptive Server Anywhere利用什么组件进行复制?


 Blackrose 回复于:2003-02-23 15:10:44

Anywhere也是一个好东西
Sybase目前的移动计算市场占市场份额的70%以上,是真正的强项。

Anywhere是Sybase收购的一家子公司,所以它的数据库Sql中与Sybase ASE有些区别,不过大部分标准语句是一样的。


 jazy 回复于:2003-02-23 15:13:37

sql 语法:

缺省情况下,Adaptive Server Anywhere 采用 Watcom SQL 方言 
8.0版支持几乎所有的 Sybase T-SQL 语法 
Watcom格式化约定: 
CREATE TABLE owner.table-name 
({column-name datatype [column-constraint] 
| [table-constraint]},…) 
IN dbspace-name; 

对大小写敏感
单引号用来分开数据项 
双引号用来分开对象标识


 jazy 回复于:2003-02-23 15:34:29

建临时表:

利用临时表来保存片刻的数据集。放入临时表中的数据仅对你的连接是可见的。 

只有在你的连接中,能访问你放在临时表中的数据行。 

两类临时表: 
   全局性的:表定义存留在数据库中,除非你以显式方式删去它。但是其数据仍是本地化的,只针对于一个给定的连接。

  局部的:该临时表仅存在于该连接的存活期,局部的临时表通常用在存储过程中。 

举例 :
CREATE GLOBAL TEMPORARY TABLE work_table (a int, b char(10), c int)  ON COMMIT PRESERVE ROWS; 
DECLARE LOCAL TEMPORARY TABLE proc_table (name char(20), state char(2), amount money) ON COMMIT DELETE ROWS

利用 Sybase Central建立临时表:

1. 打开 Tables 文件夹 
2. 双击 Add Tabe 
3. 说明各列 
4. 点击 Advanced Table Properties 
5. 选择 Global temporary table 
6. 点击 OK 建立临时表 


建立主键 
通常在建表时完成 
如果现有的数据都是唯一的,也可以在以后补加 
分别使用以下命令:
CREATE TABLE...PRIMARY KEY 
ALTER TABLE…ADD PRIMARY KEY 


实例: 
CREATE TABLE department 
(dept_id   INTEGER NOT NULL,
dept_name   CHAR(20),
dept_id_head  INTEGER,
PRIMARY KEY   (dept_id)); 
ALTER TABLE department  ADD PRIMARY KEY (dept_id);


声明参照完整性 :


利用建立外键来强制参照完整性被称之为“声明参照完整性” 

参照完整性在如下情况下要起作用: 
 
     插入一个含有外键的行
   主键值被更新
   主表中删去一行,其中含有其它表所参照的外键 

参照完整性能起以下作用 :

1〉拒绝 
不允许对主键进行 UPDATE 或 DELETE 
这是缺省动作
2〉设定为空值 
把外键设定为空值
3〉设定为缺省值 
把外键设定为其缺省值
4〉级联(CASCADE)
使外键行作出级联改变 

建立外键 :

举例: 
CREATE TABLE department 
 (dept_id INTEGER NOT NULL, 
  dept_name CHAR ( 20 ), 
  dept_id_head INTEGER, 
  FOREIGN KEY id_fkey(dept_id_head) 
 REFERENCES employee (emp_id) 
 ON UPDATE CASCADE ON DELETE SET NULL);

修改和删去外键 :

利用 ALTER TABLE 删去原来的外键,然后再增加新的外键 

ALTER TABLE department 
DELETE FOREIGN KEY id_fkey; 

ALTER TABLE department 
ADD FOREIGN KEY id_fkey (dept_id_head) 
REFERENCES employee (emp_id) 
ON UPDATE CASCADE 
ON DELETE CASCADE); 


建立索引 :

Adaptive Server Anywhere 在以下情况能自动建立索引:

1〉主键列 

2〉唯一性约束


建立索引可能耗费许多的时间和资源 ,表正在使用时不允许建立索引,表中所含数据量越大,则建索引就越费时. 

实例
CREATE INDEX lastname ON employee (emp_lname DESC) IN mydata2;

删去索引 :
利用 DROP INDEX 

当表正在使用时,禁止删去索引。 

如:
DROP INDEX employee.lastname;


建立视图 :

视图一定是针对数据库中的表进行 SELECT操作来实现 
例如:
CREATE VIEW deptmgr AS
SELECT emp_fname, emp_lname, dept_name
FROM employee, department
WHERE dept_head_id = emp_id; 

修改视图 :

要先删除它,然后再重建。但要注意保留对该视图的访问权
ALTER VIEW 语句与 CREATE VIEW相似


例如:
 ALTER VIEW deptmgr AS SELECT emp_fname, emp_lname, dept_name, salary  FROM employee, department  WHERE dept_head_id = emp_id;

删除视图 :
DROP VIEW deptmgr;


小 结:

1、关系模型.是把数据库看成一个独立于应用和文件系统的实体和结构.
2、主键保证数据库表中的每一行是唯一的。而外键是用来定义表之间的联系.
3、索引的作用是加快对表数据的检索速度.
4、空值代表“未知”,它不同于零和空格.
5、视图是个逻辑的(虚的)表,它的数据派生于一个或多个基表或其它的视图. 
6、表,索引和视图都是利用 SQL 数据定义语言 (DDL)来建立的。 
7、实体完整性强制实现表中没有两行包含全同的值.
8、参照完整性强制在主键与外键之间保持着合理的连接.


 jazy 回复于:2003-02-23 16:16:15

操纵数据:

目      标

1、构造基本的 SELECT, INSERT, UPDATE 和 DELETE 语句。 
2、熟悉 Adaptive Server Anywhere支持的主要内置函数。
3、解释连接( join)操作的内涵 
4、解释连接操作如何完成
5、解释Adaptive Server Anywhere中所支持的 KEY 及 NATURAL JOIN (自然连接)
6、说明外连接( outer join)所产生的结果 
7、解释合并(union)操作的内涵 
8、解释子查询的内涵
9、利用批量 INPUT 及OUTPUT函数对表数据进行装入和卸出 
10、利用 LOAD 和 UNLOAD 对整个数据库进行装入和卸出 

内      容
1、SQL 数据操纵语言(DML)
2、基本的数据操纵语句 
3、内置函数 
4、对多表数据进行操纵 
5、输入和输出表数据 
6、卸载和重新装入数据库


SQL 数据操纵语言 :

用于读出,增加,删去或修改数据。
它们大多是在前端应用中被使用,或是独立地执行或是嵌在基于Web的应用中。
缺省情况下,Adaptive Server Anywhere 使用 Watcom SQL方言 
在版本 6.0 及 7.0中还支持 Sybase T-SQL语法 

基本的数据操纵语句 :

SELECT— 由数据库检索数据
INSERT —向数据库增加数据
UPDATE —对数据库中数据进行修改 
DELETE —从数据库中删除数据 
利用附加的动词,子句和函数能使功能更完善。 

SELECT:
操纵对象可以是表或视图 
要求读取满足特定条件的数据 
用户必须具有SELECT 权限 
基本语法 
SELECT [DISTINCT] select-list FROM table-list WHERE search-conditions ORDER BY column-list [DESC]

INSERT:

向表中插入数据 ,一次插入一行,对某几列或所有列插入数据 
用户必须具有对该表的 INSERT 权限 
基本语法 
INSERT [INTO] table-name 
[column-name,…]  VALUES (expression | DEFAULT, …)

INSERT NULL 和 DEFAULT 值 :

 — 插入NULL 值:
INSERT INTO department
VALUES (123, 'Accounting', NULL);

— 插入 DEFAULT 值 

INSERT INTO sales_order 
(id, cust_id, order_date, fin_code_id, region, sales_rep) 
VALUES (987, 65432, DEFAULT, 
'ax', 'SEUSA', 196); 


注: 在插入时必须使用 NULL 或 DEFAULT 
对任何给出名的列都不能忽略其值 
对于并未明确给出列名的列无须指定其值

多行插入:

把一个 SELECT 语句的结果集插入到表中
语法 
 INSERT [INTO] table-name [column-list]  SELECT…; 

实例 
 INSERT INTO  former_employees
SELECT * FROM employee
WHERE termination_date IS NOT NULL;


UPDATE:

对表中的数据进行更新 ,用 SET子句指定新的值 ,用 WHERE 子句确定要被修改的老的值
用户必须具有对该表的 UPDATE权限
基本语法 
UPDATE table-list SET column-name = expression, … [WHERE search-condition]

DELETE:

从表中删去数据 ,仅删去数据本身,而不是表结构。利用 WHERE 子句确定要被删去的行 
用户应具有对表的DELETE 权限 
基本语法 
DELETE [FROM] table-name [WHERE search-condition]

TRUNCATE(截断) :

它不会使触发器被激发 
最小化写日志(基本上不写日志) 
比 DELETE减少开销 ,不被复制 ,在6.0.3 版中引入选项Truncate_with_auto_commit 它能改善系统性能 ,在 8.0版针对含外键的表提供了快速截断功能 

语法 
TRUNCATE TABLE table-name;

实例 TRUNCATE TABLE employee; 

内置函数:

用于增强 SELECT动词的功能 
能够获得不是存储在用户表中的信息,类似于日期这样的系统信息,数据值的统计 

函数分类 :

聚合型 
数值型 
字串型 
日期和时间 
数据类型转换 
系统函数 
其它类型 

内置函数实例 :
获得在职的女雇员的总数,以及她们参加工作的最早及最晚日期。 
SELECT COUNT(*), min(start_date), 
   max(start_date)
FROM employee
WHERE sex = 'F'
AND termination_date IS NULL;


GROUP BY:

与聚集函数一起使用以指定计算总计时所处的层次 
为出现在该 GROUP BY 列名中每个值获得一行结果 

数据分组 :

例 1 — 不分组 (在表一级求和)
SELECT COUNT(*) FROM employee;

例 2 — 列出销售代表名单及分派给他们的定单数量 

SELECT sales_rep, COUNT(*) FROM sales_order GROUP BY sales_rep;

限制 GROUP BY:

利用 HAVIN子句来限制特定分组的结果集
例3 — 仅列出其定单数量多于50个的那些销售代表的信息 
SELECT sales_rep, COUNT(*) FROM sales_order GROUP BY sales_rep HAVING count(*) >; 50;

对列名加限制性修饰 :

如果在一个语句中要涉及到不同的表中两个同名列时,应当在列名前加上表名进行限制。

SELECT employee.id, emp_fname, emp_lname FROM employee, manager WHERE employee.id = manager.id 

UNION ALL:

UNION ALL 能把两张表中的所有行(包括重复的)全部显示出来 ,它不使用临时表 


实例 — 列出客户及联系人的姓名及地址清单:
SELECT fname, lname, address, city, state, zip FROM customer UNION ALL SELECT first_name, last_name, address, city, state, zip FROM contact;

子查询 :

在另一个DML 语句中含有一个或多个 SELECT语句
当一个查询需利用另一个查询的结果才能继续往下处理时,则用到子查询。
结果集中仅可包含一个列
为提高性能所有的子查询都被放入高速缓存 

实例 — 列出在 1/1/94以后签单的客户
SELECT * FROM customer WHERE id IN
(SELECT cust_id
FROM sales_order
WHERE order_date >; '1994/01/01') ORDER BY customer.company_name;

输入和输出数据 :
利用 INPUT 和 OUTPUT 或 LOAD 和 UNLOAD语句
快速地批量装载
一个文件 <--         -->; 一个表
文件格式 :
ASCII, dBASE, dBASEII, dBASEIII, DIF, FIXED, FoxPro, Lotus, WATFILE


INPUT:

把数据从文件读出然后输入到指定的表中
基本语法 :

INPUT INTO table-name [FROM file-name | PROMPT] [BY ORDER | BY NAME] [DELIMITED BY string]
实例 
INPUT INTO employee
FROM employee.imp

OUTPUT:

基本语法 
SELECT…; OUTPUT TO file-name [FORMAT output-format] [DELIMITED BY string] 
实例  SELECT * FROM employee
OUTPUT to employee.exp
FORMAT ASCII;


卸载和重新装入数据库 :

当你打算修改(比如页面尺寸)数据库选项或是想回收因删除而造成的空闲空间时,必须对数据库进行卸载和重新装入 

卸载和重新装入:

dbunload 
dbinit 
利用交互SQL reload.sql  文件

重构-rebuild (采用缺省命令行选项) 
REBUILD old_db_name new_db_name passwrd

1. 执行 dbunload 
 DBUNLOAD -c  "ENG=public;DBN=sample;UID=dba;PWD=sql"  c:\unload 
2. 执行 dbinit 
3. 利用交互SQL读取 reload.sql  READ reload.sql


数据库的重构 :

自动处理 dbunload, dbinit及 reload.sql 
语法 
rebuild old-database new-database [dba-password] 
实例 
    rebuild mydata mynewdata sql 

小      结 :
1、SELECT, INSERT, DELETE和 UPDATE 是4个最基本的SQL 语句。 
2、Adaptive Server Anywhere 提供了多种内置函数,极大地丰富了 SELECT 操作的功能从而可获取多种无法从数据表中直接得到的信息
3、当利用聚集函数计算总计时,可以用 GROUP BY 子句标明是在什么层次上作总计。
4、连接(Join)操作是按垂直方向对多个表的数据进行检索和组合. 
5、子查询的含义是指在另一个 SELECT 语句中又含有一个或多个 SELECT 语句.
6、合并( UNION)操作是从多个表中检索数据并按水平方向把它们组合起来。


 jazy 回复于:2003-02-23 16:47:28

用户与安全性 

目    标
识别在数据库被初始化时所建立的ID 
建立用户和用户组 
解释用户和用户组之间的关系 
识别ASA所支持的各类权限 
利用GRANT或REVOKE来指派权限。

内     容 
数据库的安全性和权限 
创建用户 
指派用户权限 
创建用户组 

安全性与权限 
数据库安全管理的手段有: 
用户 ID 口令 权限 用户组 

用户组:
用户组是由用户成员构成的 
一个用户可以是多个用户组的成员 
一个用户组可以是另一个用户组的成员 
用户组可以简化权限的管理 

SYS 和 PUBLIC:
SYS 用户和用户组:
1、它是系统表及系统视图的主人 
2、没有口令 
3、不能以 SYS身份连接数据库 
4、系统表不能被用户或 DBA修改 

PUBLIC 组 :

1、它是 SYS组的一个成员 
2、有权SELECT系统表及视图 
3、不能以 PUBLIC身份连接数据库  自版本 6.0.3之后支持 

DBA ID :

1、有权修改除系统表以外所有数据库 
2、最初的口令是 SQL 
3、要限制具有 DBA权限的人数 

DBO ID 
1、用作与 ASE 的可兼容性 
2、它是与 ASE兼容的系统表的主人 


数据控制语言(DCL)的使用:

1、利用 DCL来建立用户,用户组并为其授权
2、有两个动词:  grant 和revoke
3、DCL语句是自动被提交的

建立用户和设定口令 :
1、建立用户ID 
2、改变已有用户ID的口令 
3、实例 
GRANT CONNECT TO mary IDENTIFIED BY bluesky;
GRANT CONNECT TO mary, george IDENTIFIED BY bluesky, sheep; 
GRANT CONNECT TO mary IDENTIFIED BY redapple;

删除用户:

1、删去用户 ID 
要具有 DBA 权限 ,该用户所拥有的对象也都被删除 

2、实例 
REVOKE CONNECT FROM mary;
REVOKE CONNECT FROM mary, george;

分派用户权限:
可以分派以下各类权限:
1、EXECUTE 权 
2、对表的操作权 
3、RESOURCE 权 
4、DBA 权 

下面将按其受限制程度由低到高的次序来讨论 

EXECUTE 权限 
1、允许用户执行指定的存储过程 
2、利用存储过程用户可以要求执行并没有按常规方式授权的命令,比如,用户若有权执行一个能修改数据的存储过程,他并不需要具有 UPDATE权限 
3、获得存储过程的执行权并未获得对基础对象的某种权限 

对表的操作权 :
SELECT 
INSERT 
UPDATE 
DELETE 
ALTER 改变表结构 
REFERENCES 增加索引和键值 
ALL 上述的所有权限 


特殊权限:

1、RESOURCE 权限
2、建立和删除如下数据库对象的权限 (表 存储过程 视图 函数) 
3、DBA权限 
4、所有数据库权限 能建立及删除用户口令  能访问所有的表 
5、注意,各项权限应分别授予!

EXECUTE 权限的授予和回收 :

授予或回收对一个存储过程的执行权 
实例 
GRANT EXECUTE ON employee_update to mary;
GRANT EXECUTE ON employee_update to jane, bob, gary, mike; 
REVOKE EXECUTE ON employee_update from mary;


授予对表的操作权限 :

基本语法 :
GRANT [SELECT (column-name, …) | INSERT | UPDATE (column-name, …)  | DELETE | ALTER | REFERENCES | ALL] ON table-name TO userid 

以下用户可以对表或视图执行此命令:
1、DBA 
2、对象主人 
3、靠 GRANT OPTION获得权力的用户 

授予对表的如下操作权限 :
1、SELECT — 用户可对表的数据进行读取 ,可只限于某些列
2、INSERT — 用户可对表插入数据 
3、UPDATE — 用户可修改表数据 ,可只限于某些列 
4、DELETE – 用户 可删去表中数据 
5、ALTER — 用户可执行 ALTER TABLE命令 注意,它会使模式 (schema)改变! 
6、REFERENCES — 用户可增加索引和键 
7、ALL-授予上述所有权限

授予对表进行操作的权限 :
GRANT SELECT ON department TO mary; 
GRANT INSERT ON department TO george; 
GRANT UPDATE (dept_head_id)ON department TO george;
GRANT ALTER ON department TO george; 
GRANT ALL ON department TO george; 

一次授予多种权限 :
用一个语句可实现授予多种权限,
GRANT SELECT, INSERT, UPDATE (dept_head_id)  ON department 
TO mary, jane, joe;

获得再授权的权力 :
DBA 或表的主人,可把对表进行操作授权的权力传递给其它用户。
GRANT SELECT ON department TO mary WITH GRANT OPTION;

特殊权限 :
有两类特殊权限:
1、RESOURCE 
用户可以建立数据库对象   GRANT RESOURCE to mary;
2、DBA 
让用户能对该数据库实现全部控制 
GRANT DBA to mary;

权限的回收 :
回收用户的某些权限 
REVOKE INSERT ON department FROM mary; REVOKE RESOURCE FROM bob;

权限的级联回收 :

在完成以下一系列操作之后,用户 bob, mary及 jane 都会失去对employee表的SELECT权力。 

1、DBA 执行 :
GRANT SELECT ON employee TO mary WITH GRANT OPTION; 
2、Mary 执行 
GRANT SELECT ON employee TO bob, jane;
3、DBA 又执行
REVOKE SELECT ON employee from mary;

建立用户组:

1、采用用户组可简化授权的管理 
2、任何用户组都自动成为 PUBLIC组的成员 
3、一个用户 ID可成为多个用户组的成员 
4、一个用户组还能是另一个用户组的成员 

建立用户组 :
1、建立用户 ID 
在创建时如果不加 IDENTIFIED BY 选项,则只能创建一个用户组,它不能象常规的用户那样去连接数据库。 
2、可利用Grant group 语句对一个用户 ID冠以用户 组状态。 
实例 :
以下的 accounting 用户组可以一个用户身份等录
GRANT CONNECT TO accounting IDENTIFIED BY orange; 
GRANT GROUP TO accounting; 

以下的 payrol用户组不能以用户身份登录 
GRANT CONNECT to payroll;
GRANT GROUP to payroll;

用户组权限 :

用户组成员可以继承针该用户组对以下对象以明显方式所获得的权力: 
表 
视图 
存储过程 

以下几方面的权限不能为组成员所继承: 
属主权
DBA 权限
RESOURCE 权限 
GROUP 权限


PUBLIC用户组 :

1、所有的用户都自动成为该组的成员
2、利用 PUBLIC 用户组,授权所有的用户都可访问某些表 

GRANT SELECT ON table-name TO PUBLIC

用户组属主 :
在访问属于本组的对象时,不必在其名字前加属主名。 
实例:
1、sales_order 表若属于 accounting用户组
2、Mary 正好是 accounting 用户组的成
3、则Mary 可执行如下的语句 
SELECT * FROM sales_order;

建立属于用户组的对象 :
1、具有CONNECT特权的用户组ID可直接登录数据库并建立其自己的数据库对象。 
2、对于不具有 CONNECT特权的用户组可由 DBA 为其建立对象 
实例 CREATE TABLE accounting.sales_order…; 

3、组内成员在访问本组对象时,无须在该对象名字前面缀以组名。 

增加用户组成员 :
1、可把一个用户或用户组增加为另一组的成员。
2、DBA或用户组主人可完成此功能 
3、实例
使一个用户成为某个用户组的成员 
GRANT MEMBERSHIP IN GROUP accounting TO mary;
使一个用户组成为另一个用户组的成员
GRANT MEMBERSHIP IN GROUP finance TO accounting; 
Mary 同时具有 accounting 和 finance 两个组的特权 

由用户组中删去成员 :

1、DBA 或用户组主人可完成此功能。
2、实例 
REVOKE MEMBERSHIP IN GROUP accounting FROM mary; 
Mary不再是 accounting 或 finance用户组的成员了。 

小    结 :

1、ASA为每个新的数据库都能自动地创建 SYS 和PUBLIC 用户组以及 DBA 和 DBO ID。
2、在建立了用户 ID和口令之后你可以利用 SQL的数据控制语句 GRANT 及 REVOKE.分派权限。 
3、可以授予用户的权限有以下几类: EXECUTE  存储过程,对表的操作,RESOURCE 及 DBA 特权。 
4、当用户刚被建立,它就成了 PUBLIC用户组的成员。
5、针对存储过程的授权是指对其的可执行权
6、对单个用户 ID分别授权会很耗时且易失误。利用用户组来管理权限会更加有效。


 jazy 回复于:2003-02-23 17:30:51

事务处理:

目    标 

1、定义一个事务 
2、解释在Adaptive Server Anywhere环境下什么时候开始一个事务 
3、解释什么是保存点以及什么时候提交在保存点完成的改变 
4、说明Adaptive Server Anywhere如何能保障能把事务当作一个原子化的工作单元来处理 
5、识别并描述Adaptive Server Anywhere中所采用的三类锁 

6、解释事务的阻塞以及它是如何在Adaptive Server Anywhere中被设置的 
7、识别两类死锁以及如何使死锁的发生极小化 
8、识别四种隔离级别以及何种应用采用何种隔离级别 

内    容 
1、事务 
2、事务原子化 
3、事务可恢复性 
4、事务一致性 

事务:
1、事务的原子化 :
事务中的所有语句要么全部执行要么一个也不执行。
2、事务的可恢复性 
当系统出现故障之后,事务必须被恢复。
3、事务一致性 
同时执行的各事务绝对不能对彼此的数据造成 “污染”。 

链式(Chained)事务模式:
1、在出现下列情形后的第一个语句开始一个事务
   连接到一个数据库 
   COMMIT 或 ROLLBACK 
     BEGIN TRANSACTION
2、除非明显地给出 COMMIT 或 ROLLBACK否则一个事务绝不会结束 
3、为与ASE兼容,可把Adaptive Server Anywhere设置为非链式模式 (隐含地实现 COMMIT) 


交互式 SQL 及 COMMIT(提交) :
1、交互式SQL具有自动提交的选项:
a>;使在每个命令之后自动提交 
模拟非链式模式 
b>;完成现有的交互式 SQL时自动提交 

2、千万留神!你正在使用的是什么选项 
SET OPTION auto_commit = 'on‘;
SET OPTION commit_on_exit = 'on‘; 
SET PERMANENT; 


COMMIT and ROLLBACK:
1、COMMIT 让修改永久化 
该事务中的所有语句都被执行成功了 
2、ROLLBACK 把所有的改变全部复旧(undo)
事务中的任何语句失败时

SELECT . . .;
UPDATE . . .;
IF . . . THEN COMMIT
ELSE ROLLBACK
END IF; 

要考虑应用的可移植性 :

1、为避免在不同模式中的二意性,应当: 
a>;每个事务都用 BEGIN TRAN开始 
b>;每个事务都用 COMMIT 或 ROLLBACK结束

实例 
BEGIN TRANSACTION; 
UPDATE…; 
INSERT…; 
COMMIT TRANSACTION; 

保存点 :
1、用来界定在一个事务中一组逻辑上相关的任务 
2、使得能根据某种条件逻辑仅把事务中的一部分进行回滚 
3、保存点可被嵌套 
4、在数据行数较多的事务中很有用 

建立保存点 :
语法 
SAVEPOINT savepoint-name;
实例 
SAVEPOINT spt_abc;

回滚到保存点:

1、把自该保存点之后完成的工作全部复旧(undo)
ROLLBACK TO SAVEPOINT [savepoint-name]; 
2、例 1 — 回滚到 spt_123 
SAVEPOINT spt_abc; 
INSERT…; 
SAVEPOINT spt_123; 
UPDATE…; 
ROLLBACK TO SAVEPOINT spt_123; 

3、例 2 — 回滚到 spt_abc 
SAVEPOINT spt_abc; 
INSERT…; 
SAVEPOINT spt_123; 
UPDATE…; 
ROLLBACK TO SAVEPOINT spt_abc; 



释放保存点 :
1、从激活的保存点清单中删去保存点 
2、仍能回滚到一个已释放的但命了名的保存点 
3、并不释放任何锁 锁在整个事务期间都被保持 


例 1 —释放最近的保存点 
RELEASE SAVEPOINT; 
例 2 —释放保存点spt_abc 
RELEASE SAVEPOINT spt_abc; 

事务处理 :

1、作为一个事务看待的逻辑上相关各SQL语句必须作为单个工作单元来执行 2、当系统故障时事务中的数据必须被恰当地恢复 
3、并发作用于同一数据上的各事务在执行时不可破坏数据一致性 

提交保存点完成的改变 :
1、只要事务尚未被提交,自某些特定的保存点之后完成的改变都能被回滚。 
2、仅当整个事务被提交时,才提交各保存点的改变。


回滚日志(Rollback Log)
用于保证事务的原子性!

1、储存在内存及该数据库文件中 
2、包含被事务修改了的各数据行的前映象及“逆向SQL”操作 
3、当事务被提交或回滚时,属于该连接的回滚日志被抹去.


事务结束:
COMMIT — 回滚日志被释放 
ROLLBACK — 利用回滚日志重置以前的值 


事务的并发性 :
1、事务之间会造成彼此干扰 
2、利用锁和阻塞机制来处理这种干扰  


锁机制:
1、防止并发事务彼此造成干扰 
2、自动实现行级锁 
3、封锁被保持到COMMIT 或 ROLLBACK 
4、四种锁: 写 插入 读 幻象(Phantom) 
5、两大类: 共享(Shared) 排它(Exclusive)

共享锁:

1、读锁 
a>;对一个具有读锁的行其它事务仍可对该行获得读锁 
b>;防止写锁 
c>;不能对具有写锁的行获得读锁 
2、幻象(Phantom)锁 
a>;防止在幻象锁行之前马上插入数据 
b>;在利用索引查询和进行表扫描时使用它 
c>;幻象锁会降低写入性能 

排它锁:

1、写锁 
a>;对含有写锁的行,其它事务再也不能获得任何类型锁。 
b>;对含有任何类型锁的行,其它事务再也不能获得写锁。 
2、插入锁 
a>;获得往一个特定位置插入一行的权力 
b>;当利用读锁防止其它事务的更新或删除时,同时获得插入锁。 


事务的阻塞:

1、排他锁会产生潜在的冲突 
第二个事务所请求的资源已被另一个事务的封锁给阻塞 
2、解决冲突的办法是: 
a>;让第二个事务等待 
b>;迫使第二个事务的锁请求失败

阻塞的配置:

1、BLOCKING ON 迫使事务等待 
2、BLOCKING OFF 迫使事务的锁请求失败 
3、实例: 
SET OPTION BLOCKING = 'OFF' 
SET OPTION BLOCKING = 'ON'

权衡:
1、BLOCKING OFF 适用于DSS应用(事务中涉及大量数据) 
迫使事务请求失败 
2、BLOCKING ON 适用于OLTP应用(事务短小) 潜在地会产生死锁

死锁:
1、两个以上的事务竞争同样的资源 
2、一组事务同时进入了无法获得某种资源而继续进行下去的状态。 
3、BLOCKING 是 ON 
4、死锁的两种类型: 
a>;循环阻塞 
b>;线索阻塞 
5、牺牲最后一个被死锁的事务


循环阻塞:
1、各事务彼此等待对方已占有的资源 
2、除非获得它们所需资源否则事务处于阻塞状态 
3、被阻塞的事务不会释放锁 
4、形成死锁解决办法: 
a>;自动发现死锁 
b>;第一个事务继续下去 
c>;把最后一个被阻塞的事务回滚 
必须让客户应用能发现这种情况并且重新提交该事务

如何减少循环阻塞:

1、都按约定的次序 (比如按字母顺序)对多个表进行更新 
2、事务应尽可能地小(只把确实必须作为一个工作单元的,以原子化方式执行的操作放在同一个事务中)。

线索阻塞:
1、在数据库引擎中全体可激活的执行线索(缺省值为20个) 
2、被阻塞的事务并不释放执行线索 
3、形成死锁解决办法: 
a>;自动发现死锁 
b>;把最后被阻塞的事务回滚 
c>;较早的事务利用释放的线索继续下去


如何减少线索阻塞
1、事务应尽可能地短小 
2、利用 -gn 参数增加数据库线索 
dbsrv7 -gn 50 mydata


隔离级别:

1、指定读封锁的级别 
2、读锁是可以选择的 
3、较低的隔离级别会导致数据的不一致性 
4、四个隔离级别 
a>;级别 0 ( Adaptive Server Anywhere的缺省级别) 
b>;级别 1 (ASE的缺省级别)
c>;级别 2
d>;级别 3


级别 0 :
1、不管数据行是否具有写锁都可读取 
2、无法保证并发的事务又对该行进行修改或是把修改又给回滚 
级别 1 :
1、允许读取未加写锁的数据行 
2、仅在并发地读取该行时施加并保持读锁 
3、不能保证在整个事务期间该行数据不再改变
级别 2:
1、仅能读取未加写锁的数据行 
2、施加读锁后要一直保持到事务结束 
级别 3 :
1、仅能读取不含写锁的结果集中的数据行 
2、对结果集中的每一行及其用到的每一个索引都施加读锁且保持到事务结束

ODBC 用法 ?

ANSI级别        ODBC       主要特性   
    O                  RU      读未提交的事务
    1                   RC     读已提交的事务 
    2                   RR     可重复读
    3                   TS     事务串行化


事务并发性和一致性:

low                    consistency                   high
                                                        isolation level 3
                                 isolation level 2
                 isolation level 1
isolation level 0
low                    concurrency                   high



脏 读:

一个事务读取了被并发事务作了修改但后来又作了回滚的数据行 

事务 A 修改数据行 
事务 B 读取该行 
事务 A 执行了回滚 
由此,事务 B 获得了一个无效的(脏)数据。

无法重复读:

在一个事务中,对同一数据行读取多次,但各次获得不同结果。 
事务 A 读取一行数据 
事务 B  对该行作了更新或删除并且提交了其改变 
事务 A  又来读该行 
在第二次,事务 A 获得不同的数据或者错误码

幻想行:

在一个事务中对同一数据行集合读取多次,但各次获得不同结果 

事务 A 利用 WHERE子句选取一组数据。 
事务 B 对满足事务A中 WHERE 条件的数据行又执行了插入,更新或删除操作。 
事务 A 仍利用同样的 WHERE子句来选取数据。 
在第二次,事务 A 获得不同的结果集。


隔离级别的选择:
1、级别 0 (RU)
允许脏读,无法重复读及出现幻象行。 
适用于读取大量数据的应用中。 
2、级别1 (RC)
防止脏读 
允许无法重读及幻象行 
适应于读取大量数据的应用中
3、级别 2 (RR) 
防止脏读及无法重复读 
允许幻象行 
适应于要求事务处理串行化的应用中 
4、级别 3 (TS)
防止脏读
无法重复读及幻象行 
适应于要求事务处理串行化的应用中

推荐作法:
1、利用较低的隔离级别作为缺省 
2、针对事务中致关重要的读操作设置为更高的级别 
3、应当及时降回到较低隔离级别


小     结
1、一个事务是一组逻辑上相关并要求作为一个原子化的工作单元来完成的任务。 
2、一个保存点是在一个事务中的一组逻辑上的相关的任务。 
3、Adaptive Server Anywhere 利用回滚日志( 回滚日志)来保证一个事务作为一个整体被完成,如果不能被成功地完成则全部复旧。
4、当 Adaptive Server Anywhere 在系统故障之后被重新启动时,它能利用校验点,事务日志及回滚日志自动把数据恢复到一致状态。 
5、为防止并发事务彼此进行干扰, Adaptive Server Anywhere 自动实现行级封锁。 
6、排它锁潜在地使事务间产生冲突。


 jazy 回复于:2003-02-23 18:13:59

存储过程 

目标 :
1、定义存储过程 
2、建立一个简单存储过程 
3、讨论存储过程的优点和缺点 
4、通过实例介绍Adaptive Server Anywhere对SQL的过程化扩展 
5、说明存储过程的结构 
6、定义一个复合语句 
7、解释输入参数与存储过程返回的结果集之间的差别 



内容 
1、关于存储过程 
2、建立存储过程 
3、过程化语言 
4、调用存储过程 

存储过程:
1、SQL 语句和流程执行语句 
2、仅允许间接存取数据 
3、封装着公用的: 算法和事务 
4、它被存储在系统表 SYSPROCEDURE中 
5、仅在该过程第一次被执行时进行编译 
6、可接收输入参数 
7、可调用其它存储过程 
8、可返回状态值 
9、可返回输出参数或结果集 

存储过程的优点 :

1、改善性能 
2、提高安全性 
3、减少网络交通量 
4、提高开发人员的生产率 
5、能充分发挥专家的作用 
6、简化了应用的维护 
7、应用的灵活性 
8、确保算法的一致性 
9、数据透明性 

存储过程的缺点:

1、可能加重了服务器方的负载 
2、要注意对该共享资源的管理以免造成并发冲突 
3、可移植性差 

存储过程的结构 :
在CREATE PROCEDURE 语句中可包含:
1、过程参数清单的说明
2、结果集 
3、过程体,它由复合SQL语句构成 

存储过程的结果:
1、OUT 或 INOUT 参数 
2、结果集 
3、允许存储过程返回多个列和行 
4、RETURN 状态 
5、允许你无条件地退出一个存储过程,同时返回一个特定的状态值。 

CREATE PROCEDURE:

1、CREATE PROCEDURE 
进行语法分析 存入系统表 SYSPROCEDURE 
2、直到被调用时才被编译 
然后建立存取计划并存储在内存中 
在ASE中,你必须以明显方式指明要进行编译。 
3、基本语法 CREATE PROCEDURE procedure-name  ([IN | OUT | INOUT] parameter-name datatype [DEFAULT expression], …) [RESULT (result-col1, result-col2, ...)] compound-statement

实例 :
CREATE PROCEDURE big_num 
(IN a INT, IN b INT, OUT c INT) 
 BEGIN
 IF a >; b 
THEN 
 SET c = a;
 ELSE 
 SET c = b; 
 END IF; 
END; 

参数列表清单 :
1、用来向存储过程传送值或接受存储过程返回值 
2、参数的定义 
种类: IN, OUT 或 INOUT 
名字: 要遵守数据库标识符约定 
数据类型: 任何有效的Adaptive Server Anywhere 数据类型 
可给出 DEFAULT 值 
3、在掉用该存储过程时,必须为每个参数提供一个值。 

为参数赋值 :

1、SET 语句 
2、SELECT INTO 语句 

实例:
CREATE PROCEDURE order_count
(IN @customer_id INT, OUT @orders INT) 
BEGIN 
 SELECT COUNT("dba".sales_order.id)  INTO @orders FROM "dba".customer KEY LEFT OUTER JOIN "dba".sales_order WHERE "dba".customer.id = @customer_id; 
END


结果集 :
1、允许一个存储过程返回多行 
2、实例 1 — 返回客户的 ID和订单 
CREATE PROCEDURE customer_orders( ) 
RESULT (customer_id INT, order_count INT) 
BEGIN  
SELECT "dba".customer.id, COUNT( "dba".sales_order.id )  FROM "dba".customer KEY LEFT OUTER JOIN   "dba".sales_order GROUP BY "dba".customer.id; 
END; 

3、还可由多个SELECT 语句返回数据
4、结果集中必须: 列的数目相同 有相同的数据类型 (或是可进行隐式转换)
5、T-SQL 可以包含动态的结果集
6、实例 2 — 返回客户和联系人的清单 
CREATE PROCEDURE custs_and_contacts ( ) 
RESULT (lname CHAR (36), fname CHAR (36)) 
BEGIN 
SELECT lname, fname FROM "dba".customer; 
SELECT last_name, first_name FROM "dba".contact; 
END;


组合语句 :

1、用在过程本体中 
 被BEGIN 和 END所包围 
2、可包含局部说明,它仅在组合语句的上下文中有效。 
局部说明可被嵌套的子句所访问 
3、被内部语句所使用的资源要在它们的语句的 END处才释放 
4、实例:
CREATE PROCEDURE someproc ( )
  BEGIN
    DECLARE x INT;
    DECLARE y INT;
    SELECT count(*) INTO x FROM TableA;
    SELECT count(*) INTO y FROM TableB;
    BEGIN
      DECLARE z INT;
      CALL greater (x, y, z); 
      PRINT ‘z = %1!’, z;
      END;
 END;


编写存储过程的注意事项 :

1、校验命令分隔符 
2、语句的分隔 
使用分号 
3、应采用完全受限命名 
4、应采用无二意性的日期和时间格式 


过程化语言 :

1、Adaptive Server Anywhere 过程化扩展 
说明语句 
条件语句 
反复循环语句 
分支语句 
错误处理指令 
2、编写存储过程就类似于编程序 

说明语句 :
1、BEGIN, END 
2、DECLARE, SET 
3、说明: 变量 表达式 语句块 
4、赋值 

BEGIN 和 END:
1、定义一个组合语句 
2、可包含局部变量,游标,临时表及表达式。 
3、语法 
BEGIN [ATOMIC] 
… 
… 
END
4、实例
BEGIN 
 UPDATE product  SET unit_price = 1.25 * unit_price; 
 UPDATE employee  SET salary = .95 * salary; 
END; 


原子化多个SQL语句 :
1、这些语句或是全部完成或是一个也不做 
2、确保数据的一致性 
3、使用 BEGIN ATOMIC 语法 
4、实例: 
CREATE PROCEDURE update_dept(IN @old_dept_num INT, IN @new_dept_num INT, IN @new_dept_name CHAR (40), IN @new_dept_head_id INT) 
BEGIN ATOMIC 
    INSERT INTO department (dept_id, dept_name,    dept_head_id)   VALUES (@new_dept_num, @new_dept_name, @new_dept_head_id); 
    UPDATE employee  SET dept_id = @new_dept_num 
    WHERE dept_id = @old_dept_num; 
    DELETE FROM department 
    WHERE dept_id = @old_dept_num; 
END ;

DECLARE:

1、说明变量,游标,临时表及表达式。 
2、利用SET设置初始值 
3、必须紧跟在一个 BEGIN 语句之后 
ASE的T-SQL 允许在存储过程中的任何点使用 DECLARE 

DECLARE variable-name datatype; 
SET variable-name expression; 
DECLARE LOCAL TEMPORARY TABLE table-name (table-definition) &amp;#8226;[ON COMMIT {DELETE | PRESERVE} ROWS]

4、实例: 
BEGIN 
  DECLARE discount numeric (6,2); 
  SET discount = .15;
  SELECT discount * unit_price FROM product; 
END 
BEGIN 
  DECLARE LOCAL emp_temp (emp_fname char(20), emp_lname  char (20) ON COMMIT DELETE ROWS); 
END 


条件语句 :

1、根据前面的语句来改变执行流程 
2、IF 
3、CASE 
4、RETURN (经常是伴有条件来使用)

IF 语句 :
1、当一个条件为 TRUE(真)时准许执行 
2、ELSE 子句是当一个条件为 FALSE(失败)时准许执行 
3、ELSE IF 准许附加的条件 
4、语法: 
IF search-condition1 THEN statement-list1;
[ELSEIF search-condition2 
 THEN statement-list2];
[ELSE statement-list3];
END IF;

5、实例 
IF @color = red 
THEN SELECT * FROM product  WHERE color = 'red'; 
ELSEIF @color = blue 
THEN 
SELECT * FROM product  WHERE color = 'blue'; 
ELSE SELECT * FROM product; 
END IF; 


CASE 语句 :

1、利用WHEN子句指明多个条件 
2、ELSE子句是用于如果没有一个WHEN子句能成为 TRUE时 
3、语法: 
CASE value-expression
 WHEN constant1 THEN statement-list1
 WHEN constant2 THEN statement-list2
 WHEN constant3 THEN statement-list3
 ELSE statement-list4;
END CASE; 

4、实例 
CASE @id_type 
 WHEN 'cust' THEN 
SELECT id  FROM customer 
 WHEN 'dept' THEN 
SELECT dept_id   FROM department 
 WHEN 'contact' THEN 
SELECT id  FROM contact 
 ELSE 
SELECT emp_id FROM employee; 
END CASE; 

RETURN 语句:

1、导致立即退出一个存储过程 
2、可带有表达式以向调用者返回单个值 
3、语法: 
RETURN [表达式] 
4、实例: 
IF  @quantity =>;1 
THEN 
UPDATE sales_order_items  SET quantity = @quantity; 
ELSE RETURN 'You must enter a quantity'; 
END IF; 


反复循环语句:

1、请看Adaptive Server Anywhere参考手册第9章:SQL语句 
2、 LOOP 语句 [WHILE…] LOOP 
3、其中 WHILE 条件是选项 
4、FOR (用在游标中)


WHILE…LOOP:

1、只要WHILE条件为TRUE则不断地重复执行 
2、语法 
[statement-label:]
 [WHILE condition] LOOP 
statement-list 
END LOOP [statement-label] 

3、实例: 
SET @total = 0;
SET @num_items = 0; 
INSERT INTO total_temp VALUES (0,0); 
loop1: 
WHILE @total < 100.00 LOOP 
 UPDATE total_temp SET num_items = @num_items; 
SET @total = @total + SELECT unit_price FROM product WHERE id = @product_id; 
 SET @num_items = @num_items + 1; 
END LOOP loop1; 
SELECT num_items from total_temp; 
END;


分支语句:

1、改变执行流程 
2、LEAVE 
3、CALL

LEAVE:
1、结束一个过程循环 
2、要求一个语句标号 
3、语法: 
LEAVE 语句标号 
4、实例: 
SET @total = 0; 
SET @num_items = 0; 
INSERT INTO total_temp VALUES (0,0); 
loop1: 
WHILE @total < 100.00 LOOP 
 UPDATE total_temp SET num_items = @num_items; 
 IF @total >; 100.0 
THEN LEAVE loop1; 
 END if; 
SET @total = @total + SELECT unit_price 
FROM product WHERE id = @product_id; 
 SET @num_items = @num_items + 1; 
END LOOP loop1; 
SELECT num_items from total_temp; 
END; 

CALL:
1、调用一个存储过程 
2、语法: 
CALL存储过程名  (参数名值 ,…); 
3、实例: 
CALL sp_sales_order (23345, 19238); 

错误处理 :

1、缺省的错误处理 
   向调用者返回出错消息 
2、例外处理 
   允许存储过程在内部处理错误 
   并不向调用者返回出错消息 
   关键词EXCEPTION 
3、ON EXCEPTION RESUME 
     用在 CREATE PROCEDURE 
     既使出现例外也允许存储过程继续运行 
   适用于大型的批作业中 
4、SIGNAL 
    人为地制造一个意外(它不是属于Adaptive Server Anywhere的一种意外状态) 
   适用于对存储过程的测试 
   语法:  SIGNAL exception-name
5、CREATE MESSAGE 
     建立一个用户定义的出错消息。 
   语法: CREATE MESSAGE message-num AS 'message text' 
6、sp_addmessage 
     增加一个包含用户定义的出错号码的用户定义消息 
    CALL sp_addmessage (error-number, ‘format-string parameters’) 
7、RAISERROR
     类似于 SIGNAL 
     此外还明确地给出并非来自数据库缺省说明中的实际出错消息 
    RAISERROR error-number, 'format-string parameters'



删除存储过程 :
1、必须是DBA或存储过程的主人 
2、语法: 
DROP PROCEDURE procedure-name; 
3、实例: 
DROP PROCEDURE myproc;

调用存储过程 :
1、在CALL语句中给出存储过程名 
参数可按名字或按位置次序来赋值 
2、语法: 
CALL procedure-name ([parameter-name =] expression, …) 
3、实例: 
CALL update_dept (123, 12300, 'Accounting', 987)


存储过程查询计划 :

1、存储过程在它第一次被执行时进行编译
2、在数据库运行时被编译好的代码和查询计划被保留在内存中 
3、在第一次执行时应确保: 
各索引已安排好 
各参数取值的数据类型要符合于用户实际的需要 

小结 :

1、存储过程中包含SQL语句及对SQL的过程化扩展.
2、存储过程可以接受参数,调用其它存储过程,返回一个状态值或参数及结果集。 
3、Adaptive Server Anywhere支持的过程化扩展包括说明语句,条件语句,循环语句,分支语句和错误处理命令。 
4、具有RESOURCE 权限的用户才能建立存储过程 
5、执行 CREATE PROCEDURE 语句,导致让 Adaptive Server Anywhere 进行语法分析并把该存储过程存入系统表SYSPROCEDURE。 
6、调用一个存储过程则导致 Adaptive Server Anywhere 从系统表中检索该存储过程,如果自数据库启动以来它是第一次被调用则对它进行编译。 


复习题 :
1 用实例说明Adaptive Server Anywhere所支持的两类用于存储过程的对SQL的过程扩展语句。 
2. 说明存储过程的结构 
3. 说明存储过程输入参数与返回结果集之间的差别 
4. 建立存储过程需要有什么权力? 
5. 删去存储过程需要有什么权力? 
6. 调用存储过程需要有什么权力?


注明:存储过程方面的内容和ASE有很大的区别,这点需要特别注意!


 jazy 回复于:2003-02-24 20:18:16

触发器

目标 
1、定义触发器 
2、解释触发器的使用 
3、讨论使用触发器的优点 
4、列出并说明Adaptive Server Anywhere所支持的四类触发器 
5、Adaptive Server Anywhere所支持的两种触发器激发时机是什么? 
6、触发器的结构 
7、建立触发器 


内容 
1、触发器 
2、触发器的使用 
3、触发器的类型 
4、触发器的实现 

定义触发器
1、它是服务器方的编程,用以制约数据完整性 
2、它由SQL及流程扩展语句构成 
类似于存储过程 
3、是自动执行的 
4、与引发它的事务一起被提交或回滚的 
5、继承着该表建立者的权限 

触发器的用途 
1、利用触发器能实现: 
A>;对DDL而言过分复杂的数据数据完整性规划 
B>;在数据项间存在逻辑关系的业务规划 
C>;自动进行数值修改 
D>;审计 

制约数据完整性 
1、触发器支持 
A>;声明参照完整性 
B>;缺省值 
C>;NOT NULL 约束 
D>;CHECK 条件 
E>;主键 


触发器的优点 
1、独立于客户应用对数据库的访问 
2、标准化 集中于中央位置实现各种规则 
3、高效性 编码是已编译的 
4、安全性 用户和应用无法回避触发器 


触发器的类型 
1、事件驱动的—当发生如下事件时可自动激发触发器 
插入 
删除 
更新 当任何一列被更新都激发 
列更新 仅当特定的列被更新时才激发它 

触发器作用范围和时间 
1、行级触发器 在每行之前或之后 
2、语句级触发器 在整个操作完成之后 
3、可激发同类型的多个触发器 
一下子全部激发 按特定的次序来激发 

建立触发器 
1、由组合语句构成 与存储过程具有同样的能力及特点 触发器不能包括参数和返回结果集 
2、语法 
CREATE TRIGGER trigger-name trigger-time trigger-event
FOR EACH [ROW | STATEMENT]
BEGIN
...;
...;
END

3、建立触发器的用户应具有以下权限 RESOURCE 权 对所需表的ALTER 权限 


插入型触发器 
1、实例 — 禁止增加一个已被解雇的新职员 
CREATE TRIGGER ai_employee AFTER INSERT ON employee REFERENCING NEW AS new_emp FOR EACH ROW 
BEGIN 
 IF new_emp.termination_date IS NOT NULL 
 THEN 
      RAISERROR 30000 'You cannot hire an employee you have already fired';
  END IF;
END

删除型触发器 
1、实例 — 禁止删除一个还未期满的雇员 
CREATE TRIGGER d_employee BEFORE DELETE ON employee REFERENCING OLD AS cur_emp FOR EACH ROW 
BEGIN
IF cur_emp.termination_date IS NULL 
   THEN 
     RAISERROR 30001 'You cannot delete an employee who has not been fired'; 
 END IF; 
END

更新型触发器 
1、实例 — 职员工资升不许降 
CREATE TRIGGER bu_employee BEFORE UPDATE ON employee
REFERENCING NEW AS after_update OLD AS before_update
FOR EACH ROW
  BEGIN    IF after_update.salary < before_update.salary THEN 
       RAISERROR 30002 'You cannot decrease a salary'; 
 END IF; 
 END



列级更新触发器 
1、实例 — 工资只可增加,仅当更新salary列时才激发触发器 
CREATE TRIGGER ub_empsal BEFORE UPDATE OF salary ON employee
REFERENCING NEW AS after_update OLD AS before_update
FOR EACH ROW
   BEGIN 
    IF after_update.salary <  before_update.salary 
    THEN         RAISERROR 30002 'You cannot decrease a salary';       
   END IF;

END


删去一个触发器 
1、语法 
DROP TRIGGER trigger-name 
2、实例 
DROP TRIGGER mytrigger 
3、要求对表有 ALTER 权限 



触发器的执行时机 
1、当数据库出现相应动作时自动被执行 
2、操作次序: 
BEFORE 触发器 
参照动作 
操作 
AFTER 触发器 

对ASE 触发器兼容性的考虑 
1、回滚 
   Adaptive Server Anywhere不支持触发器内的回滚 
   在ASE(或 T-SQL)的触发器中可包含回滚 
   触发器与激发该触发器的操作是原子化的,如果此触发器失败则该操作也自动失败。 
2、嵌套 
   一个触发器所执行的动作导致激发另一个触发器 
   Adaptive Server Anywhere 对嵌套层数未作明确限制 
   除非Adaptive Server Anywhere运行资源超出,ASE 给出可配置的最大限制数 缺省值是16

3、递归性
Adaptive Server Anywhere触发器可被设置为递归激发 
如果一个触发器执行动作会使本身又被激发,则导致递归激发。 
缺省情况是off 
 用IF UPDATE() 来处理递归 
在ASE 及与 T-SQL 兼容的触发器中不具有此特点 

小结 
1、触发器由SQL及流程控制语句构成 ,当触发器所检测的事件发生时自动执行该触发器。 
2、在制约复杂的完整性和一致性规则以及实现维持数据间逻辑关系的业务规划时,采用触发器是很有效的。 
3、触发器的主要优点是:标准化,高效性和安全性。 
4、有四类触发器:插入型,删除型,更新型及列级更新型。 
5、行级触发器的执行时机是在触发器操作所影响的每一行在被改变之前或其后。 
6、建立触发器用命令CREATE TRIGGER,删除触发器使用命令 DROP TRIGGER。它们都要求用户具有适当的权限。


 jazy 回复于:2003-02-24 21:08:05

备份与恢复 

目标 
1、讨论防止数据损坏的三种预防措施 
2、说明可考虑的几种备份策略 
3、标明哪些类型的故障可被Adaptive Server Anywhere恢复 
4、说明Adaptive Server Anywhere在出现校验点时都作些什么 
5、修理一个出毛病的事务日志或镜象文件 
6、恢复出现系统故障后的Adaptive Server Anywhere数据库 
7、恢复出现含有数据库文件或事务日志介质故障后的Adaptive Server Anywhere数据库 
8、删去一个Adaptive Server Anywhere数据库文件 
9、缩和解压缩Adaptive Server Anywhere数据库文


内容 
1、保护数据的预防措施 
2、备份数据库 
3、故障恢复 
4、Adaptive Server Anywhere的日志 
5、系统故障的恢复 
6、介质故障的恢复 
7、其它的维护手段 

保护数据的要点:

1、按着规定经常备份数据库 
2、把事务日志放在份开的设备上 
3、对至关重要的数据采用放在份开设备上的事务日志镜象 

备份数据库:

1、两种格式 
完全备份 --数据库及日志 
增量备份 --仅备份日志 

2、两种方法 
联机 (每周 7天,每天 24小时均可进行 )
完全备份 
增量备份 


备份策略 :

1、考虑因素: 
数据丢失会造成的危险 
那种数据丢失风险是可接受的 
不同的备份策略各有什么优缺点 
对数据可用性的要求 

备份和恢复策略 
1、备份和恢复策略必须是相容的 
检查备份和恢复策略 
它们是否能像所期望的那样工作? 
是否能获得正确的结果? 
是否能满足业务要求?

完全备份 
1、对数据库及事务日志都做拷贝 
2、是最简单的备份策略 
3、常用于相对小的数据库 
4、对大型数据库是不切合实际的 

增量备份 
1、使用周期 
完全备份数据库和事务日志文件 随后只备份事务日志 定期地重新开始这个周期 
2、周期过长则增加了数据丢失的风险,因为事务日志的备份有可能会丢失或损坏。重要的是要把日志备份存储在可靠的介质上 

3、通常用于大型数据库 


联机备份 :
1、无须停止数据库引擎就可完成 
2、提供一致性的数据库快照 
3、通常用于要求高可用性的数据库 
4、可进行完全备份或增量备份 


脱机备份 
1、要在数据库引擎停机后来完成 
2、当允许数据库引擎常规地停机时可采用此办法 
3、可进行完全备份或增量备份 




实施备份 
1、Adaptive Server Anywhere提供实用程序dbbackup来完成联机备份 2、脱机备份要利用操作系统中的文件拷贝命令完成 
3、在实施备份之前,应当利用实用程序 dbvalid 对数据库进行合理性校验。 如果该数据库是不合理的: 
 把它复原到最近的完好的备份 
 利用事务日志施加恢复 
 再立即对其作备份 


联机备份的实施 
语法: 
dbbackup [开关] 目录 
-c 设置连接参数 
-d 仅备份数据库文件 
-r 重命名日志并启动新的一个 
-t 仅备份日志 
-x 删去日志并启动新的一个 



故障类型 :

1、系统故障 
数据库不可用了,它并未遭破坏 
无须人工干预 
系统能自其故障处进行恢复 
恢复可能要花费一些时间 
2、介质故障 
数据可能被损坏了 
要使用数据库文件备份来解决 
把主数据库文件和事务日志文件散布在不同的物理设备设备上 


Adaptive Server Anywhere的自动恢复

利用日志和事务恢复机制 
仍需要实施常规的数据库文件备份才能有效 
应把数据库文件与事务文件放在不同的物理设备上 


Adaptive Server Anywhere日志:
校验点日志 
回滚日志 
事务日志 
事务日志镜象


校验点日志 :
其中包含自最近一个校验点以来所有的被修改的物理数据页(脏页)的前映象 
在Cache 中包含脏页的后映象 

每个数据库有一个校验点日志,直到下一校验点出现,它一直存在于数据库中。 


校验点:

1、刷新 cache 中所有的脏页并把它们写入数据库文件中 

2、出现的时机: 
在数据库引擎停机时 
自最近一个校验点之后 >; CHECKPOINT_TIME 
估算恢复所用时间 >; RECOVERY_TIME 
数据库引擎已空闲了足够的时间 
事务中发出CHECKPOINT命令 
未利用用事务日志而把事务提交给数据库时


校验点数据库选项:

1、利用 SET OPTION设定 当数据库引擎再次启动时起作用 

2、CHECKPOINT_TIME 校验点之间的最大间隔 缺省值 = 60 分钟 

3、RECOVERY_TIME 
自失败到完成恢复经过的最大时间间隔
缺省值 = 2 分钟 

回滚日志:

1、储存已修改了的数据的前映象及 SQL 需要复旧的修改 
2、每个打开的连接有一个回滚日志 
当事务被提交或回滚之后被释放
3、在内存中被建立,当出现校验点时被拷贝到数据库文件。 


事务日志 :

1、对数据库的每一个修改,都按其发生的次序在事务日志中储存一条记录。
各数据库使用一个激活的事务日志
还可能存在着其它的归档(archive)日志

2、应当把它建立在与数据库文件使用不同的控制器的另外的设备上 
当出现介质故障时能提供最好的可恢复性 

改变事务日志的位置 

1、利用 Sybase Central 或 dblog 实用程序

2、必须在数据库停止状态下才能改变日志位置

3、推荐: 
设备分开  设备分开 

4、实例   dblog -t d:\newdir\mydata.log c:\mydata.db


利用 Sybase Central改变日志位置:

1、打开 Utilities 文件夹 
2、双击 Change Log File Information 
3、 输入数据库文件位置 
4、选择 Create new or rename existing log file 并打入新的位置 
5、 如有必要,可输入镜象日志位置 
6、 如有必要,可改变 Transaction Log offsets。 
7、 设置选项 
8、 选择是否删去老的日志文件 



事务日志镜象 :
1、是对事务日志的全同拷贝 与事务日志同时被写入
2、应当放置在分开的物理设备上 
3、语法— 增加一个事务日志镜象 dblog -m mirror-name 
4、在 Sybase Central中,利用修改日志信息的实用程序。 

事务日志有效性?


事务日志和镜象恢复 :

依次执行以下几步: 
1、确定哪些部分出了毛病 
2、备份完好的文件 
3、把完好的文件拷贝到出毛病的文件 
4、重新启动数据库引擎 


识别有问题的文件 :
1、拷贝数据库备份
2、传送事务日志和镜象 
完好文件能不出问题的完成
出毛病的文件会产生错误消息
3、比较两个事务日志
4、使用磁盘实用程序来找出毛病
5、语法: dbtran log-file output-file 
6、Sybase Central
打开 Utilities文件夹
双击 Translate Log
指明要传送的日志文件
指明输出文件 
给定选项 


系统故障的恢复 :
1、运行磁盘验证实用程序
2、重新启动数据库引擎 
   根据校验点日志把数据复原到最近的校验点状态 
   根据事务日志把自校验点到出故障之间完成的修改都再实施一次 
   根据回滚日志把未提交的事务回滚 

介质故障的恢复 :

1、修复故障设备 
2、修复数据库
修复手段取决于数据库或日志设备是否受损



数据库文件的介质故障 :
1、一个事务日志 
自最后一次完全数据库备份以来从未做过备份 
2、多个事务日志 
自最后一次完全数据库备份以来已做过备份


利用一个日志进行恢复:
1、对当前的事务日志做系统文件拷贝 
2、复原最新的对数据库文件的完全备份 
3、启动数据库时采用 –a 开关并给出用以恢复的日志的名字 
4、对已恢复的数据库作备份 
5、再利用一个新的事务日志启动数据库引擎 
6、实例: 
dbsrv7 mydata.db -a mydata.log

利用多个日志进行恢复:

1、对当前的事务日志做系统文件拷贝 
2、复原最新的对数据库文件的完全备份 
3、针对早期的多次日志,多次启动数据库引擎每次都采用开关 -a ,但按时间次序份别给出不同的日志名字。 
4、备份已恢复的数据库 
5、再利用新的事务日志启动数据库引擎 
   另一种作法是,把最新的日志名重命名为恰当的名字。 

6、实例:
 dbeng7 class.db -a d:\oldlogs\mon.log 
 dbeng7 class.db -a d:\oldlogs\tue.log 
 dbeng7 class.db -a d:\oldlogs\wed.log 
 dbeng7 class.db -a d:\backup\class.log


存放事务日志的介质故障 :
1、数据丢失的可能性非常大
事务日志的介质故障之后的系统故障会导致损坏日志 

2、应当使用放在分开设备上的日志镜象

3、备份完好的数据库文件 

4、删除事务日志 

5、利用 –f (无日志)开关重新启动完好的数据库 

把数据库复原到最近的校验点处 
对该校验点之前未提交的一切事务都进行回滚 
启动一个新的事务日志 

6、备份已恢复的数据库

7、利用新的事务日志重新启动数据库 



恢复未提交的修改 :

1、利用带 -a 开关的dbtran 实用程序把事务日志的内容转换为一些可读的SQL 语句 

2、留神:回退事务常常是不完整的,未必需要恢复所有的未提交的事务。 

3、例如:
   dbtran -a class_db.log changes.sql 
     恢复未提交的事务 
   在输出文件中包含回滚事务 
   输出文件change.sql是可读的 SQL 文件 
   你可对其进行编译,使其仅包含你打算回滚的未提交事务。 

用于数据库维护的其它实用程序 :

1、dberase 
删去数据库文件 
2、dbshrink 
把数据库文件压缩为一个压缩了的,只读格式 
3、dbexpand 
把被压缩的数据库展开 
4、dbwrite 
把对一个只读数据库所作的修改都储存在一个新建的可写入文件中 
日后可利用该可写入文件再对压缩了的数据库进行修改: 
Translating the write log (.WLG)
Applying the resultant SQL to the database



删去数据库 :

1、交互式SQL语法  DROP DATABASE 文件名

实例 : 这个语句是不进行再次确认的删去数据库 mydata.db : 
 DROP DATABASE 'c:\mydata.db' 

2、dberase (命令行) 
这个命令是不做再次确认的删去数据库 mydata.db : 
 dberase -y c:\mydata.db 


删去数据库文件 :

Sybase Central 
1. 打开 Utilities 文件夹 
2. 在右半边, 双击 Erase Database. 
3. 点击 Next. 
4. 必要时,改变数据库连接。 
5. 点击 Next. 
6. 打入你要删去的数据库或可写入文件的名字. 
7. 点击 Next. 
8. 点击 Finish 则删去数据库 


压缩数据库文件:

压缩数据库文件 
压缩后的数据库文件是只读的 
被压缩后的数据库文件能紧缩 40-60%  
利用 dbwrite来搜集对已压缩数据库的修改 
利用 dbexpand进行解压 


实际应用 :
准备发送给客户的含有定货项目和其价格的数据库 
可把该数据库存放在 CD-ROM这类只读介质上

dbshrink:

语法:dbshrink [switches] database-file [compressed-database-file] 

实例:

dbshrink –q mydata.db 
-q — 静止模式,抑制消息。
此时,压缩文件的缺省名为:mydata.cdb

利用 Sybase Central 压缩数据库:

1. 打开 Utilities 文件夹 
2. 在右半边双击 Compress Database 
3. 点击 Next 
4. 必要的话,改变你的数据库连接。 
5. 点击 Next 
6. 输入要压缩的数据库名及存储已压缩数据库文件的位置 
7. 点击 Finish  


dbexpand:

语法: 
dbexpand [switches] compressed-database-file  [database-file ]

实例 :
dbexpand –o uncompress.msg  mydata.cdb mydata_big.db 

-o — 把消息输出到名为 uncompress.msg 的文件中 
展开后的数据库文件名为 mydata_big.db

利用 Sybase Central展开数据库:

1. 打开 Utilities 文件夹 
2. 在右半边,双击 Uncompress Database 
3. 点击 Next 
4. 必要的话,改变你的数据库连接。 
5. 点击 Next 
6. 输入要展开的数据库名及存储已展开数据库文件的位置 
7. 点击 Finish  

记录对只读数据库所做的修改 :

1、把对压缩的或只读的数据库的修改写入到一个可写入文件中 
这种修改被记录在该可写入文件的事务日志中 
日后可把该事务日志文件内容传输出来实施对数据库的修改 
当用户查询只读数据库文件时,能把存放在可写入文件中的修改一起得到。 
2、利用实用程序dbwrite能建立一个可写入文件。


dbwrite:

语法: dbwrite [switches] database-file  [write-name ] 

实例: dbwrite –c mydata.cdb mydata.wrt
-c — 为 mydata.cbd 建立一个可写入文件 
可写入文件的名字是 mydata.wrt

Dbwrite(利用Sybase Central):

1. 打开 Utilities 文件夹 
2. 在右半边双击 Create Write File 
3. 点击 Next 
4. 打算为其建立可写入文件的数据库进行连接 
5. 打入要为其建立一个可写入文件的数据库名字以及存放可写入文件的位置。
6. 点击 Next 
7. 必要的话,可选择一个日志文件。 
8. 点击 Next 
9. 必要的话,可打入一个镜象可写入文件。 
10. 点击 Finish 则建立可写入文件 


把修改施加于已压缩数据库 :

要想把存储在该可写入文件的修改施加到已压缩数据库时,可采用以下办法:
1、先转换写入文件成为SQL语句 
利用dbtran 
利用Sybase Central的 转换日志实用程序
2、再利用 dbexpand展开该数据库文件 
3、最后把可写入文件中转换出来的 SQL语句施加于展开后的数据库上。 


小结 :

1、Adaptive Server Anywhere 提供了防止因系统故障或介质故障而引起数据丢失的机制。 
2、为此,Adaptive Server Anywhere 支持事务日志,校验点日志和回滚日志。 
3、如果一个事务无法被成功地完成,则可利用回滚日志来复原数据。 

4、要想恢复系统故障,先运行一个磁盘校验实用程序然后重新启动数据库引擎。 

5、为防止数据丢失,要有规律地备份数据库,把事务日志存储在份开的设备上,以及使用事务日志镜象。 

6、对数据库实施完全备份这是最简单的策略,但它仅适用于小型数据库。对大的数据库适于采用增量备份策略。 

7、利用实用程序 dbbackup, 可对数据库文件,事务日志和可写入文件实现完全的或增量的以及联机的备份。 

8、可以利用数据库压缩实用程序对主数据库文件进行压缩,压缩了的数据库文件是只读文件。可以利用可写入文件 (WRT) 实施对已压缩数据库的修改。


 jazy 回复于:2003-02-24 21:28:00

设置客户方 


目标 
§如何使用连接参数和连接字符串 
§识别指定连接参数的方式 
§识别用在连接参数中的关键字 
§说明环境变量SQL CONNECT的功能 
§解释嵌入式SQL应用如何建立连接 
§解释ODBC应用如何建立连接 
§识别ODBC的四个基本组成部分 
§说明ODBC管理器可完成什么任务 
§解释OLE DB应用如何建立连接 
§识别Open Client/Open Server应用的要求 
§监视连接 



内容 
§连接数据库 
§建立数据库连接 
§建立连接:处理过程 
§利用ODBC连接数据库 
§配置ODBC访问 
§ODBC故障排除 
§利用OLE DB连接数据库 
§利用Open Client连接数据库 
§监视Adaptive Server Anywhere连接 

连接数据库 :

§客户应用必须建立对数据库的连接 
§建立连接则为应用构成访问数据库的通道 
§有五类连接: 
嵌入式SQL 
ODBC 
OLE DB 
Open Client 
JDBC

建立数据库连接 
§连接参数 
§连接字符串 


指定连接参数 
§ODBC 数据源配置 
§应用提示 
§带有预定义参数值的文件 
§固定代码参数 
§SQLCONNECT 环境变量 


优先次序 
§当一个参数在多处被说明时,其优先次序为: 
明显给出的连接字符串 
SQLCONNECT 
ODBC 数据源 

连接字符串 
§列出参数的设置 关键字=某个值 
例如 "UID=dba;PWD=sql;DBF=mydata.db"


连接字符串关键字  
§UID — 用户 ID 
§PWD — 口令 
§CON — 可选的连接名称;不可用于 ODBC 
§ENG — 数据库引擎名 
§DBN — 数据库名 
§DBF — 数据库文件名 
§DSN — 数据源名称;用于ODBC 
§FileDSN — 数据源的文件名. 
§DBS — 数据库开关 
§LOG — 出错日志文件 

连接字符串关键字 
§AStop — 指明一个数据库在其最后一个连接关闭后是否自动停止 
§Links — 指明应启动哪种通讯协议 
§START — 启动数据库引擎 

设置 SQLCONNECT
§提供连接参数的环境变量 
§该设置值将覆盖ODBC数据源 
§实例 
SQLCONNECT=DSN#mydata,DBF#c:/sybase/ase/mydata.db


建立连接:
处理过程 
§1. 应用调用接口库 
§2. 应用把连接字符串传送给接口库 
§3. 接口库装配这些连接参数 
§4. 接口库寻找命名服务器 
个人机 
网络 
启动服务器 
§5. 接口库寻找命名数据库 
检验运行着的数据库 
启动新数据库 


利用嵌入式SQL连接数据库 
§使用CONNECT命令 
§语法 
CONNECT USING connection-string 
§实例 
CONNECT USING "UID=dba;PWD=SQL;
ENG=mydata;DBN=mydata;
DBF=c:\sybase\Adaptive Server Anywhere\mydata.db"


利用ODBC连接数据库 
§提供客户连接数据库的标准接口 
§为许多DBMS(关系型或非关系型)提供开放的、可移植的标准API。


ODBC说明 
§标准函数调用库 
§标准数据访问语言 
§标准出错代码集 
§对DBMS进行连接和登录的标准方法 
§标准数据类型表示 


ODBC 组件 
§应用 
请求连接 改换ODBC环境 把SQL传递给数据源 定义结果集的存储类型 请求结果集 结束连接 
§驱动管理 
管理应用与驱动器之间的交互 确保函数调用的正确顺序 管理驱动器装载及卸载 把SQL传递给驱动器 
§驱动器 
与数据源交互 处理ODBC函数调用 把SQL嵌入到数据源中 
§数据源 
由其获得数据的数据(库)组件


ODBC 一致性 :
§支持 ODBC 3.51 
§全部核心特征 
§全部Level 1特征,但除去: 异步执行 单个连接中的并行的多线索处理 
§全部Level 2特征,但除去: hree-part 表和视图命名 异步执行各个语句 登录请求和SQL查询的超时 


配置ODBC访问 :
应用调用库函数 Windows 95/98/ME and 2000/NT – wodbc32.lib Unix – dbodbc.lib 

Windows 应用连接到 Microsoft ODBC manager 

其它平台可以直接连到驱动器 


ODBC管理器 :
用于增加、删去或修改数据源 
自动与Adaptive Server Anywhere一起被安装 



非Windows平台不支持管理器 

处理过程 
1. 连接所支持的输入库 
2. 利用SQLDriverConnect 函数 
3. 说明 szConnStrIn driver= parameter 
§实例 szConnStrIn= "driver=/sybase/Adaptive Server Anywhere/dbodbc7.sc;dbf=/sybase/Adaptive Server Anywhere/mydata.db"



在ODBC管理器中追踪 :
追踪ODBC管理器所连接的调用 
1. 启动ODBC管理器 
2. 选择Tracing 
3. 为该追踪指定输出文件 
追踪文件有可能太大 
仅在排错或测试期间采用 

ODBC Test:

微软的 ODBC Test 可用于测试ODBC的驱动器
四大类功能: 
Functions 是用来调用ODBC功能的菜单项 
Function tools 是调用一组相关的ODBC功能的菜单项 
Tools 是用于配置 ODBC Test的菜单项 
Auto tests 是包含测试案例的DLL 


利用OLE DB连接数据库:
利用COM为数据库和应用提供接口 
§为每种数据源OLE DB分别提供: 
为Sybase Adaptive Server Anywhere OLE DB提供 
§Adaptive Server AnywhereProv 支持 OLE DB 2.5或以上版 
为Microsoft OLE DB 提供 
§使ODBC数据源能当作OLE DB数据源来看待  
§ADO (ActiveX Data Objects)编程 
ADO 允许象Visual Basic这样的脚本语言来使用标准的数据访问对象模式

利用Open Client连接数据库:
§实现与Sybase产品的兼容性 
§数据库应配置成与ASE兼容 
§要求 
TCP/IP 
登记sql.ini或interface 
Open Client 软件置于客户机 


监视Adaptive Server Anywhere连接:
在Sybase Central的 All Connected Users 文件夹中的每个服务器和客户 

小   结 :


1、定连接参数的手段可通过ODBC数据源配置,用户提示,包含预定义参数值的文件,一组固定的内置参数,或是SQL CONNECT变量。 
2、建立数据库连接,客户应用必须首先找到数据库引擎或服务器。 


3、嵌入式SQL应用利用连接字符串来连接数据库 
4、Microsoft ODBC 说明是个调用级接口,它不需要SQL处理器或预编译器. 5、ODBC 的四个组件是:应用,驱动管理,驱动器和数据源. 
6、当需要与Sybase产品兼容时,则应采用Open Client连接方式 
(这点需要特别注意)


 jazy 回复于:2003-02-24 21:58:55

性能调优 


目   标 
§识别和讨论影响数据库性能的硬件和软件因素 
§说明键及索引对数据库性能的影响 
§树木如何权衡使用索引及派生数据 
§说明存储过程 及触发器对数据库性能的影响 
§说明查询优化器是如何工作的 
§说明Adaptive Server Anywhere自我调协的特点 
§识别在查询计划中出现的各种信息 

内   容 
§优化数据库性能 
§权衡存储过程及触发器的使用 
§从数据库设计着手改善性能 
§查询设计 
§查询优化器 
§监视性能 



优化数据库性能 
§硬件和软件因素 
§自底层向上来考虑 
§监视和调协 


硬件和软件因素 
§网络资源 
§硬件平台 
§磁盘分片 
§内存 
§页尺寸 
§不使用事务日志 

页  分  配 
§当数据行比数据库页面尺寸小时,它一定被存储在单个页面中。 
若现有的页面不具有充分大的空间,则被分配一个新页面。 
数据行的存储次序可能与其插入次序不同。 
§当数据行比数据库页面尺寸大时,则把它劈开存储在连续的页面中。


数据行尺寸 
§新行被分配在固定位置及初始化空间 
不含数据的空值列未能分配到空间。 
当利用 UPDATE 对空列赋值时,可能回导致数据行被劈开而跨页存放。 
§此时因增加 I/O 而降低性能 
§初次 INSERT 时,在每个都插入数据。 
可以使用缺省值 
通常不要包含空值列  
(这点对于ASE同样很重要 -- JAZY)

空间的重用 
§Adaptive Server Anywhere回收删除了数据的空间 
新数据可被插入到任何空闲页面中 
会引起碎片 
 §对数据库进行卸载和重新装入 
使现有数据紧凑化 
数据行能被连续存储 


网络调谐 
§网络包尺寸 
要与基础网络包匹配 利用通讯参数 CommBufferSize 来设置 
§缺省为1024 
§最小为 300 
§最大为 16000 
§设置的比基础网络包的尺寸稍微小一点效果最佳 



存储过程 
§在以下方面改善性能 
减少网络交通量 处理能力提高 
§在以下方面没有改善性能 
零散的操作 不适当的网络/服务器  
§混合型的应用体系结构 

触发器 
§减少网络交通量 
§要求更多的处理能力 


从数据库设计着手改善性能 :

物理设计要考虑: 
是联机事务(OLTP)应用? 
是决策支持(DSS)应用? 
至关重要的事务和查询是什么? 
业务对性能的要求?
对彼此有冲突的要求如何权衡?



索 引 结 构 
§由一系列数值型哈什(Hash)值组合 
§对哈什值进行比较以确定数据行所处的位置 
§缺省的哈什大小为 10 个字节 
增大哈什值尺寸可减少对基础数据行的访问次数


组合索引的次序 :

§应针对不同应用来安排组合索引中各列的次序 
§例如: 利用以下索引查找last_name: 
 CREATE INDEX lname_fname  ON employee emp_lname, emp_fname 
利用以下索引查找 firs_name: 
 CREATE INDEX fname_lname  ON employee emp_fname, emp_lname 
§每个表都可以建多个索引 
§把重复值少的列放在组合索引的最前面对优化估算最有利 



编写能够利用索引的查询语句 
§必须包含搜索变量 (sargs) 
§搜索变量是无须查找基础数据只利用索引就可确定的条件 
§以下语句组合索引的含搜索变量: 
SELECT * FROM employee WHERE emp_id = 102 
SELECT * FROM employee WHERE emp_fname LIKE 'Jo%' 
§以下语句不含搜索变量: 
SELECT * FROM employee WHERE emp_id !=102 
SELECT * FROM employee WHERE emp_fname LIKE '%n' 
§在 WHERE 子句中应包含组合索引的领头列 


比较是否含搜索变量 :

以下包含: 
§emp_id = 102 
§emp_id IS NULL 
§emp_id >; 200 
§employee.emp_id =department.dept_head_id 
§emp_id IN (102, 103, 104) 
§emp_fname LIKE 'rob%'

以下不包含: 
§emp_id !=102 
§emp_id IS NOT NULL 
§emp_id = 102 or emp_fname = 'Jane' 
§employee.emp_id = employee.manager_id 
§emp_id NOT IN (102, 103, 104) 
§emp_fname LIKE '%bert'

设法把不含搜索变量转换为含搜索变量 
§有些情况可通过重写 WHERE 子句来实现转换 
§例如: 
emp_id NOT IN (102, 103, 104) 
emp_id < 102 and >; 104

(这些对于优化很有帮助--JAZY)

如何权衡 
§DSS 与 OLTP  
§不同要求造成的资源冲突 


查询设计 
§笛卡儿积 
在连接查询中若不包含 WHERE 子句则会发生笛卡儿积 
如果对个n 表进行连接,你必须至少给出 n-1 个连接条件 
 §限制 搜索变量允许优化器去利用索引 

查询优化器:
为执行一个查询识别最好的策略 
基于开销最低的原则 I/O 和 CPU 


依次估算: 
I/O 
表排序 
索引 
每个表仅能用到一个索引 

语法独立性 
§优化器采用查询语义 
§它可能会改写你的查询语句 
§在你的查询语句中修改谓语和表的安排次序,对查询优化器并不起作用。 



控制资源的使用 
§有可能找不到最有效的存取计划 
§要对继续寻找更多的查询计划及执行当前计划二者所需开销进行 
§比较 
§对大的复杂的查询提供更多的资源 


自我调谐 
§相等约束 
列值分布统计 
§把数据库统计删掉以强迫它重新编译(更新统计值) 
当数据库使用方式改变时 
当数据大量变动时 
DROP OPTIMIZER STATISTICS 


优化处理过程 
§1.对查询作语法分析转换 
§2. Adaptive Server Anywhere 打开优化处理游标 
§3. 把子查询展平为连接,去掉不必要的DISTINCT, 重写搜索变量。 
§4. 评估连接次序和 GROUP BY 策略 
§5. 利用统计和缺省去考察访问次序 
§6. 在执行之后,更新数据库统计。


展平子查询 
§嵌套子查询往往不如连接更为有效 
§实例: 
嵌套子查询不够有效: 
 SELECT * FROM sales_order o WHERE o.cust_id IN  (SELECT id FROM customer c WHERE c.state='NY’) 
如下连接较有效: 
 SELECT sales_order.* FROM sales_order KEY JOIN customer WHERE customer.state='NY'



优化器评估 
§估算将有多少行能满足此查询 
§估算的依据是: 
列统计 
部分索引扫描 
用户提供的值
缺省值 


列统计 
§查询每执行一次都被送入高速缓存 
列值分布 LIKE 谓词的可选择性 相等谓词 
§可保持15,000 个登记项 采用先进先出的调度策略 


管理统计值 
§对一个表的查询执行越频繁则其统计值就越精确 
§以下情况可能要把统计值删掉 
§ ( DROP OPTIMIZER STATISTICS): 
对数据库做了大规模的修改 
增加大量数据从根本上影响了数据的分布 
 §恢复统计的办法是: 
执行一次数据库中的典型查询 
利用脚本 


部分索引扫描 
§当没有统计可利用时被使用 
§只扫描最开头二个索引层 
§仅当搜索变量是处于该索引的最开头列时才有效 


人工估算 
§可人工提供估算值 
§优化器会优先考虑采用它 
§实例: 
 SELECT ship_date FROM sales_order_items WHERE (ship_date >; '1998/10/30', 1)
满足条件的行数为1% 
§轻易不要在存储过程及触发器中采用! 
因为信息无法更新 


缺省的可选择性 
比较                              百分比为: 
     cola=colb                             0.035
       col=constant
       col IS NULL
       cola LIKE colb 
       col !=constant 
       Other LIKE or                              25
       EXISTS                                        50        
       Other equalities                          5
       Other inequalities                     25 
       Other IS NULL or BETWEEN       6


由 Sybase Central启动性能监视器 :


1. 打开要监视的数据库的 Statistics 文件夹 
2. 右击你想把它加入到 Performance Monitor 去的 Statistic 
3. 点击 Add to Performance Monitor 
4. 点击 Statistics Items 
5. 注意:统计显示采用不同颜色的线条


利用 Windows NT 性能监视器 
§1.打开 Administrative Tools 程序组 
§2. 点击 Performance Monitor 
§3. 选择 Edit &amp;Ugrave; Add  
§4. 从Objec 列表中选中 
Adaptive Server Anywhere  
§5. 从Counte 选择 统计 
§6. 点击 Add 
§7. 点击 Done 
§注意:数据库必须在运行 
       

小结 
§影响数据库性能的因素包含硬件配置,磁盘和文件管理,以及数据库和查询语句的设计。
§使数据库性能下降的因素有不恰当的网络和服务器资源,硬盘过分的分片化,页面尺寸太小以及未使用事务日志。 
§既使硬件和软件配置都很恰当,但如果数据库设计的不好也会影响性能。 
§存储过程因减少网络交通量和把应用处理放在服务器一方而能改善性能。 
§触发器可以减少网络交通量及处理,但是它要求功能较强的服务器。 

(这节的很多概念和思想对于别的数据库产品也有很好的借鉴意义!-JAZY)


 jazy 回复于:2003-02-24 22:26:34

在数据库中使用Java

目标 
§说明在数据库中如何使用Java 
§说明Java怎样被储存在数据库中 
§配置数据库可使用Java 
§在数据库安装Java 类 
§操纵 (select, insert, update, delete) 表中的Java 数据类型 
§在SQL语句中使用Java 函数 
§调用Java存储过程 
§说明JDBC在 数据库访问中的作用

内容 
§如何在数据库中使用Java? 
§在数据库中储存Java 
§把数据库设置为能使用Java 
§SQL对Java的支持 
§Java术语概述 
§使用Java方法 
§在存储过程中使用JDBC 
§使用Java数据类型 
§更新和删去表数据行 
§使用Computed列 


如何在数据库中使用Java?
§你可以三种不同的方式使用Java类: 
作为函数 
作为存储过程 
作为复杂的数据类型


Java 环境 
§Sybase Java 虚机(VM) 
提供Java类的运行时环境 
Sybase Java VM 是 JDK 1.1.8的一个子集 
不是 Java的开发环境 
应使用 PowerJ 或 Sun JDK 进行开发 
§内置基本 Java 类 

设置数据库能使用Java
§让数据库可使用Java 
§安装用户类 
§为Java配置内存 


能使用 Java的数据库
§利用以下方式建立的数据库在缺省情况下都能 使用 Java 
§ CREATE DATABASE 语句 
   dbinit 命令行实用程序 
   Sybase Central 


让数据库能使用 Java


安装 Java 类
§你可把用户类安装为 
单个类,或者JARs 
§安装 Java 类,可使用 
Sybase Central,或者 交互式 SQL

安装 Java 类
§使用交互式SQL安装类或JAR 安装 
JAVA NEW FROM FILE 'path\\类Name.类'; 
§ 安装 
JAVA NEW JAR 'jarname' FROMFILE 'path\\JarName.jar'; 



建立Java 类
§Adaptive Server Anywhere 
不能完成Java 类的建立 
在数据库安装了Java类之后可对其进行排错 
§ 类的建立 应当使用标准的Java工具,比如 PowerJ 或 Sun Java SDK来编写和编译 


为Java配置内存 
§ Java VM 需要附加的 cache 
使用 -c 命令行选项指定额外的cache 
§Java VM 至少需要附加8M cache. 
§ dbeng7 -c 8M labTest.db 
§可考虑设置一个包含该命令行的 profile或快捷键 

Java 术语概述 
§是面向对象的 Java是由对象组成的 
§方法 包含在一个对象中的过程 
§类和实例 Java 对象是利用称之为类的原型对象来建立的 
利用一个类来实例化对象 
新对象是该类的一个实例
§类和实例方法 
为调用一个实例方法你建立该类的一个新实例然后依据它调用该方法 
你也可以直接调用类方法 
§Constructor(构造函数) 当一个对象被实例化时所调用的方法叫做 Constructor 
一个对象可能有多个constr


作为函数来使用 Java 方法:

SQL 函数 SELECT sqrt(12) 
等价的 Java 函数 SELECT java.lang.Math.sqrt(12) 


从Java调用实例方法
1、Java (使用 StringTokenizer) 

public class  Word { 
 public static int count(String arg) { 
 return new 
 java.util.StringTokenizer(arg).countTokens(); 
}
}

SELECT 语句 
2、SELECT description, Word.count(description) from product

在存储过程中使用 JDBC
§JDBC提供用于访问关系数据的API 
§客户-端 JDBC 允许客户通过特定的数据库驱动器 (比如, jConnect)去访问数据 
§服务器-端 JDBC 允许数据库中的Java 类去访问关系数据 


在存储过程中使用 JDBC
§Java 存储过程的调用方法与 SQL 存储过程一样 
§Java 存储过程要访问关系数据因而要求JDBC 
§存储过程处于服务器-端 因而要使用 服务器-端JDBC 
§不要求jConnect 

在存储过程中使用 Java:
调用 JDBCTest.test( ) 


使用 Java 数据类型 
§任何已安装的Java 类都可作为数据类型使用 
§数据类型名称必须是完全限定的 
§Java数据类型对大小写是敏感的 



在数据库中使用 Java
§ CREATE 表 jdba.customer 

id integer NOT NULL,
company_name CHAR(35) NOT NULL,
JName Adaptive Server Anywheredemo.Name NOT NULL,        JContactInfo Adaptive Server Anywheredemo.ContactInfo NOT NULL,        PRIMARY KEY (id)) 



限定Java 列
§表查询 (假定列Jprod 使用 Java 数据类型) 
§select Jprod from product
选择整个 列 基于该类的String() 法返回结果集 

限定Java Fields(字段) 
§ 使用方法来选取列Jprod 中的一个字段 
SELECT Jprod.getDescription( ) FROM product
§利用指定字段名来选取列Jprod 中的一个字段 
SELECT Jprod.description FROM product 


插入 Java 列
§利用缺省constructor 插入Java 对象
§ INSERT INTO product (ID, Jprod) VALUES (702, NEW Adaptive Server Anywheredemo.Product( ))

插入Java 列
§利用把所有的参数都传送给constructor来插入Java 对象 
§ insert into product_item(id,JProd) &amp;#8226;values (704, NEW Adaptive Server Anywheredemo.Product('Yellow','tee-shirt with picture of GG bridge', 'SF tee shirt',50,'Big',19.99)) 



更新Java 对象
§更新整个对象 使用constructor 使用SQL变量 
§更新对象的某些字段 
在UPDATE中 使用EVALUATE 函数 
§EVALUATE 函数要求设定字段值的方法


删除Java 对象
§与删除一般数据行是一样的 
§WHERE子句中可以包含Java 对象或Java字段和方法


访问Java 列
§如果打算使用 java 列作为: primary keys, indexes, unique 列, min() or max() SQL 函数, ORDER BY, GROUP BY, OR DISTINCT 
§那么该java 类 必须实现一个compareTo()方法 在定义实现时要遵从: 
必须调用compareTo() 
不能被修改 

SELECT name, Jprod.unit_price 
FROM Product 
ORDER BY Jprod.unit_price 

SELECT name, Jprod.unit_price 
FROM Product ORDER BY JProd 

(The Product class has a compareTo() method that compares objects based on the unit_price field)


使用Computed(利用其他列计算出来的)列
§具有Java 类的 computed 列主要用于: 
分解Java 列 把Java 列增加到表中 
§在每次读取Computed 列时它不会被更新 
仅当数据行被修改时它才会更新 


使用 Computed 列
§建立包含computed 列的表 
CREATE  TABLE Product ( 
id INTEGER NOT NULL, 
JProd Adaptive Server Anywheredemo.Product NOT NULL,
name CHAR(15) COMPUTE (Jprod.name), 
PRIMARY KEY ("id"))

§表中增加computed 列 
ALTER TABLE Product ADD inventory_Value INTEGER COMPUTE (Jprod.quantity * Jprod.unit_price)

小结 
§Adaptive Server Anywhere 允许在数据库中把Java用做: 
函数 
存储过程 
复杂的数据类型和 computed 列 
§数据库必须设置为Java-enabled. 
§Java虚机需要8MB内存. 
§Java语法可被嵌入在SQL中. 
§ 编写存储过程要求服务器-端 JDBC


经过两个晚上的时间,终于将这部分的资料浏览了并编辑了一遍,在和ase的比较过程中,可以发现这两种数据库产品差别还是很大的,无论是在使用对象及本身的语法结构上都有很大的差别!

希望诸位有实际使用asa产品经验的朋友能踊跃发表自己的见解!


 kkccgg 回复于:2004-02-12 11:45:42

我怎么修改不了 adaptive server anywhere 数据库 的DBA 密码,请教高手帮帮忙?!非常谢~


 aility 回复于:2006-10-20 13:54:49

太感謝了,呵呵,最近需要用這個,謝謝


 lee1816 回复于:2006-11-23 17:06:11

可惜连接地址已经打不开了




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=21696
转载请注明作者名及原文出处



收藏本页到: