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

SQL Anywhere 12.0.1 » SQL Anywhere 服务器 - SQL 的用法 » 远程数据和批量操作 » 远程数据访问 » 目录访问服务器

 

创建目录访问服务器 (SQL)

管理员可以使用 Interactive SQL 中的 CREATE SERVER 语句创建目录访问服务器。

前提条件

DBA 特权。

RESOURCE 特权。

上下文和注释

多个。

 ♦ 创建和配置目录访问服务器
  1. 为目录创建远程服务器(需要 DBA 权限)。

  2. 为可以使用目录访问服务器的数据库用户创建外部登录(需要 DBA 权限)。

  3. 创建用于访问计算机上的目录的代理表(需要 RESOURCE 权限)。

  1. 以具有 DBA 权限的用户身份连接到主机数据库。

  2. 使用 CREATE SERVER 语句创建远程服务器。

    例如:

    CREATE SERVER my_dir_tree
    CLASS 'directory'
    USING 'root=c:\Program Files';
  3. 使用 CREATE EXTERNLOGIN 语句创建外部登录。

    例如:

    CREATE EXTERNLOGIN DBA TO my_dir_tree;
  4. 使用 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;   


 另请参见