【问题标题】:foreign keys on table from different database来自不同数据库的表上的外键
【发布时间】:2009-09-14 23:07:14
【问题描述】:

我在 SQL Server 中有两个数据库,两个数据库都有一个公用表,一个重要的大表保存其他表的外键。问题是表在 DatabaseA 中,我需要从 DatabaseB 将外键引用到该表。

我知道 SQL 不支持跨数据库引用完整性,那么实现这一点的最佳方法是什么?我正在考虑将两个数据库组合成一个数据库——除了增加复杂性之外,这并不重要。

有什么建议吗?

【问题讨论】:

  • 很确定答案是否定的,因为外键只能引用本地表,不能引用从另一个数据库链接的表。见stackoverflow.com/questions/442587/…
  • 好的,那我想我会合并两个数据库...我知道我们可以使用 select into 来复制表,但是有没有办法复制包括关系和键?

标签: sql sql-server sql-server-2005 tsql


【解决方案1】:

如果可以的话,我会避免这样做 - 你能把两张表都保存在一个数据库中并使用 FK 吗?

父表和子表位于不同的数据库中。

尽管在这种情况下您不能使用外键,但有一些变通方法——您可以使用触发器或包裹在检查约束中的 UDF。无论哪种方式,您的数据完整性都不是完全无懈可击的:如果您的父表所在的数据库崩溃并且您从备份中恢复它,您可能很容易以孤儿告终。

父子关系由触发器强制执行。

触发器不触发的情况有很多,例如:

· 一个表被删除。

· 表被截断。

· 嵌套和/或递归触发器的设置可防止触发器触发。

触发器也可能不正确。无论哪种方式,您的数据库中都可能会出现孤儿。

【讨论】:

  • 现在我遇到了一个新问题,我试图合并数据库,但我不得不更改一些列来创建外键引用 ..ex:tableA columna(外键)和 TableB columnb(主键)但它们的大小不同 ColumnA 是 varchar(255) 而 columnB 是 varchar(55) 所以要链接这两列我必须使它们的类型和大小相同..当我发出 alter columnA 将其更改为 varchar(55)我收到一些错误,某些对象依赖于列并且无法更改???
【解决方案2】:

这是一篇关于如何使用 SSIS 导入/导出向导的文章:

http://www.databasejournal.com/features/mssql/article.php/3580216/SQL-Server-2005-Import--Export-Wizard.htm

执行此操作的最简单方法是将一个数据库(我会使用两者中最小的一个)导出为最方便的格式,然后将其导入另一个。只要表名都不同,这不应该存在任何问题。

【讨论】:

    【解决方案3】:

    可以编写触发器来强制针对不同数据库的引用完整性。

    【讨论】:

      猜你喜欢
      • 2013-10-25
      • 2012-03-26
      • 1970-01-01
      • 2014-07-10
      • 2012-01-03
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      相关资源
      最近更新 更多