【问题标题】:How to have a "master-structure" database with "children-data" databases in SQL SERVER 2005?如何在 SQL SERVER 2005 中拥有一个带有“子数据”数据库的“主结构”数据库?
【发布时间】:2009-06-03 20:24:20
【问题描述】:

我一直在谷歌上搜索,但我找不到它是否存在,或者我要求一些魔法 =P

好的,这就是交易。

我需要有一种方法来创建一个“主结构”数据库,它只包含模式、结构、表、存储过程、udfs 等,除了 SQL SERVER 2005 中的真实数据之外的所有内容(如果在2008 年告诉我,我可以尝试说服我的客户为此付费 =P)

然后我想拥有几个实现这些模式、表等的主数据库的“孩子”,但每个人都有不同的数据。

所以当我需要创建一个新的存储过程或类似的东西时,我只需在主数据库上创建它(当然它在它的子数据库上可用)。

实际上,我有几个具有相同架构和不同数据的不同数据库。但问题是要保持它们之间的一致性。每次我创建一个脚本来创建一些 SP 或添加一些索引或其他什么时,我都必须在每个数据库中执行它,有时我可能会错过一个 =P

假设您有一个 UNIVERSE(将是主数据库)并且该 Universe 有空间(每个空间都由一个子数据库表示)。所以我正在处理的应用程序需要动态“克隆”空间。为此,我们必须创建一个新数据库。现在,我正在创建正在克隆的数据库的备份,将其还原为新数据库并截断表。 我希望能够创建“主”数据库的新“子”,它将维护模式和所有内容,但将从空数据开始。

希望很清楚...我的英语不完美,对此表示抱歉 =P 谢谢大家!

【问题讨论】:

    标签: sql-server sql-server-2005 database-design database-cloning


    【解决方案1】:

    您真正需要的是对数据库架构进行版本控制。

    do-you-source-control-your-databases

    如果您使用 SQL Server,我会推荐 dbGhost - 不贵,而且做得很好:

    • 同步 2 个数据库
    • 区分 2 个数据库
    • 从一组脚本创建数据库(我会推荐这个版本)。
    • 批量支持,因此您可以使用单个批次升级所有数据库

    您可以将此基础架构用于两者:

    • 滚动开发版本以测试、集成和生产系统
    • 将您的“更新”系统滚动到多个生产部署(尤其是在托管环境中)

    【讨论】:

      【解决方案2】:

      我会将我的更改写成 sql 文件,并通过批处理文件使用 OSQL 或 SQLCMD,以确保我在所有数据库上重复执行而不考虑它。

      作为替代方案,我会使用 VisualStudio Database Pro 工具或 RedGate SQL 比较工具来比较和传播更改。

      【讨论】:

        【解决方案3】:

        有一些问题,但处理这个问题的主流方法仍然是使用源代码控制(以及所有其他附带的好处。)而且 SQL Server 越来越友好 SCC。

        此外,对于许多(最强大的)网站来说,这是每个服务器的问题,也是每个数据库的问题。

        【讨论】:

        • 您能否进一步解释一下?谢谢!
        • 当然。以我的经验,安装和升级都是经过彻底测试的不干涉脚本事件,需要在版本控制中详细记录;因此,仅仅拥有一组可以传播的规范数据库对象不会被认为是一个好主意。还有大多数人会坚持的其他初始化活动(例如,静态表格填充、选项配置和验收测试)。如果你有数据和对象的复制和冗余,那就更棘手了。
        【解决方案4】:

        您可以将诸如 SP 之类的东西放入 master 并从任何地方调用它们。至于表格等其他对象,可以put them in model and new databases will get them when you create a new database

        但是,为了让新表在添加到父数据库后简单地在子数据库中弹出,什么都没有。

        可以创建一些东西来查看数据库并从模板数据库编写脚本,并且还有一些商业工具可以帮助发现数据库之间的差异。您还可以在“主”数据库中有一个 DDL 触发器,该触发器在您创建新表时执行此操作。

        如果您保留了一个不错的 SPACES 模板,您可以编写脚本(不包含数据)并创建新数据库 - 这样就不需要 TRUNCATE。您可以使用 SQL 或外部工具编写脚本。

        【讨论】:

        • 据你所知,不存在像我提到的那样的东西吗?一种创建“主模式”数据库的方法,然后创建一个新数据库并将其设置为“使用”已经创建的“主模式”? =(
        • 你可以使用模型。但它只适用于新数据库(以及该实例上的每个新数据库)。
        • 我已经更新了我的答案,添加了一个链接,指向一篇描述模型工作原理的文章。
        【解决方案5】:

        这里有一些琐事。 mssqlsystemresource 数据库按照您的描述工作:被定义一次并在每个数据库中“出现”为特殊的 sys 模式。不幸的是,用户数据库无法使用此工作所需的特殊“魔法”。您必须使用部署技术来使您的架构保持同步。也就是说,按照已经建议的其他答案将更改应用于每个数据库。

        【讨论】:

          【解决方案6】:

          理论上,您可以在 UNIVERSE.sysobjects 表上放置一个触发器(假设是 SQL Server),然后您可以枚举 master.dbo.sysdatabases 以查找所有子数据库。如果你有一个特殊的表表明它是一个子数据库,你可以参考 child.dbo.sysobjects 来找到它。

          别搞错了,实施起来会很困难。但这是你可以做到的一种方式。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-01-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多