管理员可以使用 Interactive SQL 中的 CREATE SERVER 语句创建目录访问服务器。
前提条件
DBA 特权。
RESOURCE 特权。
上下文和注释
多个。
为目录创建远程服务器(需要 DBA 权限)。
为可以使用目录访问服务器的数据库用户创建外部登录(需要 DBA 权限)。
创建用于访问计算机上的目录的代理表(需要 RESOURCE 权限)。
以具有 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 是目录访问服务器名称。
示例
执行下列语句可创建以下内容:
名为 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 用户并有一个数据库,而该数据库有时在计算机 A 上启动(具有名为 server1 的数据库服务器),有时在计算机 B 上启动(具有名为 server2 的服务器)。假设您想安装一个目录访问服务器,而该服务器同时指向计算机 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讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |