【问题标题】:T-SQL to change owner to current user if database has no owner如果数据库没有所有者,T-SQL 将所有者更改为当前用户
【发布时间】:2021-10-29 18:51:01
【问题描述】:

只是想知道是否有一些 T-SQL 允许我将一个用户指定为 SQL Server 数据库的所有者(如果它还没有所有者)?

我们在客户设置中遇到以下错误:

无法作为数据库主体执行,因为主体“dbo”不存在,无法模拟此类主体,或者您没有权限

这是因为数据库没有指定的所有者。因此,我们希望获得一个脚本以集成到产品中,该脚本将检查是否有分配的所有者,如果没有,则运行如下内容:

EXEC sp_changedbowner [current]

【问题讨论】:

  • 这将列出数据库名称及其所有者 - 作为起点:SELECT name AS 'Database', suser_sname(owner_sid) AS 'Owner' FROM sys.databases;
  • @matt:我的回答解决了你的问题吗?

标签: sql-server permissions dbo


【解决方案1】:

您应该将所有者更改为'sa',而不是当前用户。

这将生成更改 TSQL 以执行您想要的操作:

SELECT
    sqltorun = 'ALTER AUTHORIZATION ON DATABASE::' + name + ' TO [sa];'
FROM    
    sys.databases d
WHERE
   (
    owner_sid IS NULL 
    OR SUSER_SNAME(owner_sid) != N'sa'
    OR owner_sid IN 
       (
          select sid
          from sys.database_principals 
          where type in ('G','S','U')
          and sid not in (select sid from sys.server_principals)
          and name not in ('guest')
       )
   )
   AND name IN ('Mydbname1', 'mydbname2');

您需要将其输出作为动态 SQL 执行。

注意:可能需要在数据库名称上使用QUOTE_NAME()

这是 SSMS 数据库属性表单检索数据库所有者的方式:

SELECT ISNULL(suser_sname(dtb.owner_sid),'''') AS [Owner],

【讨论】:

  • 这适用于更改授权,但 Where 语句的 (owner_sid IS NULL OR SUSER_SNAME(owner_sid) != N'sa') 失败。有问题的数据库似乎有一个以前的所有者,因为它们是从不同的服务器恢复的,所以 owner_sid 不为空并且 SUser_SNAME = sa,但是如果您转到 SQL 服务器中数据库的属性并转到文件选项卡然后所有者字段为空白(我已更新问题以显示我的意思)。有什么想法吗?
  • 运行该查询,它将返回“0x01”,但如果我右键单击该数据库并转到属性-> 文件-> 所有者字段为空白
  • 还是不行。该数据库的 owner_sid 仍为“0x01”,因此与您的查询不匹配。我不确定这是否是因为它已在一台服务器上备份并恢复到另一台服务器并且它删除了 SQL 中的链接,因为 owner_sid 是“0x01”但在 DB 的属性 -> 文件选项卡中所有者仍然是空白
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 2021-11-06
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多