2012-08-15 51 views
1

我有三个网站,使用抽象的数据库结构,像表:项目,地方,类别等...和存储过程,如GetItemsByCategory,GetRelatedItems等...其实我正在使用这3个不同网站的数据库结构相同。多个网站,使用相同的数据库结构

从代码的角度来看,即使所有网站使用相同的代码(除特定的foreach之外的HTML),并且所有常见代码都是由所有网站使用的少数项目,所以每次检测到一个bug是在所有的网站)我只是修复它在一个地方(所有使用的共同部分),并自动所有网站得到修复。

其实我使用Asp.net MVC3和Sql服务器。

每次我想扩展一些funcionality,我需要一个新的表,存储过程或与数据库相关的东西,我必须在每个数据库中进行修改。

  • 您是否知道我可以使用的任何方法能够具有相同的灵活性,并且只对所有网站进行一次数据库修改?

  • 您是否认为我正在使用一种好的方法,或者我应该在您的意见中使用不同的东西?

回答

1

如果数据库在一台服务器上,你可以生成从Management Studio中的程序脚本,并确保使用该选项“检查对象的存在”(工具>选项> SQL服务器对象资源管理器>脚本)。这会产生这样的事情(最重要的是它产生的存储过程的代码的东西,你可以使用动态SQL执行):

USE DBName; 
GO 

SET ANSI_NULLS ON; 
GO 

SET QUOTED_IDENTIFIER ON; 
GO 

IF NOT EXISTS (...) 
BEGIN 
    EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE dbo.whatever ... 
    ' 
END 
GO 

现在,你有这个脚本,你可以修改它跨越多个数据库 - 你只需要滑动@statement =部分并重新使用它。首先,你需要把你想要的数据库放入一个@table变量中(或者你可以把它放在一个永久表中,如果你愿意的话)。然后你可以建立一个命令在每个数据库中执行,例如

DECLARE @dbs TABLE (name SYSNAME); 

INSERT @dbs(name) SELECT N'db1'; 
INSERT @dbs(name) SELECT N'db2'; 
INSERT @dbs(name) SELECT N'db3'; 

-- now here is where we re-use the create/alter procedure command from above: 

DECLARE @statement NVARCHAR(MAX) = N'CREATE PROCEDURE dbo.whatever ... 
    '; 

-- now let's build some dynamic SQL and run it! 

DECLARE @sql NVARCHAR(MAX); 
SET @sql = N''; 

SELECT @sql = @sql + ' 
    EXEC ' + QUOTENAME(name) + '.dbo.sp_executesql N''' + @statement + ''';' 
    FROM @dbs; 

EXEC sp_executesql @sql; 

或者,你可以创建我sp_msforeachdb更换的定制版本:http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and-more-flexible-sp-msforeachdb.aspx & http://mssqltips.com/tip.asp?tip=2201

我用了一个名为SQLFarms Combine这个工具,但该工具似乎不存在了,或者也许它已被另一家公司吞并/重新品牌化。

0

如果您向名为websiteId的所有表中添加了一列,则可以只有一个数据库。在每个网站的web.config中存储唯一的websiteId,并将其与每个数据请求一起传递。很显然,每个网站的数据都与他们的网站ID一起存储,因此每个网站都可以查询数据。

这意味着你的数据库和任何对你的数据库的调用有点重构,但一旦完成,你只有一个数据库来维护。

当然这是假设你的数据库在同一台服务器上...

相关问题