sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo puedo omitir las bases de datos del sistema y permitir que el trabajo del agente de SQL Server 2008 supere el ERROR_NUMBER 208?

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?

  1. Compruebe si la base de datos coincide con la convención de nomenclatura que desea.
  2. Compruebe si la tabla existe.
  3. Cree la tabla si no lo hace, otorgue permisos como antes.
  4. 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'