create schema流程

文章详细阐述了在PostgreSQL中执行CREATESCHEMA命令的步骤,包括检查权限、处理模式命名、处理IFNOTEXISTS选项以及涉及的系统函数和事件触发器。此过程涉及到数据库的安全上下文、用户权限和搜索路径的管理。
摘要由CSDN通过智能技术生成

查询命令

当前数据库的所有模式
SELECT * FROM information_schema.schemata;

create schema堆栈

1. CreateSchemaCommand(CreateSchemaStmt * stmt, const char * queryString, int stmt_location, int stmt_len) (\home\lightdb\Sources\postgresql-13.3\src\backend\commands\schemacmds.c:64)
2. ProcessUtilitySlow(ParseState * pstate, PlannedStmt * pstmt, const char * queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment * queryEnv, QueryCompletion * qc, DestReceiver * dest) (\home\lightdb\Sources\postgresql-13.3\src\backend\tcop\utility.c:1386)
3. standard_ProcessUtility(PlannedStmt * pstmt, const char * queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment * queryEnv, DestReceiver * dest, QueryCompletion * qc) (\home\lightdb\Sources\postgresql-13.3\src\backend\tcop\utility.c:1332)
4. lt_stat_statements.so!pgss_ProcessUtility(PlannedStmt * pstmt, const char * queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment * queryEnv, DestReceiver * dest, QueryCompletion * qc) (\home\lightdb\Sources\postgresql-13.3\contrib\pg_stat_statements\pg_stat_statements.c:1163)
5. lt_stat_activity.so!ltsa_ProcessUtility(PlannedStmt * pstmt, const char * queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment * queryEnv, DestReceiver * dest, QueryCompletion * qc) (\home\lightdb\Sources\postgresql-13.3\contrib\lt_stat_activity\lt_stat_activity.c:315)
6. ltaudit.so!pgaudit_ProcessUtility_hook(PlannedStmt * pstmt, const char * queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment * queryEnv, DestReceiver * dest, QueryCompletion * qc) (\home\lightdb\Sources\postgresql-13.3\contrib\pgaudit\pgaudit.c:1412)
7. lt_hint_plan.so!pg_hint_plan_ProcessUtility(PlannedStmt * pstmt, const char * queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment * queryEnv, DestReceiver * dest, QueryCompletion * qc) (\home\lightdb\Sources\postgresql-13.3\contrib\pg_hint_plan\pg_hint_plan.c:7275)
8. lt_standby_forward.so!LtStandbyProcessUtility(PlannedStmt * pstmt, const char * queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment * queryEnv, DestReceiver * dest, QueryCompletion * qc) (\home\lightdb\Sources\postgresql-13.3\contrib\lt_standby_forward\lt_standby_forward.c:351)
9. lt_pathman.so!pathman_process_utility_hook(PlannedStmt * first_arg, const char * queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment * queryEnv, DestReceiver * dest, QueryCompletion * queryCompletion) (\home\lightdb\Sources\postgresql-13.3\contrib\pg_pathman\src\hooks.c:1113)
10. ProcessUtility(PlannedStmt * pstmt, const char * queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment * queryEnv, DestReceiver * dest, QueryCompletion * qc) (\home\lightdb\Sources\postgresql-13.3\src\backend\tcop\utility.c:755)
11. PortalRunUtility(Portal portal, PlannedStmt * pstmt, _Bool isTopLevel, _Bool setHoldSnapshot, DestReceiver * dest, QueryCompletion * qc) (\home\lightdb\Sources\postgresql-13.3\src\backend\tcop\pquery.c:1182)
12. PortalRunMulti(Portal portal, _Bool isTopLevel, _Bool setHoldSnapshot, DestReceiver * dest, DestReceiver * altdest, QueryCompletion * qc) (\home\lightdb\Sources\postgresql-13.3\src\backend\tcop\pquery.c:1349)
13. PortalRun(Portal portal, long count, _Bool isTopLevel, _Bool run_once, DestReceiver * dest, DestReceiver * altdest, QueryCompletion * qc) (\home\lightdb\Sources\postgresql-13.3\src\backend\tcop\pquery.c:791)
14. exec_simple_query(const char * query_string) (\home\lightdb\Sources\postgresql-13.3\src\backend\tcop\postgres.c:1260)
15. PostgresMain(int argc, char ** argv, const char * dbname, const char * username) (\home\lightdb\Sources\postgresql-13.3\src\backend\tcop\postgres.c:4496)
16. BackendRun() (\home\lightdb\Sources\postgresql-13.3\src\backend\postmaster\postmaster.c:4982)
17. BackendStartup(Port * port) (\home\lightdb\Sources\postgresql-13.3\src\backend\postmaster\postmaster.c:4666)
18. ServerLoop() (\home\lightdb\Sources\postgresql-13.3\src\backend\postmaster\postmaster.c:1929)
19. PostmasterMain(int argc, char ** argv) (\home\lightdb\Sources\postgresql-13.3\src\backend\postmaster\postmaster.c:1563)
20. main(int argc, char ** argv) (\home\lightdb\Sources\postgresql-13.3\src\backend\main\main.c:231)

CreateSchemaCommand流程

  1. 获取当前userID和context;
  2. 如果指定了owner,则设置指定的owner,否则,owner为当前userID;
  3. 如果schema name没有指定,则使用owner的user name;
  4. 检查是否具有在当前数据库创建schema的权限;
  5. 检查创建的schema名是否是pg_开头;不允许pg_开头;
  6. 如果设置了if_not_exists并且模式已经存在,则退出;
  7. 创建schema的名称空间;
  8. 增加cmd计数器使命名空间可见;
  9. 临时将新的名称空间放在搜索路径的前面;
  10. 将新schema报告给可能感兴趣的事件触发器。
  11. 将搜索路径重置为正常状态;
  12. 重置当前用户和安全上下文;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值