将数据库服务器连接到克隆生产版本

问题描述:

我正在使用Visual Studio在C#中创建我的第一个ASP.net应用程序,并且我有一个工作的开发版本。创建单独的生产数据库后,我使用Windows资源管理器复制整个开发项目文件夹。生产版本中生产文件夹名称和.sln文件名称均已更改。将数据库服务器连接到克隆生产版本

尽管复杂类型和函数导入仍然存在,并且没有找到任何存储过程可以导入或更新,但现在生成.edmx文件的模型浏览器在“存储过程/函数”下不显示任何内容。这是在Web.config连接字符串已被指向生产数据库服务器(包括标识和密码)之后,并且已通过服务器浏览器成功添加并测试了数据连接。还有一个SQLException Login failed for user 'databaseuser'.,其中databaseuser是Web.config连接字符串中的标识,只要测试生产应用程序。

有谁知道如何将复制的生产项目连接到数据库服务器?提前谢谢了!

Web.config文件的连接字符串:

<connectionStrings> 
    <add name="DefaultConnection" providerName="System.Data.SqlClient" 
     connectionString="Server=[production server];Database=UserDatabase; 
     User ID=databaseuser;Password=[production password];Trusted_Connection=False; 
     Connection Timeout=30;" /> 
    <add name="WorkDatabaseEntities" connectionString="metadata=[metadata copied from 
     working development version];provider=System.Data.SqlClient; 
     provider connection string=&quot;data source=[production server]; 
     initial catalog=WorkDatabase;integrated security=False;user id=databaseuser; 
     password=[production password];multipleactiveresultsets=True; 
     application name=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
    <add name="UserDatabaseEntities" connectionString="metadata=[metadata copied from 
     working development version];provider=System.Data.SqlClient;provider 
     connection string=&quot;data source=[production server]; 
     initial catalog=UserDatabase;integrated security=False;user id=databaseuser; 
     password=[production password];connect timeout=30;MultipleActiveResultSets=True; 
     App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
</connectionStrings> 

编辑1

.edmx文件现在显示存储过程的模型浏览器。 “数据库用户”在WorkDatabase上具有读取和写入权限,但在“安全”下没有dbo Schema。

编辑2

这里的一个位的堆栈跟踪:

[SqlException (0x80131904): Login failed for user 'databaseuser'.] 
    System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) +347 
    System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) +78 
    System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) +191 
    System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) +154 
    System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) +21 
    System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry) +141 
    System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) +362 
    System.Data.SqlClient.SqlConnection.Open() +96 

EDIT 3

堆栈跟踪似乎两个不同迹线之间的交替。这是什么意思?

[SqlException (0x80131904): Login failed for user 'databaseuser'.] 
    System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling) +970 
    System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) +802 
    System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) +38 
    System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) +682 
    System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) +89 
    System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) +426 
    System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) +78 
    System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) +191 
    System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) +154 
    System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) +21 
    System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry) +141 
    System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) +362 
    System.Data.SqlClient.SqlConnection.Open() +96 

EDIT 4

服务器被托管在AWS。也许这是AWS特有的东西?

+0

你有禁止从本地机器访问 – Saravanan

+0

感谢您的答复生产数据库的任何数据库服务器的防火墙规则!我不相信有任何防火墙问题。 – jle

+0

如果克隆的数据库和项目不会有任何进口..你只需要改变连接字符串以指向生产或开发,你应该是好去..假设它们是克隆 – JamieD77

我不知道为什么这个工作,但这里是显然治愈的问题:我删除的Web.config凭据“databaseuser”,只有读/写访问,并与数据库管理员凭据替换它们。应用程序测试成功。管理员凭证随后被替换为原始的“数据库用户”证书,并且一切正常。这似乎是由于某种原因,应用程序需要管理员第一次访问连接,然后读/写用户可以做同样的事情。

谢谢大家的答案。他们都是正确的,正在完成,但由于某种原因,该计划需要管理员首先显示它的方式。

我见过这个问题,prod数据库对存储的特效具有更多的限制权限。我的用户可以执行它们,但不能“看到”它们。

听起来好像您尚未为尝试使用生产数据库登录的用户设置适当的SQL权限。

“登录”并查询sql server数据库需要两件事。

  1. 存储在主数据库中的syslogins SQL登录:SELECT * FROM master.sys.syslogins
  2. 要查询从主数据库的登录创建的特定数据库的SQL用户:SELECT * FROM DatabaseName.sys.sysusers(该查询可能不是100%准确返回正确的“用户”的条款,但如果你有在该数据库中的用户,肯定会在查询中显示)根据ER

MSDN on creating a user

您发布的ror消息,听起来像主数据库中的Sql登录不存在。使用SSMS或服务器资源管理器,您应该能够在sql实例上展开“安全>登录”文件夹并查看所有存在的登录。如果连接字符串中的userId没有出现在该列表中,那么您将无法连接到数据库。

你也可能只需要创建在您要查询数据库的用户。我忘了,如果这种错误在两种情况下都有相同的措词。您应该可以通过转到“DatabaseName> Security> Users”来检查SSMS或Server Explorer。

一旦用户登录和创建,你可能会得到不同的错误说着有关权限,或者访问被拒绝或东西。在这种情况下,你已经创建了数据库用户,没有在该数据库中的足够作用查询表。在这种情况下,您需要确定将用户添加到哪个角色以便查询。这可能因数据库而异。

+0

感谢您的回应!在项目查询的两个数据库中创建并分配数据库用户的读/写公共访问权限。走出我没有创建的测试服务器,数据库用户在Securables中为一个数据库分配一个dbo Schema,但不是管理用户的那个。用户是否需要在其他数据库中使用相同的Securables设置? – jle

+0

用户是在两个数据库中创建的,但主数据库中的sql登录怎么办? – Sam

+0

我相信它在那里。它在服务器级别的安全性文件夹中创建并分配给两个必需的数据库。现在可以访问其中一个数据库,但用户数据库不能。 – jle