4

我正在尝试从 Firebird 2.5 SQL 数据库中提取数据以进行迁移。这些数据是通过嵌入了 Firebird 2.5 数据库的软件在很长一段时间内建立起来的 - 并且该软件公司在允许以易于迁移的形式访问我们的数据方面没有帮助......

通过更改 security2.fdb 文件,我可以isql使用管理员用户名访问数据库SYSDBA,并且可以列出数据库中的表,但是对单个表的任何进一步访问总是抛出消息:“此数据库中没有表 XXXX”

以下是 Windows 命令提示符的示例:

SQL> show tables;
        ....
        ....
        Customer
        ....
SQL> show table customer;
There is no table CUSTOMER in this database

我怀疑对单个表的访问受到控制,但如果可能的话,我无法弄清楚如何重新获得访问权限。

4

1 回答 1

6

默认情况下,Firebird(和大多数其他数据库)中的对象名称不区分大小写,但有一个问题:如果您创建或引用不带引号的表(或其他对象)名称,它实际上被视为大写。仅当对象名称用引号引起来时,它才区分大小写并按原样引用。此行为在 SQL 标准中指定(参见 SQL:2011 Foundation,5.2 <token> 和 <separator>以及5.4 Names and Identifiers)。

这意味着 、customerCustomerCUSTOMER都引用CuStOmEr"CUSTOMER"一个表,即:CUSTOMER

当您创建一个表"Customer"(注意引号)时,它存储在元数据中,Customer但它只能被引用为"Customer",使用Customer仍然会引用CUSTOMER,因为不带引号的对象名称不区分大小写。

您尝试使用

show table Customer;

请注意错误消息中 CUSTOMER 的大写用法:

此数据库中没有表CUSTOMER

的输出show tables显示您有一个表Customer(而不是CUSTOMER),因此您需要将其引用为"Customer". 你需要使用:

show table "Customer";
于 2014-10-04T14:33:28.843 回答