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:
- Kontrollera om databasen matchar den namnkonvention du vill ha.
- Kontrollera om tabellen finns.
- Skapa tabellen om den inte gör det, ge behörigheter som tidigare.
- 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'