首页 > 解决方案 > 如何使用 SMO 转移 dbo 权限

问题描述

我有以下代码

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架构上的权限没有转移或如何manually通过 SMO 转移它们?

标签: c#sql-serversmo

解决方案


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

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

targetDatabase.SetOwner("sa");

推荐阅读