以只读方式连接到Firebird数据库

时间:2019-04-01 14:18:15

标签: python firebird fdb

我想以只读方式连接到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。在联机文档中找不到关于只读连接的任何信息。

2 个答案:

答案 0 :(得分:2)

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

唯一的例外是已标记为read-only database using gfix的数据库。在这种情况下,交易会在最后提交的交易ID上搭载。但是,将数据库标记为只读将使其对所有连接均为只读。

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


*:Firebird Embedded可能就足够了,但是由于用户随后需要对数据库的读/写访问权限,因此可以更轻松地规避这种针对恶意行为者的访问控制形式。

答案 1 :(得分: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;

在创建连接时是否尝试过使用'role'参数? 您可能会看到hereherehere