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

时间:2016-12-15 14:33:48

标签: c# asp.net sql-server asp.net-mvc amazon-web-services

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

现在,生产.edmx文件的模型浏览器在存储过程/函数下没有显示任何内容,即使复杂类型和函数导入仍然存在,也找不到要导入的存储过程或更新。这是在将Web.config连接字符串指向生产数据库服务器之后,包括id和密码,并且已通过Server Explorer成功添加和测试了数据连接。还有一个SQLException Login failed for user 'databaseuser'.,其中每当测试生产应用程序时,databaseuser都是Web.config连接字符串中的id。

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

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文件中的模型浏览器现在显示存储过程。 &#34;数据库用户&#34;拥有WorkDatabase的读写权限,但在Securables下没有dbo Schema。

编辑2

这里有一点Stack Trace:

[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

编辑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

编辑4

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

3 个答案:

答案 0 :(得分:0)

我已经看到过这个问题,prod数据库对存储过程有更多限制性权限。我的用户可以执行它们,但不能查看&#39;他们。

答案 1 :(得分:0)

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

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

  1. 存储在master数据库的syslogins中的sql登录:SELECT * FROM master.sys.syslogins
  2. 要从主数据库中的登录名创建的特定数据库上的sql用户:SELECT * FROM DatabaseName.sys.sysusers(该查询在返回正确的“用户”方面可能不是100%准确,但如果您拥有该数据库中的用户,它肯定会出现在该查询中)
  3. MSDN on creating a user

    根据您发布的错误消息,听起来好像主数据库中的Sql登录不存在。使用SSMS或Server Explorer,您应该能够扩展sql实例上的“security&gt; logins”文件夹,并查看所有存在的登录信息。如果连接字符串中的userId未出现在该列表中,则您将无法连接到数据库。

    您可能还需要在数据库中创建要查询的用户。我忘记了这两个案例的错误是否有相同的措辞。您应该可以通过转到“DatabaseName&gt; Security&gt; Users”来检查SSMS或Server explorer。

    创建用户和登录后,您可能会收到有关权限或拒绝访问权限或其他内容的其他错误。在这种情况下,您创建的数据库用户在该数据库中没有足够的角色来查询该表。在这种情况下,您需要确定添加用户所需的角色,以便它可以进行查询。这可能因数据库而异。

答案 2 :(得分:0)

我不确定为什么会这样,但是这显然解决了这个问题:我删除了“databaseuser”的Web.config凭据,仅具有读/写访问权限,并将其替换为数据库管理凭据。应用程序测试成功。然后,管理员凭据被原始的“databaseuser”凭据替换,一切正常。似乎由于某种原因,应用程序需要管理员第一次访问连接,然后读/写用户也可以这样做。

感谢大家的回答。他们都是正确的并且正在完成,但由于某种原因,程序需要管理员首先显示它。