共计 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 行业资讯频道了解更多相关知识。
正文完