SQLite第九课 sqlite3_set_authorizer案例

可以将一个如下面格式的my_authorizer函数,注册到SQLite语句的解释执行语句当中,并且最先被执行,就像是一个钩子,对sql语句进行一些访问的控制,类似于网络数据包的netfilter。

#include <iostream>

#include "sqlite/sqlite3.h"

using namespace std;

/*

该注册的回调函数,禁止用户删除任何的表,实际上,第三个参数

会传递进来当前操作的表的名称,可以通过和该值进行匹配,是否

需要对该表进行操作,当然由于pszString是一个无符号整型,如果

有多个参数想传递进来,可以设置sqlite3_set_authorizer的第三个

参数为结构体,然后通过将pszString进行类型的强制转换,返回

SQLITE_OK,表示继续执行,返回SQLITE_DENY表示拒绝执行

*/

int my_authorizer(void* pszString,

int nCode,/*当前SQL解析模块正在执行的操作码*/

const char* psz1,/*由SQL解析模块传递进来当前操作的数据库表,由操作码决定是否为空*/

const char* psz2,

const char* psz3,

const char* psz4)

{

int nNotPermitCode = *(int*)pszString;

if (nNotPermitCode == 11)

{

printf("can not execute drop\n");

return SQLITE_DENY;

}

return SQLITE_OK;

}

int main()

{

int rc = 0;

sqlite3* db = NULL;

char* pdbName = "test0.db";

char* pszErrMsg = NULL;

rc = sqlite3_open_v2(pdbName,&db,SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE,NULL);

char* pszCreateTb1 = "create virtual table geo_test1 using rtree_i32(id, minx, maxx)";

rc = sqlite3_exec(db,pszCreateTb1, 0, 0, &pszErrMsg);

char* pszInsertsql1 = "insert into geo_test1 values(1, 400, 400)";

rc = sqlite3_exec(db,pszInsertsql1, 0, 0, &pszErrMsg);

char* pszDropTable = "drop table geo_test1";

/*

授权动作编码(Authorizer Action Codes)

摘自:https://www.sqlite.org/c3ref/c_alter_table.html

每一种授权操作码都会传递不同的参数给授权注册函数,详细参考

网址。11是删除数据库表的授权操作码,当调用授权注册函数的时候

第三个字符串将获得当前被操作的表的名称。

*/

int nNotPermitCode = 11;

/*

第三个参数是传递给授权注册函数的参数值

*/

sqlite3_set_authorizer(db, my_authorizer, &nNotPermitCode);

sqlite3_stmt* statement;

rc = sqlite3_prepare_v2(db, pszDropTable, -1, &statement, NULL);

/*

单步调试到perr的错误信息:no authored,表示无权操作

*/

const char* pszErr = sqlite3_errmsg(db);

sqlite3_close(db);

return 0;

}

时间: 2024-11-14 00:36:34

SQLite第九课 sqlite3_set_authorizer案例的相关文章

基于案例SQL优化第九课作业分享

默认统计信息收集: 1. 11g默认启动了统计信息收集的任务,默认运行时间是周一到周五晚上10点和周6,周天的早上6点 2. 你也可以关闭自动统计新收集任务,选择手工收集的方式,但是一般不建议这样操作. 动态统计信息: 1. 统计信息默认情况下是每天晚上10点半后收集,如果新建对象还没来得级收集统计信息,就采用动态采样的方式. 2. 具体在set autotrace 跟踪的执行计划中,可以看到类似:- dynamic sampling used for this statement (level

【C++探索之旅】第一部分第九课:数组威武,动静合一

内容简介 1.第一部分第九课:数组威武,动静合一 2.第一部分第十课预告:文件读写,海阔凭鱼跃 数组威武,动静合一 上一课<[C++探索之旅]第一部分第八课:传值引用,文件源头>中,我们学习了函数参数的不同传递形式:值传递和引用传递,也学习了如何用头文件和源文件来更好地组织项目. 在不少程序中,我们都需要使用多个相同类型的变量.例如:一个网站的用户名列表(一般是string类型):或者一场比赛的前10个最佳得分(一般是int类型). 类似地,C++和大多数编程语言一样,也有将多个相同类型的数据

NeHe OpenGL教程 第九课:移动图像

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第九课:移动图像 3D空间中移动图像: 你想知道如何在3D空间中移动物体,你想知道如何在屏幕上绘制一个图像,而让图像的背景色变为透明,你希望有一个简单的动画.这一课将教会你所有的一切.前面的课程涵盖了基础的OpenGL,每一课都是在

【Linux探索之旅】第二部分第九课:查找文件,无所遁形

内容简介 1.第二部分第九课:查找文件,无所遁形 2.第二部分测试题 查找文件,无所遁形 这一课不难,但挺重要的. 之前的课程我们见识过了Linux下文件的组织形式是很特别的,跟Windows不一样. 我们也用ls / 这个命令来列出根目录下的所有目录,有/bin,/etc,/var,/home,等等.而这些目录下又有子目录和文件,错综复杂. 这些目录中有一部分是历史遗留的,从Unix时代就有了.问题是:我们如何在这"茫茫文海"中查找我们需要的文件. "人潮人海中,有你有我.

【C语言探索之旅】 第一部分第九课:函数

内容简介 1.课程大纲 2.第一部分第九课:函数 3.第一部分第十课预告: 练习题+习作 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量类型 文件读写 动

BeagleBone Black板第九课:测试读取ADC数据

BBB板第九课:测试读取ADC数据 之前我们初步学习了GPIO的使用方法,接下来认识下BBB板上ADC数据的读取操作,因为用BBB板做外部控制,接收外部传感器的一些模拟数据,模数转换ADC是需要用到的.所以在这里我也测试一下这BBB板的ADC简单功能,以后有深入学习到知识再进行补充. ADC资源引脚,P9_32至P9_40共九个引脚,其中P9_32为电源正极,P9_34为共地,其他七个对应七个ADC输入脚,因为有一个Ain_7估计是内部使用了,所以我们只使用Ain_0至Ain_6这七个ADC.

【C语言探索之旅】 第二部分第九课: 实战&quot;悬挂小人&quot;游戏

内容简介 1.课程大纲 2.第二部分第九课: 实战"悬挂小人"游戏 3.第二部分第十课预告: 安全的文本输入 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建

【C语言探索之旅】 第二部分第九课: 实战[悬挂小人]游戏

内容简介 1.课程大纲 2.第二部分第九课: 实战"悬挂小人"游戏 3.第二部分第十课预告: 安全的文本输入 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建

SQLite第五课 应用案例

1 打开数据库文件 sqlite3* m_db = NULL; int ret = sqlite3_open_v2("test.db", &db, SQLITE_OPEN_READWRITE, NULL); if (ret != SQLITE_OK) { return; } 2 如果表不存在,创建表 char szCreateUserDataSql[1024] = "create table if not exists tb_user (id INTEGER ,\ t