sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag utelämna systemdatabaser och tillåta SQL Server 2008-agentjobbet att gå förbi ERROR_NUMBER 208?

Du kan prova att använda DB_ID() , jag tror på DB_ID() är alltid 1-4 (om du inte har en distributionsdatabas ). I teorin, kolla bara om DB_ID() är större än 4:

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

Det ser inte heller ut som att du använder rätt databas i felhanteraren - din try catch som skapar tabellen borde säkert finnas i anropet till sp_MSforeachdb likaså?

Jag menar i din text du kör för varje db, inklusive detta i en try catch:

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

En sak till - för tillfället verkar du ha hårdkodat värdet reviewadmin.sessions i din tillståndsgivande kod - jag antar att du menade att det skulle vara din nya [?].[Schema].[Sessions] tabell - igen som ska finnas i anropet till sp_MSforeachdb så den vet vilken databas den ska köras på.

Jag hoppas att jag har gett dig tillräckligt för att fortsätta, jag är inte vid en maskin där jag kan skriva och testa det hela är jag rädd!

Om du bara vill ha databaser med namnet xyz_% :

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

Observera att vi nu kan hoppa över kontrollen för DB_ID> 4, eftersom ingen av systemdatabaserna ändå matchar din namnkonvention.

Okej, jag har tänkt om det här. Istället för att försöka och sedan fånga felet om det misslyckas, vad sägs om den här nya planen:

  1. Kontrollera om databasen matchar den namnkonvention du vill ha.
  2. Kontrollera om tabellen finns.
  3. Skapa tabellen om den inte gör det, ge behörigheter som tidigare.
  4. Infoga.

Detta borde förhoppningsvis göra det:

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'



  1. Placera händelse i Windows Event Log med Oracle

  2. hur man ignorerar ett villkor i where-klausulen

  3. RODBC-frågan returnerar inte data

  4. Hur mycket diskutrymme behövs för att lagra ett NULL-värde med postgresql DB?