create table sales_catalog(
item_id varchar(10) not null primary key,
item_name_desc varchar(50) not null,
item_desc varchar(50));
在Firebird SQL3中使用SYSDBA
作为用户后出错。
Statement failed, SQLSTATE = 42000
unsuccessful metadata update
CREATE TABLE SALES_CATALOG failed
There is no privilege for this operation.
答案 0 :(得分:1)
我做了一些实验,问题似乎是如果你使用ISQL连接到数据库而没有指定主机名,它将使用嵌入的Firebird连接到数据库(之前版本的Firebird没有这样做窗口)。
Firebird嵌入式不需要用户名和密码,因为它假定如果您对数据库具有直接读/写访问权限,则允许您连接到该数据库。
如果在未指定用户名和密码的情况下进行连接(例如使用connect 'database.fdb'
而不是connect 'database.fdb' user sysdba
,则Firebird嵌入式将使用您的操作系统用户名进行连接。
这可以检查,因为ISQL在连接时报告用户名:
SQL> connect 'd:\data\db\fb3\dbofnormal.fdb';
Database: 'd:\data\db\fb3\dbofnormal.fdb', User: MARK
Firebird 3添加了新的元数据权限,例如在数据库中创建表现在要求您是数据库的所有者(create database
语句中使用的用户名),sysdba(或其他管理员用户) ,或者您拥有create table权限。另见User Privileges for Metadata Changes。在早期版本中,任何用户都可以在访问数据库后创建表。
现在问题是:用户(在我的示例中为MARK
)没有create table权限,因此尝试这样做会失败:
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
有几种方法可以解决这个问题:
在connect语句中指定具有足够权限的用户(例如sysdba
):
connect 'database.fdb' user sysdba;
在connect语句中包含主机名,以通过Firebird服务器连接,而不是嵌入Firebird,因此您需要指定用户名和密码:
connect 'localhost:database.fdb' user sysdba password 'masterkey';
以sysdba
连接一次到您的数据库(请参阅第一项),并为用户提供必要的权限(在我的情况下为mark
):
grant create table to user mark;
从此刻开始,此用户可以创建表(您可能需要授予其他权限,例如创建视图,创建过程等)。