设置搜索路径

每个用户会话都有一个架构搜索路径。Vertica 使用此搜索路径来查找未按架构名称限定的表和用户定义函数 (UDF)。会话搜索路径最初是从用户的配置文件中设置的。您可以随时通过调用 SET SEARCH_PATH 来更改会话的搜索路径。此搜索路径一直有效,直到处理下一个 SET SEARCH_PATH 语句或会话结束为止。

查看当前搜索路径

SHOW SEARCH_PATH 返回会话的当前搜索路径。例如:


=> SHOW SEARCH_PATH;
    name     |                      setting
-------------+---------------------------------------------------
 search_path | "$user", public, v_catalog, v_monitor, v_internal

架构按优先级降序排列。第一个架构在搜索顺序中具有最高优先级。如果此架构存在,它也会定义为当前架构,供以非限定名称创建的表使用。您可以通过调用函数 CURRENT_SCHEMA 来识别当前架构:

=> SELECT CURRENT_SCHEMA;
 current_schema
----------------
 public
(1 row)

设置用户搜索路径

会话搜索路径最初是从用户的配置文件中设置的。如果用户配置文件中的搜索路径不是通过 CREATE USERALTER USER 设置,则该搜索路径将设置为数据库默认值:

=> CREATE USER agent007;
CREATE USER
=> \c - agent007
You are now connected as user "agent007".
=> SHOW SEARCH_PATH;
    name     |                      setting
-------------+---------------------------------------------------
 search_path | "$user", public, v_catalog, v_monitor, v_internal

$user 解析为会话用户名(在此示例中为 agent007)且具有最高优先级。如果架构 agent007 存在,Vertica 将开始在该架构中搜索不合格的表。此外, CURRENT_SCHEMA 的调用将返回此架构。否则,Vertica 使用 public 作为当前架构并开始在其中进行搜索。

使用 ALTER USER 可修改现有用户的搜索路径。这些更改会覆盖搜索路径中的所有非系统架构,其中包括 $USER。系统架构保持不变。对用户搜索路径的更改仅在用户启动新会话时生效;当前会话不受影响。

例如,以下语句将修改 agent007 的搜索路径,并授予对新搜索路径上的架构和表的访问权限:

=> ALTER USER agent007 SEARCH_PATH store, public;
ALTER USER
=> GRANT ALL ON SCHEMA store, public TO agent007;
GRANT PRIVILEGE
=> GRANT SELECT ON ALL TABLES IN SCHEMA store, public TO agent007;
GRANT PRIVILEGE
=> \c - agent007
You are now connected as user "agent007".
=> SHOW SEARCH_PATH;
    name     |                     setting
-------------+-------------------------------------------------
 search_path | store, public, v_catalog, v_monitor, v_internal
(1 row)

要验证用户的搜索路径,请查询系统表 USERS

=> SELECT search_path FROM USERS WHERE user_name='agent007';
                   search_path
-------------------------------------------------
 store, public, v_catalog, v_monitor, v_internal
(1 row)

要将用户的搜索路径恢复为数据库默认设置,请调用 ALTER USER 并将搜索路径设置为 DEFAULT。例如:


=> ALTER USER agent007 SEARCH_PATH DEFAULT;
ALTER USER
=> SELECT search_path FROM USERS WHERE user_name='agent007';
                    search_path
---------------------------------------------------
 "$user", public, v_catalog, v_monitor, v_internal
(1 row)

忽略的搜索路径架构

Vertica 仅在当前用户具有访问权限的现有架构中进行搜索。如果搜索路径中的架构不存在或用户缺乏对其的访问权限,Vertica 会默认将其排除搜索。例如,如果 agent007 缺乏架构 public 的 SELECT 权限,Vertica 会默认为跳过此架构。仅当 Vertica 在搜索路径的任何位置都找不到表时,它才会返回错误。

设置会话搜索路径

Vertica 最初会根据用户的配置文件来设置会话的搜索路径。您可以使用 SET SEARCH_PATH 更改当前会话的搜索路径。您可以通过两种方式使用 SET SEARCH_PATH

  • 显式将会话搜索路径设置为一个或多个架构。例如:

    
    => \c - agent007
    You are now connected as user "agent007".
    dbadmin=> SHOW SEARCH_PATH;
        name     |                      setting
    -------------+---------------------------------------------------
     search_path | "$user", public, v_catalog, v_monitor, v_internal
    (1 row)
    
    => SET SEARCH_PATH TO store, public;
    SET
    => SHOW SEARCH_PATH;
        name     |                     setting
    -------------+-------------------------------------------------
     search_path | store, public, v_catalog, v_monitor, v_internal
    (1 row)
    
  • 将会话搜索路径设置为数据库默认值:

    
    => SET SEARCH_PATH TO DEFAULT;
    SET
    => SHOW SEARCH_PATH;
        name     |                      setting
    -------------+---------------------------------------------------
     search_path | "$user", public, v_catalog, v_monitor, v_internal
    (1 row)
    

SET SEARCH_PATH 覆盖搜索路径中的所有非系统架构,其中包括 $USER。系统架构保持不变。