设置搜索路径
每个用户会话都有一个架构搜索路径。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 USER
或
ALTER 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
。系统架构保持不变。