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:
- Verifica se il database corrisponde alla convenzione di denominazione che desideri.
- Verifica se la tabella esiste.
- Crea la tabella in caso contrario, concedi i permessi come prima.
- 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'