Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como posso omitir bancos de dados do sistema e permitir que o trabalho do agente do SQL Server 2008 passe de ERROR_NUMBER 208?


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:
  1. Verifique se o banco de dados corresponde à convenção de nomenclatura desejada.
  2. Verifique se a tabela existe.
  3. Crie a tabela, caso contrário, conceda permissões como antes.
  4. 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'