【问题标题】:SQL Server & RStudio - SQL Connection Almost WorkingSQL Server 和 RStudio - SQL 连接几乎可以正常工作
【发布时间】:2022-06-28 00:41:31
【问题描述】:

我在 R Studio 中遇到了与 SQL 连接相关的问题。 多年来,我们已经升级了一个本地 SQL Server,而安装它的同事不再在组织中。 我们还有一个加载了 SQL Server 的 Azure 服务器,该服务器是在他们离开之前最近设置的。

我们目前正在开发一个 GUI 程序,早期步骤之一是为声明变量的用户 (db_user) 建立 SQL 登录连接,并随着他们的登录而更改,并在定义的系统变量中正确传递密码在 .Renviron 中发布在 RStudio 的网站上以供参考。

(变量名匿名化) 现在解决这个问题: 每当我们尝试运行一系列查询时,我们的本地错误都会出现:

Error: nanodbc/nanodbc.cpp:1655: 42000: [Microsoft][SQL Server][SQL Server]Cannot execute as the server principal because the principal "db_user" does not exist, this type of principal cannot be impersonated, or you do not have permission. 
<SQL> 'EXECUTE AS LOGIN = 'db_user' SELECT name FROM master.sys.sysdatabases WHERE dbid > 4 AND HAS_DBACCESS(name) = 1 ORDER BY name ASC'

但是,在 Azure 中的 SQL Server 上运行完全相同的过程,相对没有主要配置,它会成功。

这是我们运行的 SQL 代码:

EXECUTE AS LOGIN = 'db_user' SELECT name 
FROM master.sys.sysdatabases 
WHERE dbid > 4 
AND HAS_DBACCESS(name) = 1 
ORDER BY name ASC

我觉得我已经为此耗尽了我的资源,首先我认为这是最初的 R 代码或可能是 SQL 驱动程序,但我不认为这是问题,因为 SQL 驱动程序会在其中提取名称列表R Studio 在 Connections 上下文菜单中,但在尝试完成查询时返回错误。

只要 Azure 连接成功,它就会作为 dbo@Azure\Azure 与 On-Prem 的 guest@Server\Server 连接。 (我还不能发布在线截图) 本地连接屏幕截图:https://i.ibb.co/PmbGt5y/RStudio-SQL.png Azure 连接截图:https://i.ibb.co/WFY3FqZ/azure1.png

我觉得这与 dbo 相关,因为那是连接断开的地方,但我不知道从哪里继续解决这个问题。

每当我在错误中搜索此错误的参考时,我都会看到

Cannot execute as the server principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission. 

被列为我遇到的最常见的相关错误,但我尝试了其中的一些(从空白数据库所有权到不相关的解决方案),但我在这里大多碰壁。

任何帮助将不胜感激。

【问题讨论】:

  • 仅供参考,sysdatabases 是 SQL Server 2000 中已弃用的视图;你现在真的应该使用sys.databases
  • @Larnu 我之前确实在 SSMS 中使用过该语句,但是由于某种原因,它在 RStudio SQL 查询中无法识别。它特别喜欢那个版本的master.sys.sysdatabases 电话。我之前尝试过更新该特定行,而当我这样做时,RStudio 不喜欢它。虽然它在 SSMS 中取得了成功,但 R Studio 却大不相同,"Incorrect syntax near '.'. [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. " 出现错误

标签: sql sql-server rstudio ssms


【解决方案1】:

我觉得这与 dbo 相关,因为那是连接断开的地方,但我不知道从哪里继续解决这个问题。

是的。

这个

EXECUTE AS LOGIN = 'db_user' 

需要impersonate permission 才能登录。错误消息清楚地告诉您。不清楚您为什么要模拟该登录名,而不是简单地作为登录名进行连接。

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    相关资源
    最近更新 更多