【问题标题】:VS2013 Database Project using SQL CLR - unresolved reference to object [servername\username] (the Database Owner)VS2013 Database Project using SQL CLR - unresolved reference to object [servername\username](数据库所有者)
【发布时间】:2015-06-02 09:19:19
【问题描述】:

我正在 VS2013 中开发一个包含 C# SQL CLR 存储过程的数据库项目。

程序集所有者是 [servername\User123]
数据库所有者也是 [servername\User123] (作为数据库所有者,该用户显然已经存在于服务器上。我通过注释掉我的 SQL CLR 过程中的代码并发布来管理数据库的成功发布,之后发生以下情况我取消注释掉该代码。)

如果我尝试在 VS 中构建项目,我会收到错误消息:

Error   1   SQL71501: Assembly: [DatabaseProject] has an unresolved reference to object [servername\User123].   

...引起:

CREATE ASSEMBLY [DatabaseProject] AUTHORIZATION [servername\User123]
FROM 0x4D5A90000300000004000000FFFF0000B8000etcetcetcetc
WITH PERMISSION_SET = EXTERNAL_ACCESS
GO

所以,如果在 VS 中我在 \Security 文件夹中添加一个创建用户脚本:

CREATE USER [servername\User123] FOR LOGIN [servername\User123] WITH DEFAULT_SCHEMA = dbo
GO
GRANT CONNECT TO [servername\User123]

然后我可以构建项目。

但是,如果我随后尝试发布数据库,则会收到错误消息:

Creating [servername\User123]...
(47,1): SQL72014: .Net SqlClient Data Provider: Msg 15063, Level 16, State 1, Line 1 The login already has an account under a different user name.
(47,0): SQL72045: Script execution error.  The executed script:
CREATE USER [servername\User123] FOR LOGIN [servername\User123];
An error occurred while the batch was being executed.

有没有“正确”的方法来做到这一点?

【问题讨论】:

    标签: sql-server visual-studio sqlclr


    【解决方案1】:

    这个问题是由于对 SQL Server 如何将数据库的“所有者”作为数据库“主体”处理的简单误解。 “数据库所有者”的概念以两种不同的方式出现:

    1. 作为数据库级用户,名称为dboprincipal_id1。现在,服务器级别的Login 映射到这个特定的User(即“主体”)只是sys.database_principalsSID 字段中的值的问题:

      SELECT sdp.*
      FROM   [sys].[database_principals] sdp
      WHERE  sdp.[principal_id] = 1;
      

      此字段将映射到sys.server_principals 中的SID 字段:

      SELECT sdp.*, '---' AS [---], ssp.*
      FROM   [sys].[database_principals] sdp
      INNER JOIN [sys].[server_principals] ssp
              ON ssp.[sid] = sdp.[sid]
      WHERE  sdp.[principal_id] = 1;
      

      注意sys.database_principals中的以下字段:

      • 类型
      • type_desc
      • authentication_type
      • authentication_type_desc

      查看您的数据库当前如何由 Windows 登录名拥有,立即运行上面的查询(第二个查询 - 包含两个表的查询)。接下来,将数据库更改为由sa 拥有。接下来,打开一个新的查询选项卡。最后,在这个新窗口中运行相同的查询(以便您可以轻松地比较“之前”和“之后”的结果),确保密切关注上面提到的 4 个字段以及 sid 字段。 (请注意,可以在没有 Login 的情况下创建 User,显然,这些不会显示在 JOIN 到 sys.server_principals 的查询中,但这个问题专门针对Logins)。

      从所有这些您应该看到,将 Login 指定为数据库的“所有者”不是,实际上,创建了一个 User 表示 Login:它只是更新了dbo User 的定义。因此,拥有该数据库的 Login 确实技术上 存在于该数据库中,但始终使用 dbo 的名称而不是其实际名称。这就是您收到以下错误的原因:

      登录已经有一个使用不同用户名的帐户。

    2. 作为数据库角色,可以将数据库中的任何用户添加到该角色中以获得这些权限。

    修复:

    • \Security 文件夹中删除您的 CREATE USER 脚本。
    • 请改用AUTHORIZATION [dbo]

    【讨论】:

      猜你喜欢
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 2015-01-07
      • 1970-01-01
      • 2022-12-02
      • 1970-01-01
      • 2022-10-04
      相关资源
      最近更新 更多