Você pode tentar usar
DB_ID()
, acredito que o DB_ID()
é sempre 1-4 (a menos que você tenha um banco de dados de distribuição
). Em teoria, apenas verifique se DB_ID() é maior 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'
Também não parece que você está usando o banco de dados correto no manipulador de erros - certamente seu try catch que cria a tabela deve estar na chamada para
sp_MSforeachdb
também? Quero dizer, no seu texto, você está executando para cada db, incluindo isso em um try catch:
CREATE TABLE [?].[SCHEMA].[SESSIONS]
(
[authuser] [VARCHAR](30) NULL,
[sessionID] [CHAR](36) NULL,
[sessionStart] [DATETIME] NULL
)
Mais uma coisa - no momento você parece ter codificado o valor
reviewadmin.sessions
em seu código de concessão de permissão - suponho que você quis dizer que era seu novo [?].[Schema].[Sessions]
table - novamente que deve estar na chamada para sp_MSforeachdb
para que ele saiba em qual banco de dados executar. Espero ter lhe dado o suficiente para continuar, não estou em uma máquina onde posso escrever e testar a coisa toda, temo!
Se você quer apenas bancos de dados com o nome
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'
Observe que agora podemos pular a verificação de DB_ID> 4, já que nenhum dos bancos de dados do sistema corresponde à sua convenção de nomenclatura.
OK, eu repensei isso. Em vez de tentar e pegar o erro se falhar, que tal este novo plano:
- Verifique se o banco de dados corresponde à convenção de nomenclatura desejada.
- Verifique se a tabela existe.
- Crie a tabela, caso contrário, conceda permissões como antes.
- Faça a inserção.
Isso deve fazer isso:
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'