Můžete zkusit použít DB_ID()
, věřím v DB_ID()
je vždy 1-4 (pokud nemáte distribuční databázi
). Teoreticky stačí zkontrolovat, zda je DB_ID() větší než 4:
exec sp_MSforeachdb 'IF DB_ID(''?'')) > 4
BEGIN
DELETE FROM [?].schema.sessions WHERE name like ''xyz_%''
AND sessionStart <DATEADD(mi, -5,GETDATE())
END'
Také to nevypadá, že používáte správnou databázi v obslužné rutině chyb - váš pokusný úlovek, který vytváří tabulku, by měl být ve volání sp_MSforeachdb
také?
Myslím tím, že ve vašem textu běžíte pro každou db, včetně tohoto v pokusu:
CREATE TABLE [?].[SCHEMA].[SESSIONS]
(
[authuser] [VARCHAR](30) NULL,
[sessionID] [CHAR](36) NULL,
[sessionStart] [DATETIME] NULL
)
Ještě jedna věc – v tuto chvíli se zdá, že máte pevně zakódovanou hodnotu reviewadmin.sessions
ve vašem kódu udělování povolení – předpokládám, že jste to mysleli jako svůj nový [?].[Schema].[Sessions]
tabulka - opět která by měla být ve volání sp_MSforeachdb
takže ví, na které databázi má běžet.
Doufám, že jsem vám dal dost, abyste mohli pokračovat, nejsem u stroje, kde bych mohl napsat a otestovat celou věc, obávám se!
Pokud chcete pouze databáze s názvem 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'
Všimněte si, že nyní můžeme přeskočit kontrolu DB_ID> 4, protože žádná ze systémových databází stejně neodpovídá vaší konvenci pojmenování.
Dobře, přehodnotil jsem to. Namísto pokusu a následného zachycení chyby, pokud selže, co říkáte na tento nový plán:
- Zkontrolujte, zda databáze odpovídá požadované konvenci pojmenování.
- Zkontrolujte, zda tabulka existuje.
- Pokud ne, vytvořte tabulku, udělte oprávnění jako dříve.
- Proveďte vložení.
To by snad mělo stačit:
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'