データベース・オブジェクトの名前は識別子である必要があります。
有効な識別子の規則については、識別子を参照してください。
このマニュアルに示すクエリと SQL 文のサンプルでは、サンプル・データベース内のデータベース・オブジェクトを一般に簡略名で参照しています。次に例を示します。
SELECT * FROM Employees; |
テーブル、プロシージャ、ビューにはすべて所有者があります。ユーザ ID DBA は、サンプル・データベース内のテーブルを所有します。場合によっては、オブジェクト名に所有者のユーザ ID をプレフィクスとして付ける必要があります。次に例を示します。
SELECT * FROM DBA.Employees; |
この Employees テーブルの参照を「修飾された」状態であるといいます。単にオブジェクト名を示すだけでよい場合もあります。この項では、どのような場合にテーブル、ビュー、プロシージャに所有者名をプレフィクスとして付ける必要があるかを説明します。
データベース・オブジェクトを参照するときプレフィクスが必要ないのは、次の場合です。
自分がデータベース・オブジェクトの所有者である場合。
自分がデータベース・オブジェクトを所有するグループのメンバである場合。
企業のデータベースを例に説明します。ユーザ ID company がすべてのテーブルを作成し、このユーザ ID はデータベース管理者に属するので、DBA 権限を持ちます。
CREATE USER Company IDENTIFIED BY secret; GRANT DBA TO Company; |
ユーザ ID company が、データベース内のテーブルを次のように作成しました。
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 ( ... ); |
会社の全員がすべての情報にアクセスできるようにはしません。営業部の 2 人のユーザ 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; |
これで、Joe と Sally は、Sales グループのメンバであると同時に間接的に Company グループのメンバになり、修飾子なしでデータを参照できます。したがって、次のコマンドを使えるようになります。
SELECT * FROM Customers; |
Joe と Sally は company グループのメンバシップ以外のパーミッションを持ちません。company グループには、明示的に付与されたテーブル・パーミッションはありません(company ユーザ ID はテーブルの作成者であり、DBA 権限を持っているので、Salaries のようなテーブルを参照するパーミッションを暗黙のうちに持っています)。したがって、Joe と Sally が次のいずれかのコマンドを実行するとエラーになります。
SELECT * FROM Salaries; SELECT * FROM company.Salaries; |
どちらの場合も、Joe と Sally は Salaries テーブルを参照するパーミッションを持っていません。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |