【问题标题】:How to transfer dbo permissions with SMO如何使用 SMO 转移 dbo 权限
【发布时间】:2020-12-08 16:49:28
【问题描述】:

我有以下代码

Transfer transfer = new Transfer(sourceDatabase)
{
    DestinationServer = targetServer.Name,
    DestinationDatabase = targetDatabase.Name,

    CopyAllObjects = true,
    CopyData = true,

    Options =
    {
        DriAll = true,
        Permissions = true, // will not transfer dbo schema permissions :/
        WithDependencies = true,
        IncludeDatabaseRoleMemberships = true,
    },
    PreserveDbo = true,
    DropDestinationObjectsFirst = true
};

transfer.TransferData();

转移工作正常,但我有一个问题,权限已转移,但不适用于 dbo 架构。

我也尝试设置transfer.Options.AllowSystemObjects = true,但没有任何帮助。

我不知道为什么,所以我尝试手动复制它们

//  Grantor is db_owner
var databaseOwnerRole = targetDatabase.Roles["db_owner"];

// Grant dbo permissions
foreach (DatabaseRole role in sourceDatabase.Roles)
{
    // foreach (ObjectPermissionInfo permission in role.EnumObjectPermissions()) // returns null !
    foreach (ObjectPermissionInfo permission in sourceDatabase.EnumObjectPermissions(role.Name))
    {
        if (permission.ObjectSchema == "dbo" && permission.Grantee != "public")
        {
            // <targetObject?>.Grant(permission.PermissionType, permission.Grantee);
            // databaseOwnerRole.Grant(permission.PermissionType, permission.Grantee);
        }
    }
}

但我不知道Grant 命令的正确语法是什么,我是授予某些对象(例如表)的角色权限还是授予特定对象的权限。

databaseOwnerRole.Grant 不起作用 (grant failed) 并且对于授予特定对象的权限,如果我只知道名称,我不知道如何检索该对象(为每个权限迭代所有数据库对象似乎一个坏主意)。

问题示例:

源数据库角色

传输完成后的目标数据库角色(dbo 架构上的权限缺失)

但在另一个角色上,特定dbo 表的权限设置是可以的。

您有什么想法,为什么dbo 架构上的权限没有转移或如何通过 SMO 转移它们manually

【问题讨论】:

  • 你试过 PreserveDbo = true 吗?
  • 是的,我试过了,我不确定该选项的作用,但仍然缺少 dbo 架构权限。我在我的问题中添加了其他信息。

标签: c# sql-server smo


【解决方案1】:

除非我有误解,否则您的问题是 dbo 架构(登录名)将设置为连接字符串中的登录名,而您希望将其设置为其他内容?

你可以很简单地做到这一点。例如,如果您希望 owner 成为 sa 登录名:

targetDatabase.SetOwner("sa");

【讨论】:

  • 嗨,约翰,我用一个例子更新了我的问题。