PostgreSQL 中有哪些钩子函数

75次阅读
没有评论

共计 2288 个字符,预计需要花费 6 分钟才能阅读完成。

PostgreSQL 中有哪些钩子函数,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

一、需求

删除数据库 pg12db 时,只能使用 pg12 用户删除,其他用户(包括超级用户)均不能删除此数据库。

二、实现步骤

删除数据库的命令是 drop database, 属于 Utility 命令, 而 PG 提供了 ProcessUtility_hook 钩子可供使用.
实现一个钩子函数, 判断 SQL 语句是否为 T_DropdbStmt, 如是, 则判断数据库名称和用户名称是否匹配, 如不匹配, 则报错, 源码如下:

[pg12@localhost hookdemo_dbrestrict]$ cat hookdemo_dbrestrict.c
 * This is a hook demo.
 * 
 */
#include  postgres.h 
#include  miscadmin.h 
#include  tcop/utility.h 
PG_MODULE_MAGIC;
void _PG_init(void);
void _PG_fini(void);
static char *undroppabledb =  pg12db 
static char *hooksuperuser =  pg12 
static ProcessUtility_hook_type prev_utility_hook = NULL;
static void hookdemodbrestrict_ProcessUtility(PlannedStmt *pstmt, const char *queryString,
 ProcessUtilityContext context, ParamListInfo params,
 QueryEnvironment *queryEnv,
 DestReceiver *dest, char *completionTag)
 /* Do our custom process on drop database */
 switch(nodeTag(pstmt- utilityStmt))
 { 
 case T_DropdbStmt:
 { DropdbStmt *stmt = (DropdbStmt *)pstmt- utilityStmt;
 char *username = GetUserNameFromId(GetUserId(),false);
 /*
 * only user pg12 can drop pg12db.
 */
 if (strcmp(stmt- dbname, undroppabledb) == 0  
 strcmp(username, hooksuperuser) != 0)
 ereport(ERROR,(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),errmsg(Only superuser \ %s\  can drop database \ %s\ ,hooksuperuser,undroppabledb)));
 break;
 }
 default:
 break;
 }
 /*Standard process*/
 standard_ProcessUtility(pstmt, queryString, context, params, queryEnv, dest, completionTag);
/* _PG_init */
_PG_init(void)
 prev_utility_hook = ProcessUtility_hook;
 ProcessUtility_hook = hookdemodbrestrict_ProcessUtility;
/* Uninstall */
_PG_fini(void)
 ProcessUtility_hook = prev_utility_hook;
[pg12@localhost hookdemo_dbrestrict]$

三、实际效果

创建超级用户 superx, 使用该用户登录, 创建 pg12db 数据库, 删除数据库, 报错.

[local:/data/run/pg12]:5120 pg12@testdb=# create user superx with superuser password  root 
CREATE ROLE
[local:/data/run/pg12]:5120 pg12@testdb=# \q
[pg12@localhost pg122db]$ psql -U superx
Expanded display is used automatically.
psql (12.2)
Type  help  for help.
[local:/data/run/pg12]:5120 superx@testdb=# create database pg12db;
CREATE DATABASE
[local:/data/run/pg12]:5120 superx@testdb=# drop database pg12db;
ERROR: Only superuser  pg12  can drop database  pg12db 
[local:/data/run/pg12]:5120 superx@testdb=#

关于 PostgreSQL 中有哪些钩子函数问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注丸趣 TV 行业资讯频道了解更多相关知识。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-03发表,共计2288字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)