我想让用户能够管理 SQL 代理作业。根据文档页面,我可以通过在 msdb 上授予“适当的”角色来做到这一点。我已授予所有三个 SQLAgent% 角色,但用户在(作为测试)尝试重命名作业时收到此错误:
Only members of sysadmin role are allowed to update or delete jobs owned by a different login.
(Microsoft SQL Server, Error: 14525)
Run Code Online (Sandbox Code Playgroud)
这个问题是类似的,但没有解决 SQL 代理的答案。在 MS SQL 2K8 中,系统管理员角色是唯一的解决方案吗?
我们最近在 Windows Server 2012(从 Windows Server 2008 R2)上升级到 SQL Server 2012(从 SQL Server 2008 R2),并且之前运行没有错误的 SQL Server 作业代理作业现在失败了。
该作业有一个 Powershell 作业步骤:
$ErrorActionPreference = 'Stop'
$DateStamp = Get-Date -format "yyyyMMdd"
$BizUnit = 'SHB'
# Target File directory
$BaseDir = '\\MyFileServer\MyDirectory'
$Query = "EXEC dbo.usp_MyQuery '$BizUnit'"
$TargetFile = "MyTargetFile_" + $BizUnit + "_$DateStamp.xml"
$TargetDir = (Join-Path -Path $BaseDir -ChildPath $BizUnit)
$Query | Out-File -FilePath (Join-Path -Path $TargetDir -ChildPath $TargetFile) -Force -Encoding "utf8"
Run Code Online (Sandbox Code Playgroud)
当作业运行时,它失败并显示以下错误消息:
作业步骤在 PowerShell 脚本的第 14 行收到错误。对应的行是 '$Query | Out-File -FilePath …
我正在从 SQL Server 2005 迁移到 SQL Server 2008R2,我看到 SQL Server 代理作业中有一项作业需要迁移,但我也在 SSIS 中看到它---> Stored Packages\MSDB\File Manipulation . 不确定我是否右键单击它并选择导出,如果它不能在新的开发服务器中工作,这会影响生产服务器吗?或者我如何将它的一个副本导入到另一个新的开发 SQL Server 2008?
感谢您的任何建议或方向。
我已经将用户映射到msdb数据库并分配给他的角色SQLAgentOperatorRole,但是用户在连接时仍然看不到列出的SQL Server代理。
在SQL Server代理确实显示了罚款,当我登录为sysadmin。
我们今天必须重新启动我们的 SQL Server,我们没有对其进行任何更改。
当它恢复时,我们立即开始从服务器收到此错误
日期/时间:2014/2/27 下午 3:09:31
描述:对象“SQLServer:Locks”的 SQL Server 性能计数器“死锁数/秒”(实例“数据库”)现在高于阈值 1.00(当前值为 2.00)。
评论:(无)
作业运行:(无)
我们运行了DBCC TRACEON (1204)命令并查看了日志,但它没有报告任何死锁。
知道什么会触发它关闭吗?我们每分钟都收到警报,但找不到任何实际的死锁。
编辑:我应该补充一点,在这次重启之前,我们从未收到过这个错误
编辑 2:我们也使用 SQL Server Profiler 来查找死锁,让它运行 5 分钟,在此期间我们收到了 5 个错误警报,当我们检查详细信息时,我们没有发现死锁。
编辑 3:2014 年 3 月 6 日:运行查询并且它起作用了,但它报告了我们的其他详细信息所说的我们没有锁定我们仍然在整个时间内收到错误。
再次感谢你的帮助!

编辑 4:2014 年 3 月 6 日:我运行了查询,这里是结果集的一个样本,我承认我不确定我在这里看的是什么,也就是说我不确定它是否显示了一些东西我可以采取或不采取行动。

编辑 5:2014 年 3 月 7 日:下图显示了突然生成此错误的警报。

谢谢
本周末我有一个项目,必须停止所有作业,但必须运行特定作业中的 1 个步骤。例如:我有一个两步作业,第二步必须运行,第一步必须与其他作业一起禁用或停止。
首先,我想停止 sql server 代理,但这将停止所有作业。有什么办法可以做到。
我设置了一个测试作业来测试我的失败通知,现在我收到以下错误,指出它没有通过电子邮件通知我的操作员。奇怪的是我在其他几个实例上运行了完全相同的安装脚本,它运行得很好,但在这个实例上失败了。我检查了 SQL Server 代理和操作员本身的属性。我还从管理分支的数据库邮件中向自己发送了一封测试电子邮件,并且成功运行。
无法通过电子邮件通知“DBA 团队”。
我在服务器上有很多 SQL Server 作业。每当完成任何作业执行时,我都需要执行 SP。一种困难的方法是在每个调用该 SP 的作业上创建一个步骤。
有没有简单的方法可以做到这一点?作业完成后,SQL Server 是否执行任何 SP 或任何内容?
我昨天修改了一个维护计划,今天早上(通过使用来自 sysjobs 的最后修改日期)发现与维护计划相关的所有作业都被禁用。
我无法弄清楚为什么会这样。SQL 作业所有者是sa,我只是用维护计划更改了维护清理任务并保存了作业。
我正在尝试查看以下 T-SQL 语句的估计执行计划:
EXEC msdb.dbo.sp_delete_job @job_id = '3A015189-F4EB-439B-9CA0-27AFB74719D8'
, @originating_server = '(LOCAL)'
, @delete_history = 0
, @delete_unused_schedule = 0;
Run Code Online (Sandbox Code Playgroud)
当我这样做时,SQL Server 抛出以下错误:
消息 213,级别 16,状态 1,过程 sp_delete_all_msx_jobs,第 25 行
列名或提供的值数量与表定义不匹配。
的定义sp_delete_all_msx_jobs包含以下相关行,从第 25 行开始(为了可读性而包装):
INSERT INTO #temp_jobs_to_delete
SELECT sjv.job_id,
CASE sjs.server_id WHEN 0 THEN 1 ELSE 0 END,
sjv.owner_sid
FROM msdb.dbo.sysjobs_view sjv
LEFT OUTER JOIN msdb.dbo.sysjobservers sjs
ON (sjv.job_id = sjs.job_id)
WHERE (ISNULL(sjs.server_id, 0) = 0)
AND (sjv.originating_server = @msx_server)
Run Code Online (Sandbox Code Playgroud)
该存储过程的第 14 行显示了#temp_jobs_to_deleteis的定义:
CREATE TABLE #temp_jobs_to_delete …Run Code Online (Sandbox Code Playgroud)