【问题标题】:SSIS Job StatisticsSSIS 工作统计
【发布时间】:2017-07-21 11:05:06
【问题描述】:

我正在尝试查找 SSIS 作业统计信息,例如

每个帐户运行的作业(即从哪个系统帐户与哪些用户帐户运行的作业数量和作业)

如果我从 SSISDB 目录调用 SSIS 包,那么我应该知道哪个帐户正在调用该包。它是 SQL Server 代理帐户还是任何其他用户帐户。

有什么方法可以得到这些信息吗?

谢谢。

【问题讨论】:

  • 您可以从 SQL 代理作业表(msdb 数据库)或 SSIS 日志表(默认为 SSISB 数据库)编写查询
  • 是的。我只查询 MSDB-sys 表。但是,我无法找到帐户信息 - 比如软件包在哪个帐户下运行。

标签: sql-server ssis sql-agent-job


【解决方案1】:

SSIS 有一些您可以使用的内部报告。在 Integration Services 选项卡下方,您可以右键单击 SSISDB 并转到 Reports > All Executions。这将为您提供所有当前和最近的处决。如果您为给定的执行单击Overview,则会有一个名为CALLER_INFO 的字段将告诉您这是否是从SQL 代理调用的。请注意,如果您不是管理员,则某些执行可能会从您的报告视图中过滤掉。

如果您有权限直接查询 SSISDB 数据库,您可以使用以下命令为您提供调用执行的帐户名称以及正在运行当前操作的帐户:

select 
    execution_id
    , folder_name
    , project_name
    , package_name
    , environment_name
    , executed_as_name
    , start_time
    , end_time
    , CASE status WHEN 1 THEN 'Created'
        WHEN 2 THEN 'Running'
        WHEN 3 THEN 'Cancelled'
        WHEN 4 THEN 'Failed'
        WHEN 5 THEN 'Pending'
        WHEN 6 THEN 'Ended Unexpectedly'
        WHEN 7 THEN 'Succeeded'
        WHEN 8 THEN 'Stopping'
        ELSE 'Completed' END AS Status
    , caller_name
    , process_id
    , server_name
from internal.execution_info
--Optionally filter just running jobs
WHERE status = 2

这是一个具有以下过滤器的视图:

WHERE      opers.[operation_id] in (SELECT id FROM [internal].[current_user_readable_operations])
           OR (IS_MEMBER('ssis_admin') = 1)
           OR (IS_SRVROLEMEMBER('sysadmin') = 1)

因此,如果您不是管理员,结果将被过滤到您有权查看的那些执行。您也可以直接查询内部表来解决此限制。

编辑 对于 SQL 代理,您可以使用如下查询,该查询改编自:https://www.mssqltips.com/sqlservertip/2561/querying-sql-server-agent-job-information/

该步骤将在数据库用户名、代理或作业所有者下运行,具体取决于其配置方式。

SELECT 
    [sJOB].[job_id] AS [JobID]
    , [sJOB].[name] AS [JobName]
    , [sDBP].[name] AS [JobOwner]
    , [sCAT].[name] AS [JobCategory]
    , [sJOB].[description] AS [JobDescription]
    , CASE [sJOB].[enabled]
        WHEN 1 THEN 'Yes'
        WHEN 0 THEN 'No'
      END AS [IsEnabled]
    , [sJOB].[date_created] AS [JobCreatedOn]
    , [sJOB].[date_modified] AS [JobLastModifiedOn]
    , [sSVR].[name] AS [OriginatingServerName]
    , [sJSTP].[step_id] AS [JobStartStepNo]
    , [sJSTP].[step_name] AS [JobStartStepName]
    , CASE
        WHEN [sSCH].[schedule_uid] IS NULL THEN 'No'
        ELSE 'Yes'
      END AS [IsScheduled]
    , [sSCH].[schedule_uid] AS [JobScheduleID]
    , [sSCH].[name] AS [JobScheduleName]
    , CASE [sJOB].[delete_level]
        WHEN 0 THEN 'Never'
        WHEN 1 THEN 'On Success'
        WHEN 2 THEN 'On Failure'
        WHEN 3 THEN 'On Completion'
      END AS [JobDeletionCriterion]
      , proxyName.name
      , sJSTP.database_user_name
FROM
    [msdb].[dbo].[sysjobs] AS [sJOB]
    LEFT JOIN [msdb].[sys].[servers] AS [sSVR]
        ON [sJOB].[originating_server_id] = [sSVR].[server_id]
    LEFT JOIN [msdb].[dbo].[syscategories] AS [sCAT]
        ON [sJOB].[category_id] = [sCAT].[category_id]
    LEFT JOIN [msdb].[dbo].[sysjobsteps] AS [sJSTP]
        ON [sJOB].[job_id] = [sJSTP].[job_id]
        AND [sJOB].[start_step_id] = [sJSTP].[step_id]
    LEFT JOIN msdb.dbo.sysproxies proxy
        ON sJSTP.proxy_id = proxy.proxy_id
    LEFT JOIN [msdb].[sys].[database_principals] proxyName
        ON proxyName.sid = proxy.user_sid
    LEFT JOIN [msdb].[sys].[database_principals] AS [sDBP]
        ON [sJOB].[owner_sid] = [sDBP].[sid]
    LEFT JOIN [msdb].[dbo].[sysjobschedules] AS [sJOBSCH]
        ON [sJOB].[job_id] = [sJOBSCH].[job_id]
    LEFT JOIN [msdb].[dbo].[sysschedules] AS [sSCH]
        ON [sJOBSCH].[schedule_id] = [sSCH].[schedule_id]

ORDER BY [JobName]

【讨论】:

  • 这看起来很棒。但是,这只会从 SSIDB 目录中提取包。如果我的工作很少有 SP 或其他一些命令怎么办。我将如何将它们结合起来?我想要每个职位的信息
  • @RameshwarPawale 这根本不是问的,但我还是提供了答案。
  • 非常感谢马克。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
相关资源
最近更新 更多