我是一个偶然的 DBA,没有任何脚本知识/背景。我们有一堆不同的数据库(每个客户端都有自己的数据库),它们具有相同的结构,但数据不同。也就是说,我们会定期创建每个人都需要使用的功能。这意味着我必须将这些部署到我们 120 多个数据库中的每一个。如果不“手动”将其部署到每个数据库,我该怎么做?
我以前问过这个问题,但没有什么真正有用的。我得到的答案是“使用脚本”(不可行,因为我什至不知道如何开始)、“使用 RedGate 的工具”(没有钱购买,公司也不会购买),以及“不要使用标量 UDF 开头(完全无用)。
我还被告知“只要把它放在 master 或其他数据库中,然后调用它”。这是个好主意,但很快我们的权限/登录名就会改变,我认为一个数据库用户将无法调用另一个数据库(HIPPA 等等)。
任何人都可以为我级别的“DBA”提供一些指导吗?
谢谢
更新:我发现可以将 sp_MSforeachdb 用于 DDL 语句。显然,这不是最佳实践,因为 sp_MSforeachdb 没有记录并且不受 MS“支持”。与此一样,使用风险自负。它对我来说就像一个魅力。请参阅示例 2:https ://www.mssqltips.com/sqlservertip/1414/run-same-command-on-all-sql-server-databases-without-cursors/
对于那些不想走那条路并且和我处境相似的人,请使用答案部分提供的 Johnathan Fite 的 PS 脚本。这是一个方便的脚本,尤其是当您有多个服务器/实例时。
感谢大家!
您可以按照用户Cade Roux在对 Stack Overflow 问题Common function / stored procedures for all databases的回答中进行尝试:
来自Mladen Prajdić在当前数据库上下文中运行主数据库驻留存储过程:
如果您更喜欢使用 tsql 并排除系统、离线、单用户模式和可用性组 read_only 数据库,请执行以下脚本。您需要将您的代码放在我标有“将您的代码放在这里”的部分。
我以前使用过 powershell 脚本来执行此操作。我把它包括在这里。关于使用适当工具的其他答案是最好的,尽管我不同意将对象放在公共数据库中以解决您提到的问题。
该脚本是 powershell 并使用 windows 身份验证。它实际上并没有做任何错误处理,但确实有一点可以测试数据库是否是需要更新的数据库之一。只需向它提供一个 SQL 实例列表,确定一个唯一表(或其他查询)以确定它是否是您的应用程序数据库之一,并将其指向包含 .sql 文件的文件夹。
关于脚本的一些说明
$SQLInstanceList - 这是一个文本文件的完整路径,该文件包含您希望它跳过的所有 SQL 实例。每行一个条目。
$ScriptToRunDirectory - 包含要运行的 sql 文件的目录。
$Query - 一个查询,这样当它查看数据库时,它知道应该针对它运行查询。我加入这一步是因为我假设并非每台服务器上的每个数据库都是您的应用程序数据库之一。例如,您希望跳过的 ReportServer、master、model、tempdb、其他自定义数据库等。我还假设至少有一个表对所有应用程序数据库都是通用的。因此,当它遍历每个数据库时,它会运行上述查询,实质上是检查指定的表是否存在。如果是,它将运行 $ScriptToRunDirectory 文件夹中的所有内容,否则将跳过它。
所以脚本的基本前提如下: * 对于列出的每个 SQL 实例,连接 * 对于 SQL 实例中的每个数据库: * 运行 $Query 以确定它是否是正确的数据库类型 * 如果数据库是正确的类型然后: * 对 $SQLToRunDirectory 中的每个 .sql 文件执行。
当我需要在我的环境中接触多个数据库时,这听起来很像你的,我使用类似这样的东西来生成必要的语句......然后我将其复制并粘贴到一个新窗口以运行:
使用文本运行此结果会产生: