Podría intentar usar DB_ID()
, creo que el DB_ID()
es siempre 1-4 (a menos que tenga una base de datos de distribución
). En teoría, solo verifique si DB_ID() es mayor que 4:
exec sp_MSforeachdb 'IF DB_ID(''?'')) > 4
BEGIN
DELETE FROM [?].schema.sessions WHERE name like ''xyz_%''
AND sessionStart <DATEADD(mi, -5,GETDATE())
END'
Además, no parece que esté usando la base de datos correcta en el controlador de errores; seguramente su captura de prueba que crea la tabla debería estar en la llamada a sp_MSforeachdb
también?
Quiero decir en su texto que está ejecutando para cada db, incluido esto en una captura de prueba:
CREATE TABLE [?].[SCHEMA].[SESSIONS]
(
[authuser] [VARCHAR](30) NULL,
[sessionID] [CHAR](36) NULL,
[sessionStart] [DATETIME] NULL
)
Una cosa más:en este momento, parece que ha codificado el valor reviewadmin.sessions
en su código de concesión de permisos; supongo que quiso decir que ese sería su nuevo [?].[Schema].[Sessions]
table - nuevamente, que debería estar en la llamada a sp_MSforeachdb
para que sepa en qué base de datos ejecutar.
Espero haberte dado lo suficiente para continuar, ¡me temo que no estoy en una máquina donde pueda escribir y probar todo!
Si solo desea bases de datos con el nombre 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'
Tenga en cuenta que ahora podemos omitir la verificación de DB_ID> 4, ya que ninguna de las bases de datos del sistema coincide con su convención de nomenclatura de todos modos.
OK, he repensado esto. En lugar de intentarlo y luego detectar el error si falla, ¿qué tal este nuevo plan?
- Compruebe si la base de datos coincide con la convención de nomenclatura que desea.
- Compruebe si la tabla existe.
- Cree la tabla si no lo hace, otorgue permisos como antes.
- Haga la inserción.
Con suerte, esto debería hacerlo:
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'