【问题标题】:Executing a stored procedure works from Management Studio and localhost but not when published to a server从 Management Studio 和 localhost 执行存储过程有效,但在发布到服务器时无效
【发布时间】:2017-06-06 20:22:54
【问题描述】:

我正在将网站从 Oracle 转换为 SQL Server 2016。该网站是使用 Visual Studio 2015 在 ASP.NET Framework 4 中构建的。原始开发人员广泛使用 Oracle 包进行数据操作,我已成功将所有内容转换为存储过程和用户​​定义的函数。我已经成功地重写了所有网页以使用新语法。我可以在本地主机上毫无错误地运行该网站,并尝试让它在我们的开发 Web 服务器上运行。

问题:所有存储过程都返回相同的错误:

对象“USP_My_Procedure”、数据库“WEB_DB”、模式“WEBDATA”的 EXECUTE 权限被拒绝

用户是数据库角色的成员,该角色被授予DELETE, EXECUTE, INSERT, REFERENCES, SELECT, UPDATEVIEW DEFINITIONWEBDATA 架构的权限:

当不使用存储过程时,我可以直接从开发服务器上的网页中选择、插入、更新和删除数据。使用应用程序的 SQL 帐户登录时,我能够从 Management Studio 运行存储过程。我只是不能使用存储过程从网站上完成工作。不幸的是,我没有时间重写整个应用程序以消除存储过程。

有人知道要寻找什么吗?谢谢。

【问题讨论】:

  • 在黑暗中拍摄,但它是链接服务器吗? RPC/RPC OUT 设置呢?
  • 不,不是链接服务器。

标签: asp.net sql-server stored-procedures


【解决方案1】:

执行存储过程。在您的权限中查看 EXECUTE 行吗?它不授予此用户。

GRANT EXECUTE ON USP_My_Procedure TO YourUser

https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-object-permissions-transact-sql

【讨论】:

  • 是的,它被授予了。注意 EXECUTE 有两行。按照底部的 - Grantor: dbo 在框中带有复选标记。如果不是,我将无法从 Management Studio 执行该过程。
  • 如果您收到该消息,则表示两件事之一。当前用户拒绝执行权限或未授予执行权限。我希望您在 SSMS 中连接的不是与您的实时站点使用的是同一用户。
  • 我使用我在网站上使用的 ID 登录 SSMS 以测试权限。通常,我使用自己的登录名。我取消选中该框(使用我自己的登录名)以查看它是否会给我错误并且确实如此。我重新勾选了这个框,网站上仍然出现错误。
  • 所以您是说在 SSMS 中使用相同的用户 ID,该过程很好,但从其他位置运行时会因权限问题而失败?那没有意义。必须有其他事情发生,因为 SSMS 和您的站点都只是建立连接并使用该过程的客户端。必须有一些不同的东西。
  • 没错。这对我来说也没有任何意义——我很茫然,不知道还能去哪里。
【解决方案2】:

假设您的数据库连接字符串正在使用受信任的安全性...

如果您将 ASP.NET 应用程序部署到开发服务器,您很可能会使用 IIS。如果是这样,那么您可能正在使用应用程序池。验证应用程序池标识对数据库具有足够的权限。执行测试包括连接到 SQL Server 作为应用程序池标识所基于的安全上下文,然后只需尝试在查询窗口中执行失败的存储过程(使用此安全上下文)。

查看应用程序池...

  • 打开 Internet 信息服务 (IIS) 管理器(A.K.A.,inetmgr.exe)
  • 在左侧窗格中,展开服务器节点并单击以选择“应用程序池”
  • 在中间窗格中,单击以选择任何应用程序池
  • 在右侧窗格中单击以选择“高级设置...”
  • 在“流程模型”部分中通知“身份”的值(此值可以更改为可以分配给 SQL Server 资源的域用户帐户)。

如果您有多个应用程序池,诀窍是识别您的 ASP.NET 应用程序正在使用的那个...

【讨论】:

  • 我是 IIS 新手。您能否提供有关如何执行此操作的更多详细信息?
  • 我从未见过使用应用程序池连接数据库。我什至不认为这是可能的。通常,您使用连接字符串从网站建立数据库连接,希望将其存储在 web.config 文件中。
  • @SeanLange -(假设 SQL Server )如果您使用受信任的安全性,则连接字符串没有任何用户 ID 或密码。这是一个连接字符串示例(使用 EF):connectionString="data source=motoc_dev;initial catalog=motoc;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"。在这种情况下,安全上下文源自尝试连接的进程 - 对于 ASP.NET,即应用程序池......
  • 在将应用程序移至用户验收测试之前,我们将用户名和密码保留在连接字符串中。
  • 我相信,因为您将 Integrated Security 设置为 true,所以它没有使用用户 ID 或密码。试试这个连接字符串吧..
猜你喜欢
  • 2020-10-09
  • 2013-01-25
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多