c# - 如何使用 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 转移它们?
解决方案
除非我误解了,否则您的问题是 dbo 模式(登录名)将设置为连接字符串中的登录名,而您希望将其设置为其他内容?
你可以很简单地做到这一点。例如,如果您希望所有者成为 sa 登录名:
targetDatabase.SetOwner("sa");
推荐阅读
- android - 为什么不调用 onActivityReenter?
- cordova - 科尔多瓦插件背景下载未安装最新版本
- angular - 无法读取 Object.eval [as updateRenderer] 处未定义的属性“标题”
- python - 如何将 EXIF/其他元数据插入存储在内存缓冲区中的 JPEG 中?
- inno-setup - 从注册表中检索组合框的值,并通过覆盖安装程序第二次运行的默认值来填充它
- php - 通过电子邮件更改 MySQL 值
- c++ - 使程序从头开始的循环
- php - php 内爆代码不起作用 代码丢失
- spring - Spring:双向 OneToMany/ManyToOne 关系中的 AnnotationException
- excel - 很少有细胞没有得到适当的保护,为什么?