SQLite 数据库文件可以设为只读吗?
Can SQLite DB files be made read-only?
来自 SQLite 数据库的信息通过网络服务器呈现给用户(显示在 HTML 浏览器中)。数据库由独立于 Web 服务器的小型应用程序一次性加载。无法从用户浏览器更改数据库数据(这是只读服务)。
由于网络服务器有自己的用户 ID,因此它以 "other" 权限访问 SQLite 数据库文件。出于安全原因,我想将数据库文件权限设置为 rw-rw-r--
.
不幸的是,设置了此权限后,我收到一条警告 attempt to write a readonly database at line xxx
,它指向有关 SELECT
事务的一行(原则上是只读的)。当然,我没有结果。
如果权限更改为 rw-rw-rw
,一切正常,但这意味着任何人都可以篡改数据库。
SQLite DB 无法以只读方式访问是什么原因?
是否有 "behind-the-scene" 处理需要写入权限,即使是 SELECT 事务?
在 Whosebug 上查找表明,人们通常抱怨相反的情况:遇到阻止写入数据库的只读访问权限。我的目标是保护我的数据库免受任何更改尝试。
对于完整的故事,我的网络应用程序是用 Perl
编写的并使用 DBD::SQLite
您必须以 readonly
模式连接到您的 SQLite 数据库。
来自the docs:
You can also set sqlite_open_flags (only) when you connect to a database:
use DBD::SQLite;
my $dbh = DBI->connect("dbi:SQLite:$dbfile", undef, undef, {
sqlite_open_flags => DBD::SQLite::OPEN_READONLY,
});
-- https://metacpan.org/pod/DBD::SQLite#Database-Name-Is-A-File-Name
这个问题的答案中给出了解决方案Perl DBI treats setting SQLite DB cache_size as a write operation when subclassing DBI。
原来 AutoCommit
不能用只读 SQLite DB 设置为 0。在只读数据库情况下明确将其强制为 1 解决了问题。
感谢所有提供线索的人。
来自 SQLite 数据库的信息通过网络服务器呈现给用户(显示在 HTML 浏览器中)。数据库由独立于 Web 服务器的小型应用程序一次性加载。无法从用户浏览器更改数据库数据(这是只读服务)。
由于网络服务器有自己的用户 ID,因此它以 "other" 权限访问 SQLite 数据库文件。出于安全原因,我想将数据库文件权限设置为 rw-rw-r--
.
不幸的是,设置了此权限后,我收到一条警告 attempt to write a readonly database at line xxx
,它指向有关 SELECT
事务的一行(原则上是只读的)。当然,我没有结果。
如果权限更改为 rw-rw-rw
,一切正常,但这意味着任何人都可以篡改数据库。
SQLite DB 无法以只读方式访问是什么原因?
是否有 "behind-the-scene" 处理需要写入权限,即使是 SELECT 事务?
在 Whosebug 上查找表明,人们通常抱怨相反的情况:遇到阻止写入数据库的只读访问权限。我的目标是保护我的数据库免受任何更改尝试。
对于完整的故事,我的网络应用程序是用 Perl
编写的并使用 DBD::SQLite
您必须以 readonly
模式连接到您的 SQLite 数据库。
来自the docs:
You can also set sqlite_open_flags (only) when you connect to a database:
use DBD::SQLite; my $dbh = DBI->connect("dbi:SQLite:$dbfile", undef, undef, { sqlite_open_flags => DBD::SQLite::OPEN_READONLY, });
-- https://metacpan.org/pod/DBD::SQLite#Database-Name-Is-A-File-Name
这个问题的答案中给出了解决方案Perl DBI treats setting SQLite DB cache_size as a write operation when subclassing DBI。
原来 AutoCommit
不能用只读 SQLite DB 设置为 0。在只读数据库情况下明确将其强制为 1 解决了问题。
感谢所有提供线索的人。