【问题标题】:How can I ensure a read-only transaction in SqLite?如何确保 SqlLite 中的只读事务?
【发布时间】:2011-09-10 08:33:34
【问题描述】:

我有公共界面,允许人们通过输入 sql 命令与数据库进行交互。但是,我不希望他们以任何方式更改数据库(如果可能,不要访问某些表)。不过据我了解,SQLite 没有用户的概念,那我该如何实现呢?

【问题讨论】:

    标签: c++ sql c sqlite


    【解决方案1】:

    如果查询中没有应用程序定义的sql函数,间接修改数据库(例如:SELECT eval('DELETE FROM t1') FROM t2;),则使用sqlite3_stmt_readonly判断准备好的sql语句是否写入数据库,否则你可以尝试打开另一个read_only,数据库连接handler(SQLITE_OPEN_READONLY),将用于read_only访问。

    【讨论】:

      【解决方案2】:

      首先复制“主”数据库文件并打开它 :-) 不,真的,这是一个严肃的建议。

      否则,根据访问 SQLite 的方式,可以将 SQLITE_OPEN_READONLY flag 传递给 sqlite3_open_v2。这适用于整个连接——以及该连接上的所有事务。

      另一种选择是限制 SQL 条目,但这很难正确地做到,因此我不推荐这条路线。

      编码愉快。

      【讨论】:

      • 大声笑,我不敢相信以前没有人遇到过这个问题,不得不求助于这个。这也有很多问题,顺便说一句。 1.我的数据库是db文件的合并;我使用将查询分散到多个文件的视图 2. 它不会以实时方式显示数据 3. 数据库很大,这意味着复制会很慢
      • @chacham15 我更新了开放模式位,不确定它是否是您上次看到的。不得不更新我的低级 API 知识。
      • 啊哈!美丽的!快速的侧面问题:我可以让一个连接以读/写方式打开,另一个以只读方式打开吗?另外,有什么方法可以限制他们可以读取哪些表格?
      • @chacham15 老实说,从未尝试过。应该没问题——去吧,向勇敢的士兵报告! ;-)
      • @chacham15 我不知道这样的方式——正如所指出的,SQLite 在权限部门有点缺乏。也许看看像Firebird这样的“完整”RDMBS?它是“零安装”,我认为它也支持嵌入式模式......多年来没有玩过它。它现在看起来也非常特定于 Windows。
      猜你喜欢
      • 2021-06-22
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      相关资源
      最近更新 更多