只是为了消除风气,我知道在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角色。
我该如何解决?
答案 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