运行此查询需要什么特权?

时间:2015-04-28 11:04:54

标签: intersystems-cache

我使用InterSystem的缓存JDBC驱动程序来查询"数据库字典"为了从类中检索源代码。

我有这个SQL查询:

final String query = "select id, super"
    + " from %Dictionary.ClassDefinition"
    + " where System = '0'"
    + " and name not like '\\%%' escape '\\'"
    + " and deployed != 2";

现在,执行此查询的用户将%All作为角色,这当然不是一件好事。我尝试将此用户的权限降低到严格的最低要求。

我连接到命名空间SAMPLES;我已经创建了一个角色,比如FOO,我已经赋予了这些权限:

  • %Service_SQL(U);
  • %DB_SAMPLES(R);
  • select对名称空间%Dictionary.ClassDefinition中的表%SYS的权限。

我已经尝试过,只给了我的用户这个角色;但它在执行时失败(-99错误翻译:"特权违规"):

Exception in thread "main" java.sql.SQLException: [SQLCODE: <-99>:<Violación de privilegio >]
[Location: <Prepare>]
[%msg: <User sonar is not privileged for the operation>]
    at com.intersys.jdbc.CacheConnection.getServerError(CacheConnection.java:1312)
    at com.intersys.jdbc.CacheConnection.processError(CacheConnection.java:1552)
    at com.intersys.jdbc.InStream.readHeader(InStream.java:164)
    at com.intersys.jdbc.CachePreparedStatement.prepareInternal(CachePreparedStatement.java:633)
    at com.intersys.jdbc.CachePreparedStatement.prepare(CachePreparedStatement.java:594)
    at com.intersys.jdbc.CachePreparedStatement.<init>(CachePreparedStatement.java:141)
    at com.intersys.jdbc.CacheConnection.prepareStatement(CacheConnection.java:1860)
    at com.intersys.jdbc.CacheConnection.prepareStatement(CacheConnection.java:484)
    at es.litesolutions.cacheqc.dbread.CacheDbReader.listClasses(CacheDbReader.java:47)
    at es.litesolutions.cacheqc.dbread.CacheDbReader.main(CacheDbReader.java:69)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

缺少哪些特权才能使用PreparedStatement s?

(是的,我知道上面的查询没有绑定变量,但其他查询将有绑定变量。)

1 个答案:

答案 0 :(得分:1)

您应该为具体表添加访问权限。可以在选项卡SQL表中为角色或用户执行此操作。只需添加表%Dictiinary.Classdefinition

要查找权限设置中的错误,您还可以使用Audit

您应该从命名空间SAMPLES添加表%Dictionary.ClassDefinition的访问权限。选择正确的命名空间很重要,因为您连接到SAMPLESenter image description here