我做了一些实验,问题似乎是,如果您使用 ISQL 连接到数据库而不指定主机名,它将使用 Firebird 嵌入式连接到数据库(以前版本的 Firebird 在 Windows 上没有这样做)。
Firebird Embedded 不需要用户名和密码,因为它假定如果您对数据库具有直接读/写访问权限,则允许您连接到它。
当您在未指定用户名和密码的情况下进行连接时(例如,使用connect 'database.fdb'
而不是connect 'database.fdb' user sysdba
,Firebird Embedded 将使用您的操作系统用户名进行连接。
可以检查这一点,因为 ISQL 在连接时会报告用户名:
SQL> connect 'd:\data\db\fb3\dbofnormal.fdb';
Database: 'd:\data\db\fb3\dbofnormal.fdb', User: MARK
Firebird 3 添加了新的元数据权限,例如在数据库中创建表现在要求您是数据库的所有者(create database
语句中使用的用户名)、sysdba(或其他管理员用户),或者您拥有创建表特权。另请参阅元数据更改的用户权限。在早期版本中,任何用户一旦有权访问数据库就可以创建表。
现在解决问题:用户(在我的示例MARK
中)没有创建表权限,因此尝试这样做会失败:
SQL> create table testmark ( id integer generated by default as identity primary key);
Statement failed, SQLSTATE = 42000
unsuccessful metadata update
-CREATE TABLE TESTMARK failed
-There is no privilege for this operation
有几种方法可以解决这个问题:
在连接语句中指定具有足够权限的用户(例如sysdba
):
connect 'database.fdb' user sysdba;
在连接语句中包含主机名以通过 Firebird 服务器而不是 Firebird 嵌入式进行连接,因此您需要指定用户名和密码:
connect 'localhost:database.fdb' user sysdba password 'masterkey';
一次连接到您的数据库sysdba
(参见第一项),并为用户提供必要的权限(在我的情况下mark
):
grant create table to user mark;
从这一刻起,该用户可以创建表(您可能需要授予额外的权限,例如创建视图、创建过程等)。