Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come posso omettere i database di sistema e consentire al processo dell'agente di SQL Server 2008 di spostarsi oltre ERROR_NUMBER 208?

Potresti provare a usare DB_ID() , credo che il DB_ID() è sempre 1-4 (a meno che tu non abbia un database di distribuzione ). In teoria, controlla solo se DB_ID() è maggiore di 4:

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

Inoltre non sembra che tu stia usando il database corretto nel gestore degli errori - sicuramente il tuo try catch che crea la tabella dovrebbe essere nella chiamata a sp_MSforeachdb anche tu?

Voglio dire nel tuo testo stai correndo per ogni db, incluso questo in un tentativo di cattura:

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

Un'altra cosa:al momento sembra che tu abbia codificato il valore reviewadmin.sessions nel codice di concessione dell'autorizzazione - suppongo che intendessi che fosse il tuo nuovo [?].[Schema].[Sessions] table - di nuovo che dovrebbe essere nella chiamata a sp_MSforeachdb quindi sa su quale database eseguire.

Spero di averti dato abbastanza per andare avanti, non sono a una macchina dove posso scrivere e testare tutto, temo!

Se vuoi solo database con il nome 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'

Nota che ora possiamo saltare il controllo per DB_ID> 4, poiché nessuno dei database di sistema corrisponde comunque alla tua convenzione di denominazione.

OK, ci ho ripensato. Piuttosto che provare e poi rilevare l'errore se fallisce, che ne dici di questo nuovo piano:

  1. Verifica se il database corrisponde alla convenzione di denominazione che desideri.
  2. Verifica se la tabella esiste.
  3. Crea la tabella in caso contrario, concedi i permessi come prima.
  4. Fai l'inserto.

Si spera che questo dovrebbe farlo:

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'