Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用相同数据库结构的多个网站_Sql Server_Asp.net Mvc_Design Patterns - Fatal编程技术网

Sql server 使用相同数据库结构的多个网站

Sql server 使用相同数据库结构的多个网站,sql-server,asp.net-mvc,design-patterns,Sql Server,Asp.net Mvc,Design Patterns,我有三个网站,它们使用抽象数据库结构和表,如:项目、地点、类别等。。。以及诸如GetItemsByCategory、GetRelatedItems等存储过程。。。实际上,我在这3个不同的网站上使用完全相同的数据库结构 从代码的角度来看,我在所有网站上使用相同的代码(除了每个网站特有的HTML),所有的通用代码都在所有网站使用的少数项目中,所以每次我检测到一个bug(所有网站都有),我只需在一个地方(所有网站都使用的通用部分)修复它,所有网站就会自动得到修复 实际上,我正在使用Asp.NETMVC

我有三个网站,它们使用抽象数据库结构和表,如:项目、地点、类别等。。。以及诸如GetItemsByCategory、GetRelatedItems等存储过程。。。实际上,我在这3个不同的网站上使用完全相同的数据库结构

从代码的角度来看,我在所有网站上使用相同的代码(除了每个网站特有的HTML),所有的通用代码都在所有网站使用的少数项目中,所以每次我检测到一个bug(所有网站都有),我只需在一个地方(所有网站都使用的通用部分)修复它,所有网站就会自动得到修复

实际上,我正在使用Asp.NETMVC3和SQLServer

每当我想扩展一些功能性,需要一个新表、存储过程或与数据库相关的东西时,我都必须对每个数据库进行修改

  • 你知道有什么方法可以让我拥有同样的灵活性,只对所有网站修改一次数据库吗

  • 你认为我使用的是一种好的方法,还是你认为我应该使用不同的方法


如果数据库位于一台服务器上,您可以从Management Studio为该过程生成脚本,并确保使用选项“检查对象是否存在”(工具>选项>SQL server对象资源管理器>脚本)。这将产生类似这样的结果(最重要的是,它将生成存储过程代码,您可以使用动态SQL执行这些代码):

现在您已经有了这个脚本,您可以修改它以跨多个数据库工作-您只需要滑动@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;
或者,您可以创建my
sp\u msforeachdb
sp\u ineachdb
替换的自定义版本:


我以前使用过一个名为此的工具,但该工具似乎不再存在,或者可能已被另一家公司吞并/重新标记。

如果数据库位于一台服务器上,您可以从Management Studio生成该过程的脚本,并确保使用“检查对象是否存在”选项(工具>选项>SQL Server对象资源管理器>脚本)。这将产生类似的结果(最重要的是,它将生成存储过程代码,您可以使用动态SQL执行这些代码):

现在您已经有了这个脚本,您可以修改它以跨多个数据库工作-您只需要滑动@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;
或者,您可以创建my
sp\u msforeachdb
sp\u ineachdb
替换的自定义版本:


我曾经使用过一个名为websiteId的工具,但是这个工具似乎已经不存在了,或者它已经被另一家公司吞并/重新命名了。

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

这意味着在数据库中进行一些重构和对数据库的任何调用,但一旦完成,就只有一个数据库需要维护


当然,这是假设您的数据库位于同一台服务器上…

如果您在所有表中添加了一列称为websiteId的列,那么您可以只拥有一个数据库。将唯一的websiteId存储在每个站点的web.config中,并在每次请求数据时传递它。显然,每个站点的数据都与它们的websiteId一起存储,因此可以查询数据呃网站

这意味着在数据库中进行一些重构和对数据库的任何调用,但一旦完成,就只有一个数据库需要维护

当然,这是假设您的数据库位于同一台服务器上