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