Weisheiten - der Netz-Weise Blog
SQL-Server Agent-Jobs vom Entwickler bearbeiten lassen
Mit dem SQL-Server Agent und der Datenbankrolle ""SQLAgentUserRole"" in der msdb-Datenbank kann man einem SQL-Login Zugriff auf einen Job geben. Voraussetzung ist, dass der Login dem JOB auch als Owner zugewiesen wird. Soll der User allerdings auch die Zeitpläne für geplante Aufträge verwalten, stellt man fest, dass dies nicht unbedingt klappt. Ursache dafür ist die schlecht Dokumentierte Tatsache, dass der Login auch Besitzer der Zeitpläne sein muß. Hat er diese nicht angelegt, kann er dementsprechend keine Änderungen durchführen. Stattdessen bekommt er eine Meldung "The specified schedule @schedule_id() does not exist". Den Besitzer des Zeitplans kann man nur über die Tabelle msdb.dbo.sysschedules in der Spalte owner_sid einsehen. Das folgende Script zeigt alle Job an, bei denen Besitzer für Zeitplan und Job nicht identisch sind:
SELECT (SELECT name FROM sys.server_principals WHERE [SID] = ss.owner_sid) AS ScheduleOwner,
(SELECT name FROM sys.server_principals WHERE [SID] = sj.owner_sid) AS JobOwner,
ss.name AS ScheduleName,
ss.owner_sid AS ScheduleOwnerSid,
sj.name AS JobName,
sj.owner_sid AS JobOwnerSID
FROM msdb.dbo.sysschedules AS ss
INNER JOIN msdb.dbo.sysjobschedules AS sjs
ON sjs.schedule_id = ss.schedule_id
INNER JOIN msdb.dbo.sysjobs AS sj
ON sjs.job_id = sj.job_id
WHERE ss.owner_sid <> sj.owner_sid
Und mit folgendem Script beheben Sie das Problem, indem Sie den Besitzer aller zeitpläne auf den gleichen Besitzer setzen wie den zugehörigen Job. Um nicht alle Jobs ungesehen zu überschreiben, geben Sie in der 1. Zeile einen Login-Namen ein:
DECLARE @JobOwner NVARCHAR(255) = 'Benutzer'
DECLARE @JobOwnerSid VARBINARY(85)
SELECT @JobOwnerSid = [sid] FROM master.sys.server_principals WHERE name = @JobOwner
UPDATE SS
SET ss.owner_sid = sj.owner_sid
FROM msdb.dbo.sysschedules AS ss
INNER JOIN msdb.dbo.sysjobschedules AS sjs
ON sjs.schedule_id = ss.schedule_id
INNER JOIN msdb.dbo.sysjobs AS sj
ON sjs.job_id = sj.job_id
WHERE (ss.owner_sid <> sj.owner_sid)
AND (sj.owner_sid = @JobOwnerSid)
Kommentare