【问题标题】:Connecting Database Server to Cloned Production Version将数据库服务器连接到克隆的生产版本
【发布时间】:2016-12-15 14:33:47
【问题描述】:

我正在使用 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 文件中的模型浏览器现在显示存储过程。 “databaseuser”对 WorkDatabase 具有读写权限,但在 Securables 下没有 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

编辑 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 特有的东西?

【问题讨论】:

  • 你有没有禁止本地机器访问生产数据库的数据库服务器防火墙规则
  • 感谢您的回复!我认为没有任何防火墙问题。
  • 如果您克隆了数据库和项目,则没有任何要导入的内容。您只需将连接字符串更改为指向生产或开发,您就可以开始了。假设它们是克隆
  • @JamieD77 - 没有要导入的新存储过程,但存储过程甚至没有出现在“.edmx”文件中。另外,无论何时测试生产版本,即使服务器资源管理器说服务器已连接,也会出现 SQLException。
  • 连接可能没有问题,如果它在ssms中连接,它应该在VS中工作。顺便说一句,可以尝试重新启动 VS 并清除临时 asp.net 文件。也许我们在 VS2013 中注意到的 VS 缓存问题

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    MSDN on creating a user

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

    您可能还需要在要查询的数据库中创建用户。我忘记了该错误在两种情况下是否具有相同的措辞。您应该能够通过 SSMS 或服务器资源管理器进行检查,方法是转到“DatabaseName > Security > Users”进行检查。

    创建用户和登录名后,您可能会收到一个不同的错误,说明有关权限、访问被拒绝或其他内容。在这种情况下,您创建的数据库用户 在该数据库中没有足够的角色 来查询表。在这种情况下,您需要弄清楚需要将用户添加到哪个角色,以便它可以查询。这可能因数据库而异。

    【讨论】:

    • 感谢您的回复!数据库用户在项目查询的两个数据库中创建并分配了读/写公共访问权限。离开我没有创建的测试服务器,在 Securables 中为数据库用户分配了一个 dbo 模式,用于一个数据库,而不是管理用户的那个。用户是否需要其他数据库中的相同 Securables 设置?
    • 两个数据库都创建了用户,但是master数据库的sql登录呢?
    • 我相信它就在那里。它是在服务器级别的 Security 文件夹中创建的,并分配给两个必要的数据库。现在可以访问其中一个数据库,但不能访问用户数据库。
    • 您得到的每个数据库的确切错误消息是什么?
    • 可以访问Securables中定义了dbo Schema的数据库,所以每个数据库都没有错误。用户数据库的错误是“用户 'databaseuser' 登录失败。”
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-14
      • 2018-12-17
      • 2016-12-31
      • 2013-07-11
      • 1970-01-01
      • 2011-06-18
      • 2015-08-06
      • 2015-09-16
      相关资源
      最近更新 更多