Как предоставить пользователю роль sys.admin в SQL через Entity Framework? - PullRequest
0 голосов
/ 22 октября 2018

Просто чтобы очистить ветер, я осознаю, что предоставление пользователям sysadmin в T-SQL не очень хорошая вещь, но в соответствии с требованиями клиента это необходимо сделать.

У меня есть это:

public void AddUserToServer(List<string> users, List<string> servers)
{
        foreach (var server in servers)
        {
            setConnection(server);

            foreach (var user in users)
            {
                string sql =
                    "USE [master]" +
                    " CREATE LOGIN" + " [TP1\\" + user + "] FROM WINDOWS WITH DEFAULT_DATABASE=[master], " +
                    "DEFAULT_LANGUAGE=[us_english] " +
                    "EXEC sys.sp_addsrvrolemember @loginame = N'TP1\\" + user + "', @rolename = N'sysadmin'";

                _dbContext.Database.ExecuteSqlCommand(sql);
            }
        }
}

Я получил вышеуказанный скрипт, создав пользователя вручную в ssms, а затем сгенерировал скрипт.Однако при запуске я получаю эту текущую ошибку:

'Процедура' sys.sp_addsrvrolemember 'не может быть выполнена внутри транзакции.

Поэтому я изменил ее на:

            string sql =
                "USE [master]" +
                " CREATE LOGIN" + " [TP1\\" + user + "] FROM WINDOWS WITH DEFAULT_DATABASE=[master], " +
                "DEFAULT_LANGUAGE=[us_english] " +
                "GRANT ADMINISTER BULK OPERATIONS TO[TP1\\" + user + "]";

Это создает пользователя НО Я не получаю роль системного администратора.

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 23 октября 2018

Настолько типично, что я потратил некоторое время на это и, наконец, после того, как сформулировал, я нашел ответ.

Я полагаю, что это вопрос, который задаст больше людей, поэтому я могу предоставить то, что нашел:

    string sql =
    "USE [master]" +
    " CREATE LOGIN" + " [TP1\\" + user + "] FROM WINDOWS WITH DEFAULT_DATABASE=[master], " +
    "DEFAULT_LANGUAGE=[us_english] " +
     "EXEC sys.sp_addsrvrolemember @loginame = N'TP1\\" + user + "', @rolename = N'sysadmin'";


    _dbContext.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, sql);

ПРИМЕЧАНИЕ:

TransactionalBehavior.DoNotEnsureTransaction

Начиная сEF6 Database.ExecuteSqlCommand () по умолчанию будет переносить команду в транзакцию, если она еще не присутствовала.Существуют перегрузки этого метода, которые позволяют вам переопределить это поведение, если хотите.Также в EF6 выполнение хранимых процедур, включенных в модель через API, такие как ObjectContext.ExecuteFunction (), делает то же самое (за исключением того, что поведение по умолчанию не может быть переопределено в данный момент).

Найден ответ здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...