我工作在一个rmarkdown / quarto文档查询数据库(Exasol)与只读访问。如果在R块中执行,这很好,如下所示。
```{r} conn <- exasol::dbConnect( drv = "exa",exahost = "my_host_url",
uid = Sys.getenv("EXASOL_USER"), pwd = Sys.getenv("EXASOL_PWD") )查询<-“从MY_SCHEMA.MY_TABLE限制10中选择*”
df <- exasol::dbGetQuery(conn,query)
现在,我尝试在sql块中运行相同的查询。
```{sql connection=conn}从MY_SCHEMA.MY_TABLE限制10中选择*
但是,我得到以下错误消息。
Using Schema from statement: "MY_SCHEMA"
Transaction rolled back.
Error in exa.readData(res$connection, query, ...) :
Could not receive header
In addition: Warning message:
In .EXAExecStatement(con = conn, stmt = statement, schema = schema, :
42500 -6818256 [EXASOL][EXASolution driver]insufficient privileges for creating table (Session: 1741969101333790720)[RODBC] ERROR: Could not SQLExecDirect 'create table "SUS_ANALYTICS".TEMP_791648_CREATED_BY_R as (SELECT * FROM MY_SCHEMA.MY_TABLE LIMIT 10
)'
Error in exa.readData(res$connection, query, ...) :
Could not execute SQL: '42000' -6811776' [EXASOL][EXASolution driver]object "MY_SCHEMA"."TEMP_791648_CREATED_BY_R" not found [line 1, column 23] (Session: 1741969101333790720)'
Failed to execute SQL chunk我只读访问权限。因此,关键的信息似乎是insufficient privileges for creating table。它显示引擎试图创建一个临时表,但失败。
PS。对不起,我不知道如何使这个例子重现。
发布于 2022-09-01 15:18:21
正如注释和其他答案中已经描述的那样,这个问题是由Exasol在使用DBI::dbSendQuery时试图创建一个表引起的。然而,有一个简单的解决办法。只需设置sql块参数max.print = -1即可。这将导致针织品sql引擎使用DBI::dbGetQuery而不是DBI::dbSendQuery。由于DBI::dbGetQuery不尝试创建(临时)表,因此问题被回避。
示例
```{sql connection=conn, max.print=-1}从MY_SCHEMA.MY_TABLE限制10中选择*
为什么?
以下代码来自第616行ff。编织机的
data = tryCatch({
if (is_sql_update_query(query)) {
DBI::dbExecute(conn, query)
NULL
} else if (is.null(varname) && max.print > 0) {
# execute query -- when we are printing with an enforced max.print we
# use dbFetch so as to only pull down the required number of records
res = DBI::dbSendQuery(conn, query)
data = DBI::dbFetch(res, n = max.print)
DBI::dbClearResult(res)
data
} else {
if (length(params) == 0) {
DBI::dbGetQuery(conn, query)
} else {
# If params option is provided, parameters are not interplolated
DBI::dbGetQuery(conn, sql, params = params)
}
}
...第一个else if语句是相关的部分:如果您将max.print设置为等于或小于0的值,则它将是DBI::dbGetQuery而不是DBI::dbSendQuery。
发布于 2022-08-24 13:33:30
西琳是对的。目前,r-exasol需要创建临时表来实现DBI接口的分页。这样,您就需要使用写权限来运行sql块。
https://stackoverflow.com/questions/73462252
复制相似问题