2011-06-10 41 views
2

有人送我一个数据库(通过.mdf.ldf文件),我附加在服务器上(没有错误,警告等),虽然我没有证据(因为我没有访问服务器数据库来自),它看起来主键(身份)值是不同于他们原来的。此外,它们似乎是“重置” - 所有主键值都从1开始,而基于外键引用,显然它是不正确的(例如,只有1行的表的主键值为1,但引用它的表引用值7)。为什么附加数据库时“身份”列值不正确?

虽然我并不在意,但我很好奇为什么会发生这种情况(如果有解释)?

我真正需要的是弄清楚是否有办法连接数据库并保留正确的值?

编辑: 据我所知,外键引用设置正确。

下面是一些截图: foreign key relationship foreign key relationship columns WTF!?

+0

我从未附加身份值更改的文件。我会怀疑一个没有正确设计用于数据完整性的数据库。在结构中是否设置了实际的外键?鉴于你所描述的我怀疑不是。 – HLGEM 2011-06-10 21:19:35

+0

@HLGEM确实存在外键关系的建立(正确,据我所知)。这是什么使得具有不正确的参考数据的情况变得混乱。我为这个问题添加了一些截图,请检查一下。 – 2011-06-10 21:43:35

回答

3

所有我能想到的,因为有FKs是他们有一个糟糕的设计开始,然后有人意识到他们neede FKs,但已经有不良数据,他们不希望删除,从而创建了FKs WITH NOCHECK

所有的孤儿记录早期的ID号码?

+0

似乎是合理的可能性,但不太可能,因为:有一个表具有语言选项(具有名为'LanguageID'的PK标识列),它只有1行;该行的'LanguageID'是'1'。在所有引用它的表中,行“LanguageID”都是“7”。 – 2011-06-10 21:56:48

+1

事实上,在“检查现有数据”选项中,问题中的屏幕截图选择了“否”。 – 2011-06-10 22:27:42

+0

@Martin对不起,我错过了。仍然没有真正解释数据库是如何从“据推测工作”变为无效数据而没有怀疑犯规,但俗话说,世界可能永远不会知道。 – 2011-06-10 22:39:25

1

附加数据库不会改变表的内容。您看到的值全部来自创建数据库的应用程序。 ``select’’ Isn’t Broken

+0

虽然我完全同意你的概念,但是应用程序与其他服务器上的此数据库完美协作。这导致我相信,当我附加数据库时,有人发生了奇怪的事情,有人在将数据库发送给我之前故意搞砸了数据库,或者我有错误的数据库 - 这些数据都不太可能。 – 2011-06-10 21:47:38

+0

如果你足够勇敢冒险进入未记录的特征,那么你可以使用'select ... from :: fn_dblog(null,null)'来分析这些身份值如何插入的日志历史记录,至少是存在的日志在你的数据库中。这将很快显示它是否发生在附件之前或之后。见http://www.sqlskills.com/blogs/paul/post/Search-Engine-QA-6-Using-fn_dblog-to-tell-if-a-transaction-is-contained-in-a-backup.aspx例如使用'fn_dblog' – 2011-06-10 21:50:44

+0

感谢您的想法。不幸的是,数据库是一个“简单”恢复模型,并没有提供太多的事务日志(只有43行)。当我做'select * from :: fn_dblog(null,null)'时,似乎没有任何行会有帮助(我会继续寻找)。我没有看到有明显改变数据的行,这仍然让我产生疑惑:如果数据库连接时数据没有改变,那么@#%(如果引用数据存在,那么这些FK如何存在?值不正确?! – 2011-06-10 22:08:52

相关问题