Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 数据库管理 » 配置数据库 » 管理用户 ID、特权和权限

 

数据库对象名和前缀

每个数据库对象的名称都是一个标识符。

有关有效标识符规则的信息,请参见标识符

在本手册的所有查询和示例 SQL 语句中,提及示例数据库中的数据库对象时,通常采用的是它们的简单名称。例如:

SELECT *
FROM Employees;

表、过程和视图都有所有者。DBA 用户 ID 拥有示例数据库中的表。在某些情况下,必须使用所有者用户 ID 作为对象名的前缀,如以下语句所示。

SELECT *
FROM DBA.Employees;

Employees 表引用被称为限定表引用。在其它情况下,给出对象名即已足够。本节介绍了何时需要或不需要使用所有者前缀来标识表、视图和过程。

当引用数据库对象时,除以下情况外需要使用前缀:

  • 您是数据库对象的所有者。

  • 您是拥有数据库对象的组 ID 的成员。

示例

假设以下示例是一个公司的数据库。用户 ID company 创建了所有的表,由于此用户 ID 属于数据库管理员,因此它拥有 DBA 特权。

CREATE USER Company
IDENTIFIED BY secret;
GRANT DBA TO Company;

company 用户 ID 创建了数据库中的表。

CONNECT USER company IDENTIFIED BY secret;
CREATE TABLE company.Customers ( ... );
CREATE TABLE company.Products ( ... );
CREATE TABLE company.Orders ( ... );
CREATE TABLE company.Invoices ( ... );
CREATE TABLE company.Employees ( ... );
CREATE TABLE company.Salaries ( ... );

并非公司的每个人都有权访问所有信息。假设销售部门中的两个用户 ID Joe 和 Sally 应该有权访问 Customers、Products 和 Orders 表。要实现这一点,可创建 Sales 组。

CREATE USER Sally IDENTIFIED BY xxxxx;
CREATE USER Joe IDENTIFIED BY xxxxx;
CREATE USER Sales IDENTIFIED BY xxxxx;
GRANT GROUP TO Sales;
GRANT ALL ON Customers TO Sales;
GRANT ALL ON Orders TO Sales;
GRANT SELECT ON Products TO Sales;
GRANT MEMBERSHIP IN GROUP Sales TO Sally;
GRANT MEMBERSHIP IN GROUP Sales TO Joe;

现在,Joe 和 Sally 有权使用这些表,但他们仍须限定他们的表引用,因为表的所有者是 Company,而 Sally 和 Joe 不是 Company 组的成员:

SELECT *
FROM company.Customers;

为了改变这种情况,应使 Sales 组成为 Company 组的成员。

GRANT GROUP TO Company;
GRANT MEMBERSHIP IN GROUP Company TO Sales;

现在,Sales 组的成员 Joe 和 Sally 间接地成为了 Company 组的成员,可以引用他们的表而不必使用限定符。现在可以使用以下命令:

SELECT *
FROM Customers;
注意

Joe 和 Sally 是 company 组的成员,但他们没有任何额外的权限。company 组没有被明确授予任何表权限。(company 用户 ID 拥有查看诸如 Salaries 之类的表的隐式权限,因为该 ID 创建了该表并具有 DBA 特权。)因此,Joe 和 Sally 在执行以下命令之一时仍会遇到错误:

SELECT *
FROM Salaries;
SELECT *
FROM company.Salaries;

在这两种情况下,Joe 和 Sally 都没有查看 Salaries 表的权限。