关系数据库中的所有数据都保存在表格中。每列都分配有一个数据类型,并且表格的每一行都为每列保存一个值。以下是关系数据库中任何表格都适用的规则
行和列的顺序没有意义。
每行在每列中都恰好包含一个值。
一列中的所有值都属于同一类型。
以下是在设计数据库时需要记住的一些事项
为每个表格指定一个主键
确保每个表格都保存关于一个特定实体的信息
外键构成表格(以及实体)之间的关系
当您在 Adaptive Server Anywhere 中首次创建数据库时,它包含的唯一表格是系统表格。要创建表格来保存您的数据,请使用 SQL 中的 CREATE TABLE 语句或 Sybase Central 表格编辑器。您必须拥有 DBA 或 RESOURCE 权限才能创建表格,并且您必须拥有 DBA 权限才能使另一个用户成为其所有者。
CREATE TABLE 语句具有极其广泛的选项,这些选项在《Adaptive Server Anywhere 参考手册》中进行了文档化,因此此处仅描述一小部分选项。基本语法如下
CREATE TABLE owner.table-name (column-name datatype [, column-name datatype]...) |
tablename 之前的“owner.”部分是可选的,由具有 DBA 权限的用户使用,以使另一个用户成为新表格的所有者。table-name 和 column-name 分别是表格及其列的名称。在 datatype 之后插入单词 PRIMARY KEY 以使其成为主键。
有关可用类型及其特性的列表,请参阅《Adaptive Server Anywhere 参考手册》的“SQL 数据类型”章节。
例如,要创建一个名为 customer 的表格,其中包含列 id、name、address、city_state_zip 和 phone,并将 id 作为主键,请使用以下 CREATE TABLE 语句
create table customer (id integer not null primary key, name char ( 35 ), address char ( 35 ), city_state_zip char ( 35 ), phone char ( 12 ) ) |
同样重要的是在 id 的情况下添加“not null”,因为它是一个主键。
要在 Sybase Central 中创建表格,请连接到您的数据库并打开其“表格”文件夹。如果您双击“添加表格”,则将打开 Sybase Central 表格编辑器,并且使用按钮栏,您可以根据需要设置表格。将鼠标指针悬停在每个按钮上方以了解其功能。在关闭表格编辑器之前,请不要忘记创建主键!
您可能会感兴趣的,在《Adaptive Server Anywhere 参考手册》中记录但此处未提及的一些表格创建选项包括自动递增(通常用于主键)、约束和外键。
表格创建后,您可以对其进行多种更改。您可以执行的一些操作包括以下内容
重命名表格
添加、删除或重命名列
更改列的数据类型、默认值或长度
与创建表格一样,您可以通过 SQL 或 Sybase Central 更改它们。要在 SQL 中更改表格,请使用 ALTER TABLE 语句。ALTER TABLE 有多种选项,这些选项在《Adaptive Server Anywhere 参考手册》中详细描述。您将在此处看到一些基本示例,以帮助您入门。
将 customer 表格重命名为 cust
alter table customer rename cust |
向 cust 添加一个 company_name 列,最大长度为 35 个字符
alter table cust add (company_name char (35) ) |
为 company_name 提供默认值 "n/a"
alter table cust alter company_name set default 'n/a' |
注意:在将 Adaptive Server Anywhere 数据库投入实际使用之前,作为数据库管理员 (DBA) 的首要任务应该是将 DBA 密码从默认密码“SQL”更改为其他密码。有关如何执行此操作的详细信息,请参阅第 6.2.5 节。
本节介绍为每个数据库创建的用户 ID,简要描述如何创建新的用户 ID,并介绍如何使用用户 ID 控制外部人员访问数据的一些方法。有关用户 ID、组和权限的更多信息,请参阅《Adaptive Server Anywhere 用户指南》的“管理用户 ID 和权限”章节。
当 Adaptive Server Anywhere 数据库初始化时,会创建两个组和两个用户 ID。创建的两个组是 SYS 和 PUBLIC。创建的两个用户 ID 是 DBA 和 dbo。
SYS 既是用户又是组,但任何人都无法使用用户 ID SYS 连接到数据库。SYS 拥有系统表格和系统视图,并且只有 SYS 可以更新系统表格。
PUBLIC 是 SYS 组的成员,并且仅对大多数系统表格和系统视图具有 SELECT 权限。由于默认情况下,新用户 ID 是 PUBLIC 的成员,如果您希望新用户默认情况下没有任何权限,则应撤销 PUBLIC 在 SYS 中的成员资格。
DBA 用户可以直接修改 Adaptive Server Anywhere 数据库的任何部分,但系统表格除外。这就是为什么更改默认 DBA 密码“SQL”非常重要的原因。在向用户授予 DBA 权限时,您应该谨慎(请参阅下面的“DBA 权限”部分)。如果用户需要 DBA 权限,则应授予他/她 DBA 权限,而不是 DBA 的密码。
添加新用户 ID 的 SQL 语句是 GRANT CONNECT。
语法
GRANT CONNECT TO userid1 IDENTIFIED BY password1 |
要添加一个名为 Mortimer 的用户 ID,请执行以下 SQL 语句
grant connect to mortimer identified by monkey |
本节介绍可以授予给用户的表格权限。权限是基于用户逐个授予的。
可以授予给用户的表格权限有几种不同的类型,并且它们是分别授予的。
SELECT 允许用户读取数据,并且可以限制为特定的列。
INSERT 允许用户添加数据。
UPDATE 允许用户更改数据,并且可以限制为特定的列。
DELETE 允许用户删除数据。
ALTER 允许用户修改表格的结构。
REFERENCES 允许用户添加索引、主键和外键。
ALL 包括以上所有权限。
除了 ALTER 和 REFERENCES 专门应用于表格外,表格权限既适用于表格也适用于视图。授予权限的 SQL 语法如下
GRANT [ SELECT (column-name, ...) | INSERT | UPDATE (column-name, ...) | DELETE | ALTER | REFERENCES | ALL ] ON table-name TO userid |
用户 userid 被授予对由 table-name 标识的表格的指定权限。如果授予的权限包括 SELECT 和/或 UPDATE,则它们仅在 column-name 中指定的列上授予。
假设可用香蕉类型的列表存储在名为 banana_supply 的表格的 type 和 quantity 列中。要允许 Mortimer 查看可用香蕉类型的列表及其数量,请使用以下 SQL 语句
grant select on banana_supply (type, quantity) to mortimer
当您向用户授予权限时,您可以选择授予他将相同权限授予其他人的能力。要授予用户执行此操作的权限,请在您授予他们权限时,在用户的 GRANT 语句末尾添加 WITH GRANT OPTION。
要允许 Mortimer 查看可用香蕉类型的列表以及每种类型的数量,并允许他将相同的 SELECT 权限授予其他人,请使用此 SQL 语句
grant select on banana_supply (type, quantity) to mortimer with grant option |
授权是不同级别的权限。授权有两种类型。
具有 RESOURCE 授权的用户可以创建和删除数据库对象,例如表格、视图、存储过程和函数。RESOURCE 授权还允许用户创建和删除用户 ID 和密码。要授予 userid RESOURCE 授权,请执行以下 SQL 语句
GRANT RESOURCE TO userid
具有 DBA 授权的用户可以执行任何数据库操作,并自动拥有对所有表格的所有权限,但系统表格除外。DBA 可以创建和删除用户 ID 和密码、授予 RESOURCE 和 DBA 授权,以及卸载和重新加载数据库。
GRANT DBA TO userid
删除用户 ID 的 SQL 语句是 REVOKE CONNECT。
语法
REVOKE CONNECT FROM userid [, userid ]
正如方括号中的部分所暗示的那样,可以在单个语句中删除多个用户 ID。例如,要删除 Mortimer 和 Chestington 的用户 ID,请执行以下语句
revoke connect from mortimer, chestington
要撤销授予特定用户的权限或授权,请使用原始的授予语句,将 GRANT 替换为 REVOKE,并将 TO 替换为 FROM。例如,要取消 Mortimer 查看 banana_supply 表格的权限,请使用此 REVOKE 语句
revoke select on banana_supply (type, quantity) from mortimer
要更改与特定用户 ID 关联的密码,请再次使用 GRANT CONNECT 语句
GRANT CONNECT TO userid IDENTIFIED BY newpassword
例如,要将 DBA 的密码从“SQL”更改为“d0n13xw9”,请使用此语句
grant connect to DBA identified by d0n13xw9
您可能希望在构建安全的数据环境时使用的一些 Adaptive Server Anywhere 功能包括以下内容
用户识别和身份验证控制对数据库的访问。
权限和授权,已经在前面的章节中解释过,控制用户在连接到数据库时可以执行的操作。
视图和存储过程允许您仔细调整用户可以访问的数据以及用户可以执行的操作。
连接加密可以防止未经授权的人员窥探。
其中一些功能已在本操作指南中提及,其中一些功能将在以下章节中详细阐述。虽然将介绍触发器、过程和视图的概念,以便您可以决定是否以及如何使用它们,但不会讨论它们的实现。您可以在下面列出的《Adaptive Server Anywhere 用户指南》的章节中找到关于它们的深入信息以及关于它们实现的详细信息
默认情况下,密码可以是任意长度。为了更高的安全性,您可以对所有新密码强制执行最小长度,以使它们更难猜测。您可以通过将 MIN_PASSWORD_LENGTH 数据库选项设置为更大的值来执行此操作。以下语句强制执行 8 个字符的最小密码长度
set option public.min_password_length = 8
查看本文档的“更改密码”部分,了解如何更改用户密码,并且不要忘记更改 DBA 的密码!
当适合仅向用户授予对表格一部分的访问权限时,视图非常有用。该部分可以根据行或列来定义。例如,您可能希望阻止一组用户查看 banana_supply 表格的数量列,或者您可能希望限制用户仅查看关于特定类型香蕉的信息。
虽然视图基于数据限制访问,但过程和触发器基于用户可以执行的操作限制访问。过程和触发器将 SQL 语句存储在数据库中,供所有应用程序使用。它们在关联表格所有者的表格权限下执行,而与执行过程或触发触发器的用户的权限无关。
过程由 CALL 语句调用,并且可以接受值以及返回值。但是,与过程不同,触发器既不能接受值也不能返回值,并且由与其关联的表格中的插入、更新或删除操作调用。权限与触发器无关。它们在执行定义为触发它们的操作时执行,而与用户无关。
为了严格的安全性,您可以阻止对表格的所有访问,并授予用户执行执行特定任务的某些存储过程的权限。这种方法严格定义了可以修改数据库的方式。
加密客户端/服务器通信可防止第三方读取在客户端和服务器之间发送的消息。可以从服务器端或客户端启用它。要从服务器启用加密,请在服务器启动时使用 -e 选项。例如,使用以下命令启动数据库服务器以接受通过 TCP/IP 到 mydb.db 的加密连接
dbsrv7 -e -x tcpip mydb.db
要从特定客户端启用加密,请在连接字符串中使用 ENC 关键字。例如,要加密通过 TCP/IP 到 mydb.db 的连接,您的连接字符串将如下所示
"uid=mortimer;pwd=monkey;links=tcpip;eng=MyServer;dbf=mydb.db;enc=true"
有关客户端/服务器通信加密的更多信息,请在《Adaptive Server Anywhere 参考手册》的“数据库服务器”下查找 -e 命令行选项,并在“连接参数”下查找“加密连接参数”。