2

我想以只读方式连接到 Firebird 数据库(因为.fdb我的应用程序的只读位置。

我这样连接:

conn = fdb.connect(dsn="/path/to.fdb", user='****', password='****', charset='iso8859_1')

我得到的错误是:

连接数据库时出错:\n- SQLCODE: -551\n- 没有权限对数据库 /path/to.fdb' 进行读写访问,-551, 335544352

我正在使用 FDB v2.0。我在在线文档中找不到有关只读连接的任何内容。

4

2 回答 2

2

不幸的是,你想要的是不可能的。Firebird 没有只读连接的概念。每个连接都需要能够在数据库中写入信息以管理事务(这甚至适用于只读事务)。

唯一的例外是使用 gfix 标记为只读数据库的数据库。在这种情况下,事务依赖于最后提交的事务 id。但是,将数据库标记为只读将使其对所有连接都是只读的。

如果您的应用程序需要只读访问权限,而其他应用程序需要对同一数据库的写访问权限,唯一的解决方案是使用 Firebird 服务器*,并使用用户(和角色)分配足够的权限,以便能够读取但不能写入数据库。


*:Firebird Embedded 可能就足够了,但是由于用户需要对数据库进行读/写访问,因此绕过这种形式的恶意行为者访问控制会更简单。

于 2019-04-01T14:48:38.627 回答
1

为数据库创建一个具有特定角色的用户,并在进一步的连接中使用这个角色也许是个好主意。像这样的东西:

$ isql firstdb.fdb -user SYSDBA -password masterkey
Database:  firstdb.fdb, User: SYSDBA
SQL> CREATE ROLE firstdbadmin;
SQL> GRANT SELECT, UPDATE, INSERT, DELETE ON sales_catalog
CON> TO ROLE firstdbadmin;
SQL> GRANT firstdbadmin TO TestAdmin;
SQL> quit;

您是否尝试过在创建连接时使用“角色”参数?你可以看这里这里这里

于 2019-04-01T14:46:31.417 回答