首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当表和列存在时,为什么uCanAccess不能执行带有错误的查询“用户缺乏特权或没有发现”?

当表和列存在时,为什么uCanAccess不能执行带有错误的查询“用户缺乏特权或没有发现”?
EN

Stack Overflow用户
提问于 2018-08-30 04:59:39
回答 1查看 898关注 0票数 1

我有一个数据库,其中有几个表,其中三个如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Controllers_Readers
-------------------
ControllerID: Number (Long Integer), Default 0, Indexed (Y, no Duplicated)
ReaderID: Number (Long Integer), Default 0, Indexed (Y, No Duplicates)

Controllers
-----------
ControllerID: Number (Long Integer), Default 0, Indexed (Y, No Duplicates)
Description: Short Text (32)
Name: Short Text (32)
...

Readers
-------
ReaderID: Number (Long Integer), Default 0, Indexed (Y, No Duplicates)
Direction: Number (Long Integer)
Description: Short Text (32)
Name: Short Text (32)
...

我有以下的Java代码来检查一个表是否存在,以及它是否包含一个特定的列,基于this answer to a question about table metadata

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/* Use the metadata to check if a table exists and has a specific column */
  public static boolean tableHasColumn(Connection con, String tableName, String colName)
    throws ClassNotFoundException, SQLException, InstantiationException,
    IllegalAccessException 
  {
    boolean exists = false, hasCol = false;

    ResultSet rs = null, r = null;
    Statement s = null;

    try {
      DatabaseMetaData dbm = con.getMetaData();
      rs = dbm.getTables(null, null, tableName, null);
      if (rs.next() && rs.getRow() > -1) {
        exists = true;
        s = con.createStatement();
        r = s.executeQuery("SELECT * FROM " + tableName + " LIMIT 1");
        if (r.next()) {
          ResultSetMetaData rsmd = r.getMetaData();
          for (int col = 1; col < rsmd.getColumnCount(); col++) {
            String name = rsmd.getColumnName(col);
            logger.debug("Found column \"" + name + "\" in \"" + tableName + "\".");
            if (name.equals(colName)) {
              hasCol = true;
              break;
            }
          }
        }
      }
    } finally {
      if (null != rs) {
        try {
          rs.close();
        } catch (SQLException ex) {
          logger.warn(
            "Failed to close Resultset to DB while checking if table exists!"
          );
        }
      }
    }
    logger.debug(
      "Table (" + tableName + ") Exists: " + String.valueOf(exists).toUpperCase()
      + "\tHas Column (" + colName + "): " + String.valueOf(hasCol).toUpperCase()
    );

    return (exists && hasCol);
  }

分别为"Controllers_Readers""ControllerID"提供tableNamecolName的值,则返回值为true。但是,当我运行以下查询时,会收到org.hsqldb.HsqlException: user lacks privilege or object not found: CONTROLLERS_READERS.CONTROLLERID的错误消息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT C.Description AS cName, C.ControllerID AS CID,
  D.DirectionText as dName, D.Direction AS dirNum, R.Description AS rName,
  R.ReaderID AS RID, AP.Name AS aName, AP.Description as aDescrip, AP.PointID
FROM Controllers AS C, Controllers_Readers AS CR, Readers AS R,
  Directions AS D, AccessPoints AS AP, Points_Controllers as PC
WHERE Controllers_Readers.ControllerID = Controllers.ControllerID 
  AND Readers.ReaderID = Controllers_Readers.ReaderID
  AND Directions.Direction = Readers.Direction AND 
  Points_Controllers.ControllerID = Controllers.ControllerID
  AND AccessPoints.PointID = Points_Controllers.PointID
GROUP BY Controllers.Description, Controllers.ControllerID, 
  Directions.DirectionText, Directions.Direction, Readers.Name, 
  Readers.Description, Readers.ReaderID,  AccessPoints.Name, 
  AccessPoints.Description, AccessPoints.PointID 
ORDER BY Controllers.Description, Controllers.ControllerID, 
  Directions.DirectionText, Directions.Direction, Readers.Name, 
  Readers.Description, Readers.ReaderID,  AccessPoints.Name,
  AccessPoints.Description, AccessPoints.PointID

相关的日志输出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2018-08-30 14:24:35 [DEBUG] db.Locations:35 - Location: LOCAL   DB Path: \\sentinel.domain\TempStorage\Me\dbs\Redacted.mdb
2018-08-30 14:24:35 [DEBUG] db.Digger:767 - Connect to DB on path: \\sentinel.domain\TempStorage\Me\dbs\Redacted.mdb
2018-08-30 14:24:35 [INFO ] db.Digger:790 - Connecting to jdbc:ucanaccess:////sentinel.domain/TempStorage/Me/dbs//Redacted.mdb;openExclusive=false;concatNulls=false;ignoreCase=true
2018-08-30 14:24:37 [DEBUG] impl.DatabaseImpl:887 - Finished reading system catalog.  Tables: [AccessNumbers, AccessNumbers_Controllers, AccessNumbers_Groups, AccessNumbers_Readers, AccessPoints, Areas, Areas_Controllers, Areas_Points, Areas_Timezones, Controllers, Controllers_Expanders, Controllers_Readers, Directions, Events, Expanders_Readers, Groups, Groups_Areas, Groups_Controllers, Groups_Timezones, Holidays, Points_Controllers, Points_Readers, Points_Timezones, ReaderExpanders, Readers, SelectedAreas, SelectedDates, Sites, Sites_Areas, Status, Storage, Timezones, Transactions, UserInformation, Users] (Db=Redacted.mdb)
2018-08-30 14:25:10 [DEBUG] db.Digger:884 - Found column "ControllerID" in "Controllers_Readers".
2018-08-30 14:25:10 [DEBUG] db.Digger:901 - Table (Controllers_Readers) Exists: TRUE    Has Column: TRUE
2018-08-30 14:25:10 [ERROR] db.Digger:1180 - [UcanaccessSQLException]: UCAExc:::4.0.2 user lacks privilege or object not found: CONTROLLERS_READERS.CONTROLLERID
    net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.2 user lacks privilege or object not found: CONTROLLERS_READERS.CONTROLLERID
    at net.ucanaccess.jdbc.UcanaccessStatement.executeQuery(UcanaccessStatement.java:210)
    at db.Digger.loadAllControllerReaders(Digger.java:947)
    at db.Digger.main(Digger.java:1177)
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: CONTROLLERS_READERS.CONTROLLERID
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.executeQuery(Unknown Source)
    at net.ucanaccess.jdbc.UcanaccessStatement.executeQuery(UcanaccessStatement.java:208)
    ... 2 more
Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: CONTROLLERS_READERS.CONTROLLERID
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.ExpressionColumn.checkColumnsResolved(Unknown Source)
    at org.hsqldb.QueryExpression.resolve(Unknown Source)
    at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source)
    at org.hsqldb.ParserCommand.compilePart(Unknown Source)
    at org.hsqldb.ParserCommand.compileStatements(Unknown Source)
    at org.hsqldb.Session.executeDirectStatement(Unknown Source)
    at org.hsqldb.Session.execute(Unknown Source)

注意:db.Diggerdb.Locations是我的应用程序中的类。loadAllControllerReaders是执行SQL `的方法。

通过me (Office 365)对DB运行相同的查询将为我提供一个包含列中值的结果集。为什么uCanAccess/HSQLDB不能这样做(未能在ControllerID中找到Controllers_Readers列)?我如何让它认识到该列存在于表中?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-30 08:57:25

我能够在HSQLDB本身下重新创建您的问题(版本2.4.1)。您已经在FROM子句中别名了您的表名。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
... FROM Controllers AS C, Controllers_Readers AS CR, ...

但WHERE子句使用的是未别名的表名,而不是别名。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
... WHERE Controllers_Readers.ControllerID = Controllers.ControllerID ...

因此,无法识别实际的表名。这一点可以用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Statement st = conn.createStatement();
st.execute("CREATE TABLE MY_TABLE (ID INT PRIMARY KEY, DT DATETIME)");
st.execute("INSERT INTO MY_TABLE (ID, DT) VALUES (1, '2018-12-23 00:11:22')");
ResultSet rs = st.executeQuery("SELECT X.DT FROM MY_TABLE AS X WHERE MY_TABLE.ID=1");

也会产生

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: MY_TABLE.ID
...
Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: MY_TABLE.ID

您还需要在剩下的子句中使用适当的别名(其中,按组,按顺序)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52097746

复制
相关文章
mysql新增表或字段时判断是否存在
在升级程序时往往是一大堆的sql语句,而单一的sql语句是没法在新增时判断表或字段是否存在的,必须写成存储过程
仙士可
2019/12/18
9K0
为什么安装 Navicat version 9 后,当打开查询或保存报表时,我会收到错误信息?
Cannot create file \"C:\Program Files\PremiumSoft\Navicat 8.2 MySQL\ ... xxx.xxx\". 系统找不到指定的路径。\
明哥的运维笔记
2019/01/30
1.1K0
为什么 GROUP BY 之后不能直接引用原表中的列
  标准 SQL 规定,在对表进行聚合查询的时候,只能在 SELECT 子句中写下面 3 种内容:通过 GROUP BY 子句指定的聚合键、聚合函数(SUM 、AVG 等)、常量。我们来看个例子
星哥玩云
2022/08/18
1.7K0
为什么 GROUP BY 之后不能直接引用原表中的列
MySQL查询表位置和列注释等
; # 查询表在哪个数据库与注释 SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_COMMENT FROM information_schema.TABLES WHERE 1=1 # AND TABLE_SCHEMA = '数据库名' AND TABLE_NAME = '表名' # AND TABLE_COMMENT = '表注释' ; # 查询列在哪个表与注释 SELECT c.TABLE_SCHEMA, c.TABLE_NAME, t.TABLE_COMMENT, COL
林万程
2018/06/21
3K0
Oracle查询表位置和列注释等
-- 注释 SELECT t.TABLE_NAME, t.COMMENTS, c.COLUMN_NAME, c.COMMENTS FROM USER_COL_COMMENTS c JOIN USER_TAB_COMMENTS t ON c.TABLE_NAME = t.TABLE_NAME WHERE 1 = 1 -- AND t.TABLE_NAME = '' -- AND t.COMMENTS like '%%' -- AND c.COLUMN_NAME = '' --
林万程
2020/06/16
9910
SQL命令 INSERT(三)
默认情况下,INSERT是要么全有要么全无的事件:要么完全插入行,要么根本不插入行。 IRIS返回一个状态变量SQLCODE,指示插入是成功还是失败。要将行插入到表中,插入操作必须满足所有表、字段名和字段值要求,如下所示。
用户7741497
2022/05/05
2.5K0
2018-11-26 oracle查询表信息(索引,外键,列等)1、查询出所有的用户表2、查询出用户所有表的索引3、查询用户表的索引(非聚集索引):4、查询用户表的主键(聚集索引):5、查询表的索引6
oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息,索引信息查询SQL如下,希望对大家有所帮助:
Albert陈凯
2018/12/18
3K0
SQL命令 REVOKE
REVOKE语句撤销允许用户或角色在指定的表、视图、列或其他实体上执行指定任务的权限。 REVOKE还可以撤销用户分配的角色。 REVOKE撤销GRANT命令的操作;
用户7741497
2022/05/06
1.2K0
用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
数据库中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
全栈程序员站长
2022/07/09
1.7K0
SQL命令 SELECT(一)
SELECT语句执行从IRIS数据库检索数据的查询。 在其最简单的形式中,它从单个表的一个或多个列(字段)中检索数据。 列由select-item列表指定,表由FROM table-ref子句指定,WHERE子句可选地提供一个或多个限制条件,选择哪些行返回它们的列值。
用户7741497
2022/05/06
5.3K0
Oracle创建用户并给用户授权查询指定表或视图的权限
CREATE USER NORTHBOUND IDENTIFIED BY NORTHBOUND  DEFAULT TABLESPACE "TBS_DNINMSV31"  TEMPORARY TABLESPACE "TEMP2"  QUOTA UNLIMITED ON "TBS_DNINMSV31";
星哥玩云
2022/08/17
8.2K0
开发:异常收集之 sql查询 表或视图不存在
其实针对大部分的 sql查询,不论是查oracle、sqlServer、MySQl 出现 查询表或视图不存在
执笔记忆的空白
2020/12/25
1.3K0
全功能数据库管理工具-RazorSQL 10大版本发布
◆ 概述 RazorSQL是适用于 Windows、macOS、Mac OS X、Linux 和 Solaris 的 SQL 查询、数据库浏览器、SQL 编辑的数据库管理工具。 RazorSQL 支持40 多个数据库,可以通过 JDBC或ODBC连接到数据库: ◆ 增强功能 增强了暗模式。可以通过 View -> Dark Mode 菜单选项选择暗模式。现在可以通过 View -> Legacy Dark Mode 菜单选项选择以前的暗模式。 添加了可以通过 View -> Light Mode 菜单选项
IT大咖说
2022/08/26
3.9K0
全功能数据库管理工具-RazorSQL 10大版本发布
当测试发现300个缺陷时
当测试人员发现了这么多问题后,是否还隐藏着更多的未知问题?当测试人员疲于提交大量的缺陷时,测试执行的有效性是否降低了?还有哪些风险项存在?
CKL的思考
2023/08/28
2150
当测试发现300个缺陷时
当执行 DELETE 时,你心慌了
老实讲,俺也一样。不仅仅是执行 DELETE 心里会咯噔下,多几次确认,哪怕是 INSERT,UPDATE, 甚至是 SELECT, 只要是在生产环境做的操作,都难免心里会有些紧张。
Lenis
2021/10/11
3260
SQL命令 CREATE VIEW(一)
CREATE VIEW命令定义视图的内容。定义视图的SELECT语句可以引用多个表,也可以引用其他视图。
用户7741497
2022/04/18
6.4K1
为什么前端不能没有监控系统?
提到监控系统,大部分同学首先想到的是后端监控。很明显,比如检测服务器性能,数据库性能,API 的访问流量,以及各种服务的运行情况等等,都与后端息息相关。而前端更多承担的是 UI 展现的角色,主要关注页面怎么排版设计,好像没什么需要监测的地方,因此一直以来都没有涉及到监控的概念。
杨成功
2022/09/22
1.1K0
为什么前端不能没有监控系统?
MySQL关联查询时,我们为什么建议小表驱动大表?
有的时候我们在操作数据库时会将两个或多个数据表关联起来通过一些条件筛选数据,在关联表时我们要遵循一些原则,这样会使我们编写的SQL 语句在效率上快很多。
路人甲Java
2020/07/06
5.7K0
db2 terminate作用_db2 truncate table immediate
表。 表 2. SQLSTATE 类代码 类代码 含义 要获得子代码,参阅…00 完全成功完成 表 301 警告 表 402 无数据 表 507 动态 SQL 错误 表 608 连接异常 表 709 触发操作异常 表 80A 功能部件不受支持 表 90D 目标类型规范无效 表 100F 无效标记 表 110K RESIGNAL 语句无效 表 120N SQL/XML 映射错误 表 1320 找不到 CASE 语句的条件 表 1521 基数违例 表 1622 数据异常 表 1723 约束违例 表 1824 无效的游标状态 表 1925 无效的事务状态 表 2026 无效 SQL 语句标识 表 2128 无效权限规范 表 232D 无效事务终止 表 242E 无效连接名称 表 2534 无效的游标名称 表 2636 游标灵敏度异常 表 2738 外部函数异常 表 2839 外部函数调用异常 表 293B SAVEPOINT 无效 表 3040 事务回滚 表 3142 语法错误或访问规则违例 表 3244 WITH CHECK OPTION 违例 表 3346 Java DDL 表 3451 无效应用程序状态 表 3553 无效操作数或不一致的规范 表 3654 超出 SQL 限制,或超出产品限制 表 3755 对象不处于先决条件状态 表 3856 其他 SQL 或产品错误 表 3957 资源不可用或操作员干预 表 4058 系统错误 表 415U 实用程序 表 42
全栈程序员站长
2022/11/17
7.7K0
为什么网站中的CSS或JS会带有v或version参数
在查看网页源码的时候经常会发现带有类似 ?v=13566 或者 ?version=15678 的 CSS 和 JS 文件。如下所示: <script src="w3h5.js?version=1568
德顺
2019/11/13
4.3K0
为什么网站中的CSS或JS会带有v或version参数

相似问题

"UCanAccess:用户缺乏特权或对象找不到“第二次连接

10

SpringBoot用户缺乏特权或对象没有找到

24

HSQLDB:用户缺乏特权或对象找不到错误

13

UCanAccess:用户缺少特权或找不到对象

22

PostgreSQL -用户缺乏特权或对象找不到

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文