每个数据库对象的名称都是一个标识符。
有关有效标识符规则的信息,请参见标识符。
在本手册的所有查询和示例 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 表的权限。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |