管理者は、Interactive SQL でCREATE SERVER 文を使用して、ディレクトリアクセスサーバを作成できます。
前提条件
DBA 権限。
RESOURCE 権限。
内容と備考
次のとおりです。
ディレクトリのリモートサーバーを作成します (DBA 権限が必要)。
ディレクトリアクセスサーバーを使用するデータベースユーザーの外部ログインを作成します (DBA 権限が必要)。
コンピューター上のディレクトリにアクセスするためのプロキシテーブルを作成します (リソース権限が必要)。
DBA 権限のあるユーザーとしてホストデータベースに接続します。
CREATE SERVER 文を使用して、リモートサーバーを作成します。
次に例を示します。
CREATE SERVER my_dir_tree CLASS 'directory' USING 'root=c:\Program Files'; |
CREATE EXTERNLOGIN 文を使用して、外部ログインを作成します。
次に例を示します。
CREATE EXTERNLOGIN DBA TO my_dir_tree; |
CREATE EXISTING TABLE 文を使用して、ディレクトリのプロキシテーブルを作成します。
次に例を示します。
CREATE EXISTING TABLE my_program_files AT 'my_dir_tree;;;.'; |
この例では、my_program_files がディレクトリの名前、my_dir_tree がディレクトリアクセスサーバーの名前です。
例
以下の文を実行すると、次を作成します。
最大 3 レベルのサブディレクトリにアクセスできる directoryserver3 という名前の新規のディレクトリアクセスサーバ
DBA ユーザーのためにディレクトリアクセスサーバへの外部ログイン
diskdir3 という名前のプロキシテーブル
CREATE SERVER directoryserver3 CLASS 'DIRECTORY' USING 'ROOT=c:\mydir;SUBDIRS=3'; CREATE EXTERNLOGIN DBA TO directoryserver3; CREATE EXISTING TABLE diskdir3 AT 'directoryserver3;;;.'; |
sp_remote_tables システムプロシージャーを使用すると、データベースサーバーを実行しているコンピューター上の c:\mydirにあるすべてのサブフォルダーを表示できます。
CALL sp_remote_tables( 'directoryserver3' ); |
次の SELECT 文を使用すると、c:\mydir\myfile.txt ファイルの内容を表示できます。
SELECT contents FROM diskdir3 WHERE file_name = 'myfile.txt'; |
また、次のように、ディレクトリからデータを選択することもできます。
-- Get the list of directories in this disk directory tree. SELECT permissions, file_name, size FROM diskdir3 WHERE PERMISSIONS LIKE 'd%'; -- Get the list of files. SELECT permissions, file_name, size FROM diskdir3 WHERE PERMISSIONS NOT LIKE 'd%'; |
例
あなたは DBA であり、あるときは server1 という名前のデータベースサーバーが起動されるコンピューター A のデータベース、またはあるときは server2 という名前のデータベースサーバーが起動されるコンピューター B のデータベースを利用しているとします。ここで、コンピューター B のローカルドライブ d:\users を参照するディレクトリアクセスサーバーと、コンピューター A のネットワークサーバードライブ w:\users をセットアップしたいとします。さらに、users/userM にプロキシテーブルをセットアップして、すべてのユーザーそこから自分のディレクトリのリストを取得できるようにしたいとします。次の手順に従って、CREATE SERVER 文の USING 句と CREATE EXISTING TABLE 文の AT 句の変数を使用することによって、単一のディレクトリアクセスサーバーと単一のプロキシテーブルを作成すれば、そのような要求を満たすことができます。
ディレクトリアクセスサーバーの作成 ディレクトリアクセスサーバーのルートとサブディレクトリのレベルを表す変数を使用して、ディレクトリアクセスサーバーを作成します。
CREATE SERVER dir CLASS 'directory' USING 'root={@directory}\\users;subdirs={@subdirs}'; |
ディレクトリアクセスサーバーの使用を許可するそれぞれのユーザーに明示的な外部ログインを作成します。
CREATE EXTERNLOGIN DBA TO dir; CREATE USER user1 IDENTIFIED BY sql; CREATE EXTERNLOGIN user1 TO dir; CREATE USER user2 IDENTIFIED BY sql; CREATE EXTERNLOGIN user2 TO dir; CREATE USER userM IDENTIFIED BY sql; CREATE EXTERNLOGIN userM TO dir; |
プロキシテーブルの作成 いずれかのユーザーアカウントを使用して、ディレクトリアクセスサーバー上の @directory\users\@curuser を参照するプロキシテーブルを作成します。
CREATE VARIABLE @directory LONG VARCHAR; SET @directory = 'd:'; CREATE VARIABLE @subdirs VARCHAR(10); SET @subdirs = '7'; CREATE VARIABLE @curuser VARCHAR(128); SET @curuser = 'user1'; CREATE VARIABLE @server VARCHAR(128); SET @server = 'dir'; CREATE EXISTING TABLE dbo.userdir AT '{@server};;;{@curuser}'; |
変数はもう必要ではないため、次の文を実行して削除します。
DROP VARIABLE @curuser; DROP VARIABLE @subdirs; DROP VARIABLE @directory; |
DBA にマッピングされた外部ログインを削除します。
DROP EXTERNLOGIN DBA TO dir; |
プロシージャーの作成 すべてのユーザーが自分のユーザーディレクトリの内容を表示できるようにするプロシージャーを作成します。
CREATE PROCEDURE dbo.listmydir() BEGIN DECLARE @directory LONG VARCHAR; DECLARE @subdirs VARCHAR(10); DECLARE @server VARCHAR(128); DECLARE @curuser VARCHAR(128); -- For this example, the 'dir' remote data access server is always used. SET @server = 'dir' -- The root directory is based on the SQL Anywhere server the user is connected to. SET @directory = IF property('name') = 'server1' THEN 'w:' ELSE 'd:' ENDIF; -- The subdirectory limit is based on the connected user. SET @curuser = user_name(); -- All users get a subdirectory limit of 7, except user2, who gets a limit of 1. SET @subdirs = CONVERT ( VARCHAR(10), IF @curuser = 'user2' THEN 1 ELSE 7 ENDIF); -- With all the variables set above, the proxy table dbo.userdir now points to @directory\@curuser -- and has a subdirectory limit of @subdirs. SELECT * FROM dbo.userdir; END; |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |