我们有一个数据库服务器,它有大约10个数据库。
我想创建一些可以在所有数据库中使用的函数/存储过程。
例如,我们可以在任何数据库中使用sp_executesql
。
我们有一些这样的要求(获得当前的学年,财政年度等......)
可行吗?感谢。
答案 0 :(得分:3)
正如其他人所建议的那样,您可以将对象放入master数据库,但Microsoft明确建议您should not do that。我发现这个解决方案是相当危险的,因为那里有主数据库是由系统“拥有”,而不是你的,所以有没有保证,将继续在未来以同样的方式行事。
相反,我认为这主要是一个部署问题。您可以使用(至少)两种策略:
第二个选项可能是更好的选项,因为如果你的函数使用表格(例如你使用日历表来获得学年,这比计算它容易得多)那么你必须在每个表格中创建相同的表格。数据库也是。通过使用同义词,您只需要维护一组表。
对于实际部署,使用脚本来管理对象很简单,因为您只需要一个数据库列表来连接并运行每个DDL脚本。您可以使用批处理文件和SQLCMD(可能在.sql脚本中使用SQLCMD变量),或者从PowerShell或您喜欢的任何其他语言驱动它。
答案 1 :(得分:1)
根据SP实际执行的操作,您希望在master中创建过程,使用sp_命名并将其标记为系统过程:
http://weblogs.sqlteam.com/mladenp/archive/2007/01/18/58287.aspx
答案 2 :(得分:0)
有两种选择:
您可以使用系统存储过程,如Cade所说。我过去做过这个,它运作正常。对此的一个警告是sp_MS_marksystemobject
过程没有记录,这可能意味着它可能在未来的SQL版本中在没有警告的情况下消失或改变。回想一下我认为使用这种方法还有其他问题。
另一种方法是使用标准化的过程和函数,并使用sp_MSforeachdb
在数据库中滚动它们以针对每个数据库运行代码。如果您只需要针对您的10个数据库运行,您可以复制此过程中的代码并修改它以在运行代码之前检查数据库是否与您的模式匹配(或者您可以编写自己的类似东西的版本)。 / p>