【问题标题】:Search Linked server name in sql server agent job在 sql server 代理作业中搜索链接服务器名称
【发布时间】:2017-09-15 14:19:14
【问题描述】:

我有大约 4 台服务器(test1、test2、test3、test4),每台服务器都有 5-6 个数据库。每台服务器都安排了大约 60 个 SQL 服务器代理作业。

服务器中的每个作业都有 sql 语句和 SSIS 包的组合。在 SQL 语句中,我们存储了 procs,它从其他服务器访问表。

现在我想检查服务器 test2 是否正在其他服务器的 sql server 代理作业中使用。

我尝试了以下查询,但无法获得任何结果

SELECT Job.name AS JobName, Job.enabled AS ActiveStatus, 
       JobStep.step_name AS JobStepName, JobStep.command AS JobCommand
FROM sysjobs Job INNER JOIN
     sysjobsteps JobStep
     ON Job.job_id = JobStep.job_id
 WHERE JobStep.command LIKE '%test2%'

但是当我在 test1 服务器中手动检查时,我可以看到 test2 服务器正在存储的 procs 和 ssis 包中使用。

如何做到这一点?

【问题讨论】:

  • SSIS 包存储在哪里?在 SQL Server 上还是在文件系统上?如果是 SQL Server,每台服务器上是否都有包?
  • 包存储在服务器和文件系统中。是的,所有服务器中都有软件包。

标签: sql-server ssis


【解决方案1】:

这有点棘手。您将需要分别搜索过程、文件系统和 SQL Server。作业表只包含入口点,不包含每个步骤的定义。

SSIS 包,存储在 SQL Server 中

SSIS 包存储在msdbsysssispackages 中。定义存储在 packagedata 列中。您需要先转换数据,然后才能读取/搜索它。

-- How to read package data column.
SELECT TOP 10 
    [name],
    packagedata                                         AS [Before],
    CAST(CAST(packagedata AS VARBINARY(MAX)) AS XML)    AS [After]
FROM
    sysssispackages
;

SSIS 包,存储在文件系统中

这些是 XML 文本文件。您可以使用您喜欢的方法进行搜索。如果您想构建自己的解决方案.Net has some great file handling ablities

存储过程

有几种方法,它们都从系统表中返回数据。一种方法是使用object definition function

-- Returns definition of stored procedure.
SELECT
     OBJECT_DEFINITION(OBJECT_ID(N'[Your-Schema].[Your-Procedure]'))
;

如果你想全部带上这个

使用表sysjobsteps,您可以构建搜索给定服务器名称的包/应用程序。最终产品需要支持所有三种搜索方法。您也许可以使用子系统列来选择每个步骤应使用的搜索方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-05
    • 2020-01-08
    • 2011-09-06
    • 2021-08-22
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多