Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann ich Systemdatenbanken weglassen und zulassen, dass der SQL Server 2008-Agent-Job über ERROR_NUMBER 208 hinausgeht?

Sie könnten versuchen, DB_ID() zu verwenden , ich glaube die DB_ID() ist immer 1-4 (es sei denn, Sie haben eine Verteilungsdatenbank ). Prüfen Sie theoretisch einfach, ob DB_ID() größer als 4 ist:

exec sp_MSforeachdb 'IF DB_ID(''?'')) > 4
BEGIN
 DELETE FROM [?].schema.sessions WHERE name like ''xyz_%''
 AND sessionStart <DATEADD(mi, -5,GETDATE())
END' 

Außerdem sieht es nicht so aus, als würden Sie die richtige Datenbank im Fehlerhandler verwenden - sicherlich sollte Ihr try-Catch, der die Tabelle erstellt, im Aufruf von sp_MSforeachdb enthalten sein auch?

Ich meine, in Ihrem Text laufen Sie für jede Datenbank, einschließlich dieser in einem Versuchsfang:

CREATE TABLE [?].[SCHEMA].[SESSIONS]
(
   [authuser]     [VARCHAR](30) NULL,
   [sessionID]    [CHAR](36) NULL,
   [sessionStart] [DATETIME] NULL
)

Noch etwas - im Moment scheinen Sie den Wert reviewadmin.sessions fest codiert zu haben in Ihrem Berechtigungserteilungscode - ich nehme an, Sie meinten, dass dies Ihr neuer [?].[Schema].[Sessions] sein sollte table - was wiederum im Aufruf von sp_MSforeachdb enthalten sein sollte damit es weiß, auf welcher Datenbank es laufen soll.

Ich hoffe, ich habe Ihnen genug gegeben, um weiterzumachen, ich fürchte, ich bin nicht an einer Maschine, wo ich das Ganze schreiben und testen kann!

Wenn Sie nur Datenbanken mit dem Namen xyz_% möchten :

exec sp_MSforeachdb 'IF DB_NAME() LIKE ''xyz_%''
BEGIN
 DELETE FROM [?].schema.sessions WHERE name like ''xyz_%''
 AND sessionStart <DATEADD(mi, -5,GETDATE())
END'

Beachten Sie, dass wir jetzt die Prüfung auf DB_ID> 4 überspringen können, da sowieso keine der Systemdatenbanken Ihrer Namenskonvention entspricht.

OK, das habe ich mir nochmal überlegt. Anstatt es zu versuchen und dann den Fehler abzufangen, wenn es fehlschlägt, wie wäre es mit diesem neuen Plan:

  1. Überprüfen Sie, ob die Datenbank der gewünschten Namenskonvention entspricht.
  2. Überprüfen Sie, ob die Tabelle existiert.
  3. Erstellen Sie die Tabelle, wenn dies nicht der Fall ist, erteilen Sie die Berechtigungen wie zuvor.
  4. Machen Sie die Einfügung.

Dies sollte es hoffentlich tun:

EXEC Sp_msforeachdb 'IF ''?'' LIKE ''xyz_%''
                    BEGIN
                        IF OBJECT_ID(''?.REVIEWADMIN.Sessions'', ''U'') IS NULL
                        BEGIN
                            CREATE TABLE [?].ReviewAdmin.Sessions
                            (
                                [authuser]     [VARCHAR](30) NULL,
                                [sessionID]    [CHAR](36) NULL,
                                [sessionStart] [DATETIME] NULL
                            )

                            grant select,delete on reviewadmin.sessions to public;

                        END

                        DELETE FROM [?].ReviewAdmin.Sessions
                        WHERE sessionStart < DATEADD(mi, -5,GETDATE())

                    END'