#c# #sql-server #smo
#c# #sql-сервер #smo
Вопрос:
У меня есть следующий код
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" amp;amp; 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?
Комментарии:
1. Вы пробовали использовать PreserveDbo = true?
2. Да, я пробовал, я не уверен, что делает этот параметр, но
dbo
разрешения схемы по-прежнему отсутствуют. Я добавил дополнительную информацию к своему вопросу.
Ответ №1:
Если я не понял неправильно, ваша проблема заключается в том, что схема dbo (имя входа) будет установлена на логин в вашей строке подключения, и вы хотите, чтобы она была установлена на что-то другое?
Вы можете сделать это довольно просто. Например, если вы хотите, чтобы владельцем был логин sa:
targetDatabase.SetOwner("sa");
Комментарии:
1. Привет, Джон, я обновил свой вопрос примером.