我运行了下面的查询,它显示了当前正在运行的作业的列表。然而,在活动监视器中,这些都没有运行。我如何验证这些是否正在运行?
我该如何杀死他们?
select sj.name
,sja.*
from msdb.dbo.sysjobactivity as sja
inner join msdb.dbo.sysjobs as sj on sja.job_id = sj.job_id
where sja.start_execution_date is not null
and sja.stop_execution_date is null
Run Code Online (Sandbox Code Playgroud)
我在生产服务器上有一个 SQL 代理作业,它不断失败并显示以下消息。它应该使用SP_WHOISACTIVE存储的 proc 以定期安排的时间间隔捕获 SQL Server 活动。
以用户身份执行:警告:聚合或其他 SET 操作消除了空值。[SQLSTATE 01003](消息 8153)
警告:空值被聚合或其他 SET 操作消除。[SQLSTATE 01003](消息 8153)
警告:空值被聚合或其他 SET 操作消除。[SQLSTATE 01003](消息 8153)
违反 PRIMARY KEY 约束“PK_WhoIsActive”。无法在对象“monitoring.WhoIsActive”中插入重复键。重复的键值为 (Jan 20 2017 8:25AM, 109)。[SQLSTATE 23000](错误 2627)
该语句已终止。[SQLSTATE 01000](错误 3621)。
步骤失败。
知道是什么原因造成的吗?
我应该遵循哪些步骤来修复此错误?
sql-server sql-server-2008-r2 sql-server-agent jobs sp-whoisactive
我必须每天执行 SQL 语句并将结果通过电子邮件发送给 dba。我配置了数据库电子邮件。
下面是查询:
SELECT
account.accountID,
account.name
FROM
account
LEFT OUTER JOIN accountfeaturesetting afs
ON afs.accountid = account.accountid
and afs.featureid = 'Schedules'
and afs.settingid = 'EditReasons'
WHERE
ISNULL(afs.Value, '0') = '1'
AND NOT EXISTS
(SELECT 1 FROM program
WHERE program.AccountID = account.AccountID
AND program.Active = 1 AND
(program.ScheduleEditReasonFlags <> 0 OR
program.ScheduleEditReasonFields <> 0))
AND account.IsMaster = 0
Run Code Online (Sandbox Code Playgroud)
为此,我创建了具有 2 个步骤的 Sql 作业:
发送结果:
Use MSDB
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'abc',
@recipients = 'recipients@company.com',
@subject = 'queryresultset',
@body='testmail', …Run Code Online (Sandbox Code Playgroud)我在 SQL 2008 服务器(服务器 A)上有一份工作(我知道这并不理想……正在解决这个问题)。代理在 NT AUTHORITY\NETWORK SERVICE 下运行。
我想添加一个运行位于另一台 SQL 2014 服务器(服务器 B)上的作业的步骤。
我会用:
EXEC [Server B].msdb..sp_start_job N'JobName'
Run Code Online (Sandbox Code Playgroud)
从服务器 A 手动运行它按预期在服务器 B 上执行作业。
如果我将任务添加到服务器 A 上的作业,它会失败并显示以下消息:
以用户身份执行:NT AUTHORITY\NETWORK SERVICE。对象“sp_start_job”、数据库“msdb”、架构“dbo”上的 EXECUTE 权限被拒绝。[SQLSTATE 42000](错误 229)。步骤失败。
我已将服务器 B 上的 NT AUTHORITY\NETWORK SERVICE 分配给 msdb 中的“TargetServerRole”,然后授予有关用户 SP_Start_Job 和 SP_Stop_Job 的执行权限。
服务器 A 将服务器 B 作为链接服务器,我尝试设置“本地服务器登录到远程服务器登录映射”本地登录 NT AUTHORITY\NETWORK SERVICE 来模拟。
作业仍然失败并出现相同的错误。
我需要做什么?
谢谢
sql-server-2008 sql-server permissions sql-server-agent jobs
我想从 SQL Server 代理作业运行 SQL Server 漏洞评估。目前,我正在尝试使用 PowerShell 脚本完成一项工作,并且正在运行如下所示的命令。
Invoke-SqlVulnerabilityAssessmentScan -ServerInstance $(ESCAPE_DQUOTE(SRVR)) -Database AdventureWorks
Run Code Online (Sandbox Code Playgroud)
我已经确认 Invoke-SqlVulnerabilityAssessmentScan 在 SQL Server 上可用(我可以从那里的 PowerShell 命令提示符运行它),但是当我运行我的作业时,我收到一条错误消息,指出
术语“Invoke-SqlVulnerabilityAssessmentScan”未被识别为 cmdlet 的名称
看完这篇 Microsoft 文章后,我想知道 SQL Agent 是否只有它可以访问的 PowerShell cmdlet 的一个子集。
如何从 SQL 作业运行漏洞评估扫描?
我有一个关于工作统计的问题。因此,我有一份具有以下时间表的工作:每天在上午 12:00:00 到晚上 11:59:59 之间每 5 分钟发生一次。时间表将于 2017 年 12 月 13 日开始使用。
在 2019-10-20 上午 11:27 我运行了两个脚本来获取 last_run_time 和 next_run_time,下面是脚本及其对应的结果:
USE msdb
GO
SELECT J.Name AS 'Job Name'
,'Job Enabled' =
CASE J.Enabled
WHEN 1 THEN 'Yes'
WHEN 0 THEN 'No'
END
,STUFF(
STUFF(CAST([active_start_date] AS VARCHAR(8)), 5, 0, '-')
, 8, 0, '-') AS 'Job Schedule Start Date'
,STUFF(
STUFF(CAST([active_end_date] AS VARCHAR(8)), 5, 0, '-')
, 8, 0, '-') AS 'Job Schedule End Date'
,'Job Frequency' =
CASE …Run Code Online (Sandbox Code Playgroud) sql-server sql-server-agent jobs scheduled-tasks sql-server-2014
我想向 SQL 代理操作员警报添加超过 100 个字符的电子邮件地址。
例如: emaione@example.com;emailtwo@example.com;emailthree@example.com;....
我试图通过改变 sysoperators email_address 列来绕过 100 个字符的限制
ALTER TABLE sysoperators
ALTER column email_address NVARCHAR(1000);
Run Code Online (Sandbox Code Playgroud)
然后创建我的运算符,但地址仍然被截断为 100 个字符?
我创建了一个以 XML 格式输出数据的脚本,并使用 SQL Server 代理(“操作系统 (cmdexec)”类型的作业步骤)每月/每季度运行一项作业,以将数据输出到特定文件。然而,我们遇到的问题是 SQLCMD 脚本的输出:
sqlcmd -d <Database> -i "<Package>\<SQLFile>.sql" -o "<OutputFilePath>\<FileName>.xml" -y 0
正在输出“消息”和“结果”。有没有办法只通过sqlcmd写入结果?
我删除了一些消息,包括:
“警告:空值会被聚合或其他 SET 操作消除。”
“(受影响的 1 行)”
通过使用以下代码:
SET NOCOUNT ON
SET ANSI_WARNINGS OFF
GO
Run Code Online (Sandbox Code Playgroud)
感谢您的建议!
我知道如何解决这个问题,但我不明白为什么当我从SSMS运行下面的查询时它会起作用的技术细节运行下面的查询时它可以工作,但当我将它添加为 SQL Server 代理中的作业时相同的查询会失败,这背后的技术细节是什么。
查询:
select LEFT(datediff(day,GETDATE(),'31/08/20'+'26')/365.25,2) AS test
Run Code Online (Sandbox Code Playgroud)
作业失败时我收到的错误:
从字符串转换日期和/或时间时转换失败。[SQLSTATE 22007](错误 241)。这一步失败了。
SQL 代理是否使用不同的引擎或不同的技术?
我正在运行 SQL Server 2008 R2,我需要创建一个新作业,该作业基本上会在每个月初(每个月 1 日上午 01:00)运行查询。
这是查询:
INSERT INTO [SupportTracker].[dbo].[DashboardRecords]
SELECT [bg_id]
,[bg_short_desc]
,[bg_reported_date]
,[bg_status_updated_date]
,[us_firstname]
,[us_lastname]
,[LastUpdatedUserFirstname]
,[LastUpdatedUserLastname]
,[st_name]
,[pr_name]
,[ct_name]
,[pj_name]
,[AssignedUserFirstname]
,[AssignedUserLastname]
,[bg_project]
,[no_of_hours]
,[BugType]
,[SubType]
,[Device]
,[pj_parent_id]
FROM [SupportTracker].[dbo].[ViewIssueListwBugTypeNDevice]
WHERE
bg_reported_date between '2012-12-01 00:00:00.000' AND '2012-12-31 23:59:59.999'
AND bg_id NOT IN (SELECT bg_id FROM [SupportTracker].[dbo].[DashboardRecords])
ORDER BY bg_reported_date ASC
Run Code Online (Sandbox Code Playgroud)
我的问题是在WHERE条款上。这两个日期每个月都必须更改。
如果我们在01-01-2013 01:00:00:00,我需要这两个日期:
2012-12-01 00:00:00.000和2012-12-31 23:59:59.999
如果我们在01-02-2013 01:00:00:00,我需要这两个日期是:
2013-01-01 00:00:00.000和2013-01-31 23:59:59.999。
基本上我需要捕获数据库的一部分并将其保存在表中,就像每个月末一样......
谢谢
sql-server ×10
sql-server-agent ×10
jobs ×5
alerts ×1
date ×1
errors ×1
operator ×1
permissions ×1
sqlcmd ×1