Sql server 将新作业添加到任何其他服务器时,更新一台服务器中的表

Sql server 将新作业添加到任何其他服务器时,更新一台服务器中的表,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有一堆服务器和一台保存所有这些服务器清单的服务器 我想创建一个存储过程,每当向任何其他服务器添加新作业时,它都会自动更新库存服务器中名为Job Information的表 作业信息表包含以下列: Server Name, Job Name, Date Created , Date Modified 首先,每个服务器都可以到达您的库存服务器 INSERT INTO [SERVER].[dbo].[DATABASE].[TABLENAME] (Field1,Field2) VALUES ('Fi

我有一堆服务器和一台保存所有这些服务器清单的服务器

我想创建一个存储过程,每当向任何其他服务器添加新作业时,它都会自动更新库存服务器中名为Job Information的表

作业信息表包含以下列:

Server Name, Job Name, Date Created , Date Modified

首先,每个服务器都可以到达您的库存服务器

INSERT INTO [SERVER].[dbo].[DATABASE].[TABLENAME] (Field1,Field2) VALUES ('Field1', 'Field2');
使用存储过程将作业添加到其他服务器。在该过程中,为库存服务器的insert job编写额外的insert语句

INSERT INTO [SERVER].[dbo].[DATABASE].[TABLENAME] (Field1,Field2) VALUES ('Field1', 'Field2');

一种方法是在指向库存服务器的每台服务器上创建一个链接服务器。我假设您已经设置好了,并且链接的服务器名称是InventoryServer

然后,您可以在每台服务器上创建触发器:

USE msdb;
GO
CREATE TRIGGER dbo.UpdateNewJob
ON dbo.sysjobs
FOR INSERT
AS
BEGIN
  SET NOCOUNT ON;

  INSERT InventoryServer.DatabaseName.dbo.[Job Information]
    ([Server Name],[Job Name],[Date Created],[Date Modified])
    SELECT @@SERVERNAME, name, date_created, date_modified
      FROM inserted;
END
GO
要同时更新Date Modified列,您可以添加额外的触发器,或者将逻辑组合为一个触发器:

USE msdb;
GO
CREATE TRIGGER dbo.UpdateExistingJob
ON dbo.sysjobs
FOR UPDATE
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE j
    SET [Date Modified] = i.date_modified
    FROM  InventoryServer.DatabaseName.dbo.[Job Information] AS j
    INNER JOIN inserted AS i
    ON i.name = j.name
    WHERE j.[Server Name] = @@SERVERNAME;
END
GO
现在,您还需要在错误处理的基础上添加—例如,当InventoryServer无法访问时,您想做什么?如果工作名称已更改,您会怎么做?除了名称之外,您的中央库存表可能还应该包含作业id

另外,请尽量避免使用空格或其他特殊字符命名表和列-这只会迫使您在大多数地方使用[方括号]。你觉得哪一个可读性最好/最差?老实说:

[Date Modified]

DateModified

Date_Modified

如果表仅在添加作业时更新,则“修改日期”列的用途是什么?这是为了那些服务器上已经运行的作业。到目前为止,我一直在手动放置这些信息,但现在我的经理希望自动填充这些表。如果存储过程可以在修改现有作业时更新表,这也会很有帮助。。。。很抱歉。。。我是一个新的dba…我不知道这有多可行。是否确实要创建用于创建/编辑作业、步骤、计划等的存储过程。?您正在复制已经存在的代码,并且您正在阻止所有用户使用UI创建/修改大多数人将要做的作业。@AaronBertrand感谢您的批评。没有关于项目规模的信息。如果它有数千名用户,你说得对。如果我只是一个用户,而你剥夺了我使用设计用于创建/修改作业的UI的能力,并迫使我学习这些存储过程的语法,而这些存储过程在由没有经验的DBA编写时不太可能完全正常,那么我仍然会感到不安。这与规模或用户数量无关。@codeGenius不,只有20台服务器。。。系统表上链接服务器和触发器的可能性已被排除。。。我的经理向我指出了公开质询的方向,我不知道这有什么帮助。。。。如果我的存储过程可以每天查询每个服务器一次,并根据任何服务器中的任何更改更新其表,那就足够了。谢谢你的建议,我一定会遵守的。。。对于代码,我的经理不希望在系统表或链接服务器上使用触发器。。。如果inventory server上有一个存储过程,可以每天查询一次每个服务器并根据任何更改更新其表,这就足够了……也许使用open querry可以在这里有所帮助……inventory server上的存储过程如何查询没有链接服务器的每个服务器?我不知道当然……我的经理向我指出了公开质询的方向,但我对它还不熟悉,所以仔细阅读它。。。我真的很抱歉造成这种混乱。。。。。非常感谢您的帮助……@user1688976那么在表中维护这些数据有什么意义呢?为什么不编写一个对所有服务器使用OpenQuery的查询,并在需要信息时运行它呢?然后它保证是最新的,你不必编写一些后台进程来维护信息,即使你不需要它…我相信这是一个更好的方法,但我需要编写这种存储过程。。。如果我们编写这个查询并安排它每天运行一次,并更新该表中的结果会怎么样。。。。我知道这没有意义,但这是一个可行的解决方案。。。仪式