Как передать разрешения dbo с помощью SMO

#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. Привет, Джон, я обновил свой вопрос примером.