Możesz spróbować użyć DB_ID()
, uważam, że DB_ID()
to zawsze 1-4 (chyba że masz bazę dystrybucji
). W teorii wystarczy sprawdzić, czy DB_ID() jest większe niż 4:
exec sp_MSforeachdb 'IF DB_ID(''?'')) > 4
BEGIN
DELETE FROM [?].schema.sessions WHERE name like ''xyz_%''
AND sessionStart <DATEADD(mi, -5,GETDATE())
END'
Wygląda też na to, że nie używasz poprawnej bazy danych w programie obsługi błędów — z pewnością próba, która tworzy tabelę, powinna znajdować się w wywołaniu sp_MSforeachdb
również?
Mam na myśli to, że w swoim tekście uruchamiasz dla każdej bazy danych, włączając to w try catch:
CREATE TABLE [?].[SCHEMA].[SESSIONS]
(
[authuser] [VARCHAR](30) NULL,
[sessionID] [CHAR](36) NULL,
[sessionStart] [DATETIME] NULL
)
Jeszcze jedno - w tej chwili wydaje się, że na stałe zakodowałeś wartość reviewadmin.sessions
w twoim kodzie przyznawania uprawnień - zakładam, że miałeś na myśli to, że ma to być twój nowy [?].[Schema].[Sessions]
tabela - ponownie, która powinna znajdować się w wywołaniu sp_MSforeachdb
więc wie, na której bazie danych ma działać.
Mam nadzieję, że dałem ci wystarczająco dużo, aby kontynuować, nie jestem przy maszynie, w której mogę pisać i testować wszystko, czego się boję!
Jeśli potrzebujesz tylko baz danych o nazwie 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'
Zauważ, że możemy teraz pominąć sprawdzanie DB_ID> 4, ponieważ żadna z systemowych baz danych i tak nie pasuje do twojej konwencji nazewnictwa.
OK, przemyśliłem to. Zamiast próbować, a następnie wyłapywać błąd, jeśli się nie powiedzie, co powiesz na ten nowy plan:
- Sprawdź, czy baza danych jest zgodna z pożądaną konwencją nazewnictwa.
- Sprawdź, czy tabela istnieje.
- Utwórz tabelę, jeśli nie, przyznaj uprawnienia jak poprzednio.
- Zrób wstawkę.
Miejmy nadzieję, że to powinno wystarczyć:
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'