可以将一个如下面格式的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;

}

转载于:https://blog.51cto.com/fengyuzaitu/1956654

SQLite第九课 sqlite3_set_authorizer案例相关推荐

  1. C#之windows桌面软件第九课:汉字串口助手

    C#之windows桌面软件第九课:汉字串口助手 using System; using System.Collections.Generic; using System.ComponentModel ...

  2. 职高计算机教学案例 反思,关于职高数学优质课教学案例的研究与反思

    [摘 要] 随着社会的发展和世界经济的相互融合,我国社会的技能型人才已经供不应求,同时,国家也加强了对职业教育的扶持力度,政策上也向职高倾斜.职高数学是每一个学生必须掌握的基础知识,是其学好专业知识的 ...

  3. 第九课:循环链表与双向链表

    第九课 本课主题: 循环链表与双向链表 教学目的: 掌握循环链表的概念,掌握双向链表的的表示与实现 教学重点: 双向链表的表示与实现 教学难点: 双向链表的存储表示 授课内容: 一.复习线性链表的存储 ...

  4. 投资学习网课笔记(part9)--基金第九课

    学习笔记,仅供参考,有错必纠 文章目录 基金第九课 估值指标 市盈率 市净率 股息率 盈利收益率 PEG 基金第九课 估值指标 什么是估值指标 估值指标是衡量股票内在价值的指标,它可以用来判断股票的价 ...

  5. Python可以这样学(第九季 机器学习案例与实战)-董付国-专题视频课程

    Python可以这样学(第九季 机器学习案例与实战)-1551人已学习 课程介绍         陆续介绍和分享一些机器学习方面的案例,Python基础知识可以参考前面的"Python可以这 ...

  6. 综合日语第一册第九课

    第九课 第一单元 复习 自动词:当主语做完动作后,被改变的是主语本身的状态,这个动词就叫自动词,即自动词改变的是自身的状态: 他动词:当主语做完动作后,被改变的是主语之外的事物的状况,那么这样的动词就 ...

  7. 榆树计算机课,吉林省榆树市弓棚镇武龙中学校七年级信息技术:第九课 Excel表格计算 教案+课件 (2份打包)...

    ID:8701298 分类: 吉林 , 2018 资源大小:2626KB 资料简介: 课 题Word表格 课型新授课第 1 课时教材分析本节课内容是长春版<信息技术>第九课的内容,学习制作 ...

  8. 《幸福就在你身边》第九课、确信自己有好命【哈佛大学幸福课精华】

    一.确信自己一定会走运 "只要相信自己,就会走运".世上无难事,只怕有心人.一个人能否成功,完全取决于他对自己信任的程度.只要找准了方向,充满信心地去努力,就没有实现不了的愿望.要 ...

  9. Transformer课程 第8课 NER案例模型训练及预测

    Transformer课程 第8课 NER案例模型训练及预测 Train Our Classification Model 现在,我们的输入数据已正确格式化,是时候对BERT模型进行微调了. 4.1. ...

最新文章

  1. 初学Oracle的笔记(2)——基础内容(实时更新中..)
  2. java软件下载jar_qdox.jar免费版
  3. 上海虹桥站 启动建设5G网络,DMA助力5G加速
  4. call_user_func
  5. Java程序员从笨鸟到菜鸟之(八十六)跟我学jquery(二)大话jquery选择器
  6. 出现java.lang.UnsupportedClassVersionError 错误的原因
  7. 3.QT数据库综合案例,模糊查询等操作
  8. 2011年中国民营企业500强名单,广东仅13家浙江180家江苏130家
  9. NOS跨分区灾备设计与实现
  10. 一步步在Kubernetes里运行Web应用
  11. ArrayList类contains方法实现原理
  12. flask-sqlalchemy分表解决方案
  13. bind + DNSCrypt 实现安全加密转发,避免DNS污染
  14. ADB工具安装及常用命令
  15. PMP考试通关宝典-敏捷专题
  16. 十字链表实现稀疏矩阵,包含十二大功能
  17. 获取p12证书详情,返回证书详情实体
  18. Python3.x+迅雷x 自动下载高分电影
  19. 树莓派3B+新麦克风调试
  20. 【顶】(与同事合作的快乐)技术人员也需要先学会做人,再学会做事,再是能成事,最后是成名得利...

热门文章

  1. Dapper使用在WCF上总是说Service找不到
  2. 关闭主窗口,启动另一个窗口
  3. c#正则表达式应用实例
  4. 高通:蓝牙5.0将可同时连接两个设备
  5. 最简单的小程序怎么做?
  6. [Spring-cloud-eureka]使用 gradle, spring boot,Spring cloud Eureka 搭建服务提供者
  7. 从零开始--系统深入学习IOS(使用Swift---带链接)
  8. 利用数组求前n个质数
  9. [转载]如何破解Excel VBA密码
  10. 懒人的小技巧, 批处理修改IP