Iai*_*der 2 sql-server-2008 stored-procedures deployment linked-server
Red Gate 部署管理器(RGDM) 今天失败并出现“登录失败”错误,即使它具有目标服务器的管理控制权:
2013-11-04 17:13:22 +00:00 INFO Creating [dbo].[GetPublications]
2013-11-04 17:41:29 +00:00 INFO Command RedGate.Deploy.Agent.Commands.SingleShotDeploymentCommand failed
2013-11-04 17:41:29 +00:00 INFO RedGate.Deploy.PluginApi.Deployment.ConventionFailedException: Dynamic deployment failed
2013-11-04 17:41:29 +00:00 INFO Login failed for user 'red_gate_deployment_manager'. ---> RedGate.Deploy.SqlServerDbPackage.Shared.Exceptions.SqlServerInaccessibleException: Dynamic deployment failed
2013-11-04 17:41:29 +00:00 INFO Login failed for user 'red_gate_deployment_manager'. ---> System.Data.SqlClient.SqlException: Login failed for user 'red_gate_deployment_manager'.
Run Code Online (Sandbox Code Playgroud)
我要部署的过程之一是指链接服务器上的分发数据库。定义如下所示:
CREATE PROCEDURE dbo.GetPublications
AS
BEGIN
SELECT publisher_db, publication, description
FROM DISTRIBUTOR.distribution.dbo.MSpublications;
END;
Run Code Online (Sandbox Code Playgroud)
在 SSMS 中,我以 red_gate_deployment_manager 的身份连接到目标服务器并尝试手动创建该过程。我收到了类似的错误:
Msg 18456, Level 14, State 1, Line 1
Login failed for user 'red_gate_deployment_manager'.
Run Code Online (Sandbox Code Playgroud)
一位同事解释说,RGDM 无法创建过程,因为它没有权限连接到引用的链接服务器。
在我们的环境中,所有链接的服务器都模拟本地登录。因此,我们的解决方案是向链接服务器上的 RGDM 授予管理控制权。
我们解决了这个问题,但我仍然不明白。
为什么 SQL Server 在创建时而不是在执行时引发错误?
这令人困惑,因为这种行为感觉不一致。我想不出一个很好的理由让它以这种方式行事,尤其是在其他情况下,错误被推迟到执行时间。
当我创建一个引用丢失的存储过程的存储过程时:
CREATE PROCEDURE dbo.ExecuteMissingProcedure
AS
BEGIN
EXECUTE dbo.MissingProcedure;
END;
Run Code Online (Sandbox Code Playgroud)
SQL Server 打印警告而不是引发错误:
The module 'ExecuteMissingProcedure' depends on the missing object 'dbo.MissingProcedure'. The module will still be created; however, it cannot run successfully until the object exists.
Run Code Online (Sandbox Code Playgroud)
但是,当您尝试执行它时:
EXECUTE dbo.ExecuteMissingProcedure;
Run Code Online (Sandbox Code Playgroud)
SQL Server 引发了一个硬错误:
Msg 2812, Level 16, State 62, Procedure ExecuteMissingProcedure, Line 4
Could not find stored procedure 'dbo.MissingProcedure'.
Run Code Online (Sandbox Code Playgroud)
允许创建一些对象以促进延迟名称解析。假设是,如果您创建一个引用 的过程dbo.MissingProcedure,您将dbo.MissingProcedure在创建该过程的那一刻和第一次执行它之间创建一些时间。另一种有效的情况是一个还不存在的表。我可以说以下,即使dbo.table_name不存在:
CREATE PROCEDURE dbo.procedure_name
AS
BEGIN
SET NOCOUNT ON;
SELECT column_name FROM dbo.table_name;
END
Run Code Online (Sandbox Code Playgroud)
同样,因为在这种情况下,SQL Server 给了我怀疑的好处。但并非总是如此。如果dbo.table_name存在,但(尚未)包含名为 的列column_name,我将收到错误消息:
消息 207,级别 16,过程 procedure_name
列名“column_name”无效。
如果对象存在,SQL Server 会验证列名,就像它在您的情况下验证远程服务器对象一样 - 它不能这样做,因为登录名(还)没有权限。
现在,为什么要实现 SQL Server 以使其允许某些事情滑动而不是其他事情,您必须询问开发团队。Erland Sommarskog 有一些很棒的想法,让我们可以选择使行为更加一致;您应该阅读SET STRICT_CHECKS ON 的 Ideas并为他的 Connect 项目投票并发表评论。
| 归档时间: |
|
| 查看次数: |
8983 次 |
| 最近记录: |