2012-02-02 69 views
1

我们有一个数据库服务器,它有大约10个数据库。常用功能/所有数据库的存储过程

我想创建可以在所有数据库中使用某些功能/存储过程。

例如,我们可以在任何数据库中使用sp_executesql

我们有这样一些要求是(获取当前学年,财政年度,等...)

是否可行?谢谢。

回答

3

正如其他人的建议,你可以把对象到主数据库,但微软明确建议您should not do that。无论如何,我发现这个解决方案相当有风险,因为master数据库是由系统“拥有”的,而不是由你自己拥有的,所以不能保证它将来会继续以相同的方式运行。

相反,我认为这是主要部署问题。有(至少)两个策略,你可以使用:

  • 部署对象,每个数据库
  • 将它们部署到一个“参考”的数据库,仅用于共享对象和创建同义词在其他数据库

第二个选择也许是更好的选择,因为如果你的函数使用表(例如你使用日历表来获得学年,这比计算它容易得多),那么你将不得不创建相同的表也在每个数据库中。通过使用同义词,你只需要维护一组表格。

对于实际部署,使用脚本来管理对象很简单,因为您只需要一个数据库列表来连接并运行每个DDL脚本。您可以使用批处理文件和SQLCMD(可能在.sql脚本中使用SQLCMD变量),或者使用PowerShell或您喜欢的任何其他语言来驱动它。

+0

+1得到一个全面的答案。 – Withheld 2014-08-21 17:36:33

0

几个选项:

您可以像Cade所说的那样使用系统存储过程。我过去已经完成了这个工作,并且工作正常。对此的一个警告是sp_MS_marksystemobject过程没有记录,这可能意味着它可能会在未来的SQL版本中消失或更改而不会发出警告。回想起来,我认为在功能上使用这种方法还存在其他问题。

另一种方法是使用标准化的程序和功能,并使用sp_MSforeachdb运行对每个数据库代码滚出来在你的数据库。如果您只需要针对您的10个数据库运行,则可以复制此过程中的代码并对其进行修改,以便在运行代码之前检查数据库是否与您的模式相匹配(或者您可以编写自己的版本以执行类似的操作)。

相关问题