SQL 服务器管理对象 (SMO) - user.Error 在生产服务器上登录失败
SQL Server Management Objects (SMO) - Login failed for user.Error on production server
我编写了一个代码,可以在单击按钮时备份数据库(生成 Sql 脚本),此代码 在本地主机上工作正常 ,但是当我部署时这对生产我得到以下错误。
Login failed for user 'XXXXXX\IWPD_1257(XXXXX)'
堆栈跟踪的一部分是
[ConnectionFailureException: Failed to connect to server ..]
Microsoft.SqlServer.Management.Smo.DatabaseCollection.get_Item(String name) +370
LeadWeb.Backup.scriptTables() +232
LeadWeb.Backup.btnsubmit_OnClick(Object sender, EventArgs e) +5
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9628114
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +103
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724
这是我的代码
public void scriptTables()
{
try
{
string folder = HttpContext.Current.Server.MapPath("~/Excels/data.sql");// I have this file
System.IO.File.WriteAllText(folder, string.Empty);
Server myServer = new Server(ConfigurationManager.AppSettings["server"]);
Database CMSDB = myServer.Databases[ConfigurationManager.AppSettings["Database"]];
Scripter script = new Scripter(myServer);
ScriptingOptions so = new ScriptingOptions();
so.AnsiPadding = true;
so.IncludeHeaders = true;
so.Default = true;
so.DriForeignKeys = true;
so.DriPrimaryKey = true;
so.DriUniqueKeys = true;
so.ScriptData = true;
so.ScriptSchema = true;
so.ScriptDrops = false;
StringBuilder ss = new StringBuilder();
foreach (Table table in CMSDB.Tables)
{
string tables = table.Name;
string filename = folder;
so.FileName = filename;
so.AppendToFile = true;
CMSDB.Tables[tables].EnumScript(so);
}
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.AddHeader("Content-Disposition",
"attachment; filename=" + "LeadBackup" + DateTime.Now.Date.ToString("d") + ".sql");
HttpContext.Current.Response.AddHeader("Content-Length", folder.Length.ToString());
HttpContext.Current.Response.ContentType = "text/plain";
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.TransmitFile(folder);
HttpContext.Current.Response.End();
}
catch (Exception e)
{
Response.Write(e.Message);
}
Webconfig 值
<add key="Server" value="." /> // changes according to server
<add key="Database" value="Lead" /> // changes according to Database
任何帮助或指导。?
我的猜测是您的数据库连接字符串正在使用集成安全性,并且 XXXXXX\IWPD_1257(XXXXX) 未配置为访问数据库服务器 and/or 数据库。
在 SSMS 中,转到安全 > 登录并确定有权访问服务器的 windows 组。在活动目录中,将 XXXXXX\IWPD_1257(XXXXX) 添加到这些组之一。
或者,您可以直接添加 XXXXXX\IWPD_1257(XXXXX) 作为登录名。
无论采用哪种方法,请确保组或用户也已添加到数据库安全性中,并被授予访问所需角色的权限,以便从您需要的表中进行查询。
正如@jim 所说的那样,这是身份验证问题,我没有提供 SQL 服务器的登录 ID 和密码,经过一些研究我能够设法做到这一点,我正在发布代码未来 reference.Hope 它会对某人有所帮助 :)
public void scriptTables()
{
try
{
string folder = HttpContext.Current.Server.MapPath("~/Excels/data.sql");// I have this file
System.IO.File.WriteAllText(folder, string.Empty);
ServerConnection serverConnection = new ServerConnection();
serverConnection.LoginSecure = false;
serverConnection.ServerInstance = ConfigurationManager.AppSettings["Server"];
serverConnection.Login = ConfigurationManager.AppSettings["SmoUser"];
serverConnection.Password = ConfigurationManager.AppSettings["SmoPass"];
serverConnection.DatabaseName = ConfigurationManager.AppSettings["Database"];
Server myServer = new Server(serverConnection);
Database CMSDB = myServer.Databases[ConfigurationManager.AppSettings["Database"]];
Scripter script = new Scripter(myServer);
ScriptingOptions so = new ScriptingOptions();
so.AnsiPadding = true;
so.IncludeHeaders = true;
so.Default = true;
so.DriForeignKeys = true;
so.DriPrimaryKey = true;
so.DriUniqueKeys = true;
so.ScriptData = true;
so.ScriptSchema = true;
so.ScriptDrops = false;
script.Options = so;
StringBuilder ss = new StringBuilder();
foreach (Table table in CMSDB.Tables)
{
string tables = table.Name;
foreach (string s in script.EnumScript(new Urn[] { table.Urn }))
ss.Append(s);
}
System.IO.File.WriteAllText(folder, ss.ToString());
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.AddHeader("Content-Disposition",
"attachment; filename=" + "LeadBackup" + DateTime.Now.Date.ToString("d") + ".sql");
HttpContext.Current.Response.AddHeader("Content-Length", folder.Length.ToString());
HttpContext.Current.Response.ContentType = "text/plain";
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.TransmitFile(folder);
HttpContext.Current.Response.End();
}
catch (Exception e)
{
Response.Write(e.Message);
}
}
我编写了一个代码,可以在单击按钮时备份数据库(生成 Sql 脚本),此代码 在本地主机上工作正常 ,但是当我部署时这对生产我得到以下错误。
Login failed for user 'XXXXXX\IWPD_1257(XXXXX)'
堆栈跟踪的一部分是
[ConnectionFailureException: Failed to connect to server ..]
Microsoft.SqlServer.Management.Smo.DatabaseCollection.get_Item(String name) +370
LeadWeb.Backup.scriptTables() +232
LeadWeb.Backup.btnsubmit_OnClick(Object sender, EventArgs e) +5
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9628114
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +103
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724
这是我的代码
public void scriptTables()
{
try
{
string folder = HttpContext.Current.Server.MapPath("~/Excels/data.sql");// I have this file
System.IO.File.WriteAllText(folder, string.Empty);
Server myServer = new Server(ConfigurationManager.AppSettings["server"]);
Database CMSDB = myServer.Databases[ConfigurationManager.AppSettings["Database"]];
Scripter script = new Scripter(myServer);
ScriptingOptions so = new ScriptingOptions();
so.AnsiPadding = true;
so.IncludeHeaders = true;
so.Default = true;
so.DriForeignKeys = true;
so.DriPrimaryKey = true;
so.DriUniqueKeys = true;
so.ScriptData = true;
so.ScriptSchema = true;
so.ScriptDrops = false;
StringBuilder ss = new StringBuilder();
foreach (Table table in CMSDB.Tables)
{
string tables = table.Name;
string filename = folder;
so.FileName = filename;
so.AppendToFile = true;
CMSDB.Tables[tables].EnumScript(so);
}
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.AddHeader("Content-Disposition",
"attachment; filename=" + "LeadBackup" + DateTime.Now.Date.ToString("d") + ".sql");
HttpContext.Current.Response.AddHeader("Content-Length", folder.Length.ToString());
HttpContext.Current.Response.ContentType = "text/plain";
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.TransmitFile(folder);
HttpContext.Current.Response.End();
}
catch (Exception e)
{
Response.Write(e.Message);
}
Webconfig 值
<add key="Server" value="." /> // changes according to server
<add key="Database" value="Lead" /> // changes according to Database
任何帮助或指导。?
我的猜测是您的数据库连接字符串正在使用集成安全性,并且 XXXXXX\IWPD_1257(XXXXX) 未配置为访问数据库服务器 and/or 数据库。
在 SSMS 中,转到安全 > 登录并确定有权访问服务器的 windows 组。在活动目录中,将 XXXXXX\IWPD_1257(XXXXX) 添加到这些组之一。
或者,您可以直接添加 XXXXXX\IWPD_1257(XXXXX) 作为登录名。
无论采用哪种方法,请确保组或用户也已添加到数据库安全性中,并被授予访问所需角色的权限,以便从您需要的表中进行查询。
正如@jim 所说的那样,这是身份验证问题,我没有提供 SQL 服务器的登录 ID 和密码,经过一些研究我能够设法做到这一点,我正在发布代码未来 reference.Hope 它会对某人有所帮助 :)
public void scriptTables()
{
try
{
string folder = HttpContext.Current.Server.MapPath("~/Excels/data.sql");// I have this file
System.IO.File.WriteAllText(folder, string.Empty);
ServerConnection serverConnection = new ServerConnection();
serverConnection.LoginSecure = false;
serverConnection.ServerInstance = ConfigurationManager.AppSettings["Server"];
serverConnection.Login = ConfigurationManager.AppSettings["SmoUser"];
serverConnection.Password = ConfigurationManager.AppSettings["SmoPass"];
serverConnection.DatabaseName = ConfigurationManager.AppSettings["Database"];
Server myServer = new Server(serverConnection);
Database CMSDB = myServer.Databases[ConfigurationManager.AppSettings["Database"]];
Scripter script = new Scripter(myServer);
ScriptingOptions so = new ScriptingOptions();
so.AnsiPadding = true;
so.IncludeHeaders = true;
so.Default = true;
so.DriForeignKeys = true;
so.DriPrimaryKey = true;
so.DriUniqueKeys = true;
so.ScriptData = true;
so.ScriptSchema = true;
so.ScriptDrops = false;
script.Options = so;
StringBuilder ss = new StringBuilder();
foreach (Table table in CMSDB.Tables)
{
string tables = table.Name;
foreach (string s in script.EnumScript(new Urn[] { table.Urn }))
ss.Append(s);
}
System.IO.File.WriteAllText(folder, ss.ToString());
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.AddHeader("Content-Disposition",
"attachment; filename=" + "LeadBackup" + DateTime.Now.Date.ToString("d") + ".sql");
HttpContext.Current.Response.AddHeader("Content-Length", folder.Length.ToString());
HttpContext.Current.Response.ContentType = "text/plain";
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.TransmitFile(folder);
HttpContext.Current.Response.End();
}
catch (Exception e)
{
Response.Write(e.Message);
}
}