如何通过实体框架在SQL中授予用户sys.admin角色?

时间:2018-10-22 20:48:17

标签: c# sql entity-framework

只是为了消除风气,我知道在T-SQL中授予用户sysadmin并不是一件好事,而是需要根据客户要求完成。

我有这个:

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 + "]";

这将创建用户我没有sysadmin角色。

我该如何解决?

1 个答案:

答案 0 :(得分:1)

如此典型,以至于我花了一些时间在定位之后终于找到答案。

我相信这是更多人会问的问题,所以我可以提供我发现的内容:

    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中执行存储过程中包含的   通过诸如ObjectContext.ExecuteFunction()之类的API进行建模   相同(除了默认行为目前无法   覆盖)。

找到了答案here

相关问题