【发布时间】: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