Je zou kunnen proberen om DB_ID()
. te gebruiken , ik geloof dat de DB_ID()
is altijd 1-4 (tenzij je een distributiedatabase
hebt ). Controleer in theorie of DB_ID() groter is dan 4:
exec sp_MSforeachdb 'IF DB_ID(''?'')) > 4
BEGIN
DELETE FROM [?].schema.sessions WHERE name like ''xyz_%''
AND sessionStart <DATEADD(mi, -5,GETDATE())
END'
Het lijkt er ook op dat u niet de juiste database in de foutafhandeling gebruikt - uw try-catch die de tabel maakt, moet zeker in de aanroep van sp_MSforeachdb
staan ook?
Ik bedoel in je tekst die je uitvoert voor elke db, inclusief dit in een try-catch:
CREATE TABLE [?].[SCHEMA].[SESSIONS]
(
[authuser] [VARCHAR](30) NULL,
[sessionID] [CHAR](36) NULL,
[sessionStart] [DATETIME] NULL
)
Nog een ding - op dit moment lijkt het erop dat je de waarde reviewadmin.sessions
hard hebt gecodeerd in de code voor het verlenen van toestemming - ik neem aan dat je dat bedoelde als je nieuwe [?].[Schema].[Sessions]
tabel - opnieuw die in de aanroep van sp_MSforeachdb
. zou moeten staan zodat het weet op welke database het moet draaien.
Ik hoop dat ik je genoeg heb gegeven om door te gaan, ik ben niet bij een machine waar ik alles kan schrijven en testen, vrees ik!
Als u alleen databases wilt met de naam 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'
Merk op dat we nu de controle voor DB_ID> 4 kunnen overslaan, aangezien geen van de systeemdatabases toch overeenkomt met uw naamgevingsconventie.
Oké, ik heb dit heroverwogen. In plaats van te proberen en dan de fout op te vangen als het mislukt, wat dacht je van dit nieuwe plan:
- Controleer of de database overeenkomt met de gewenste naamgeving.
- Controleer of de tabel bestaat.
- Maak de tabel als dat niet het geval is, verleen de machtigingen zoals voorheen.
- Doe de invoeging.
Dit zou het hopelijk moeten doen:
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'