我被难住了。我在虚拟专用服务器上有一个客户端站点 - Windows Web Server 2008 SP2、IIS7、SQL Server 2008 Express。
我正在尝试设置第二个 Web 应用程序,以便他在更新上线之前查看更新。我在 IIS7 中创建了 Web 应用程序,并向 SQL Server 添加了第二个数据库。第二个数据库本质上是生产数据库的副本,数据库名称以“DEV”为前缀,并在几个表中添加了一些新字段。
我的生产站点运行良好。但是,测试站点返回了 SqlException:“无效的列名‘version’”。这是新字段之一 - 这让我相信我的开发站点指的是生产数据库,而不是开发数据库。但是,连接字符串确实指向不同的数据库(尽管两者的登录名相同):
- 生产站点:“Server=.\SQLExpress;Database=myDbName;User ID=myUserName;Password=myUserPassword;”
- 开发站点:“服务器=.\SQLExpress;数据库=DEVmyDbName;用户ID=myUserName;密码=myUserPassword;”
看来这应该是我忽略的明显的东西。一位同事建议我为第二个 IIS 应用程序创建另一个应用程序池,但似乎没有帮助。
更新,经过进一步测试:
我将开发站点的连接字符串更改为
"Server=.\SQLExpress;Database=DEVmyDbName;User ID=devuser;Password=myNewDifferentPassword;"
并在数据库上创建了一个新的 SQL 服务器登录名,并只授予它对 dev 数据库的访问权限。我还将 dev 数据库设置为帐户的默认数据库。我从生产登录名中删除了对 dev 数据库的访问权限。当我尝试登录网站时,出现以下错误:
- 服务器主体“devuser”无法在当前安全上下文中访问数据库“myDbName”。
因此,有两件事我可以肯定:
- 由于它使用新的用户名登录,我知道该应用程序正在使用我提供给它的连接字符串;
- 由于某种原因,一旦登录,它似乎会忽略指定的数据库并尝试使用生产数据库。
仍然困惑。
答案1
经过进一步挖掘,我找到了罪魁祸首 - 这是一个应用程序问题,与 NHibernate 的配置有关。设置的 NHibernate 配置选项之一是“default_schema” - 当我删除它时,应用程序开始连接到正确的数据库。
看起来 default_schema 属性正在覆盖连接字符串中指定的任何数据库。
答案2
听起来您有多个连接字符串;是否有可能在应用程序中的某个地方存储一个连接字符串?
仅在开发系统上创建一个新的用户 ID/密码,更改您的开发连接字符串以使用它,如果它连接,则问题出在其他地方。
如果您有权访问 SQL 的完整版本,则可以针对 SQLExpress 实例运行 Profiler,并监视活动。