Du kan prøve at bruge DB_ID()
, jeg tror på DB_ID()
er altid 1-4 (medmindre du har en distributionsdatabase
). I teorien skal du bare kontrollere, om DB_ID() er større end 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 heller ikke ud til, at du bruger den korrekte database i fejlbehandleren - din try catch, der opretter tabellen, skal helt sikkert være i kaldet til sp_MSforeachdb
også?
Jeg mener i din tekst, at du kører for hver db, inklusive dette i en try catch:
CREATE TABLE [?].[SCHEMA].[SESSIONS]
(
[authuser] [VARCHAR](30) NULL,
[sessionID] [CHAR](36) NULL,
[sessionStart] [DATETIME] NULL
)
En ting mere - i øjeblikket ser du ud til at du har hårdkodet værdien reviewadmin.sessions
i din tilladelseskode - jeg går ud fra, at du mente, at det skulle være din nye [?].[Schema].[Sessions]
tabel - igen som skulle være i opkaldet til sp_MSforeachdb
så den ved hvilken database den skal køre på.
Jeg håber, jeg har givet dig nok til at fortsætte, jeg er ikke ved en maskine, hvor jeg kan skrive og teste det hele, er jeg bange for!
Hvis du bare vil have databaser med navnet 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'
Bemærk, at vi nu kan springe kontrollen for DB_ID> 4 over, da ingen af systemdatabaserne alligevel matcher din navnekonvention.
Okay, jeg har gentænkt det her. I stedet for at prøve og derefter fange fejlen, hvis den mislykkes, hvad med denne nye plan:
- Tjek, om databasen matcher den navngivningskonvention, du ønsker.
- Tjek, om tabellen findes.
- Opret tabellen, hvis den ikke gør det, giv tilladelser som før.
- Foretag indsættelsen.
Dette skulle forhåbentlig gøre 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'