sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan kan jeg udelade systemdatabaser og tillade SQL Server 2008-agentjob at flytte forbi ERROR_NUMBER 208?

Du kan prøve at bruge DB_ID() , jeg tror på DB_ID() er altid 1-4 (medmindre du har en distributionsdatabase ). I teorien skal du bare kontrollere, om DB_ID() er større end 4:

exec sp_MSforeachdb 'IF DB_ID(''?'')) > 4
BEGIN
 DELETE FROM [?].schema.sessions WHERE name like ''xyz_%''
 AND sessionStart <DATEADD(mi, -5,GETDATE())
END' 

Det ser heller ikke ud til, at du bruger den korrekte database i fejlbehandleren - din try catch, der opretter tabellen, skal helt sikkert være i kaldet til sp_MSforeachdb også?

Jeg mener i din tekst, at du kører for hver db, inklusive dette i en try catch:

CREATE TABLE [?].[SCHEMA].[SESSIONS]
(
   [authuser]     [VARCHAR](30) NULL,
   [sessionID]    [CHAR](36) NULL,
   [sessionStart] [DATETIME] NULL
)

En ting mere - i øjeblikket ser du ud til at du har hårdkodet værdien reviewadmin.sessions i din tilladelseskode - jeg går ud fra, at du mente, at det skulle være din nye [?].[Schema].[Sessions] tabel - igen som skulle være i opkaldet til sp_MSforeachdb så den ved hvilken database den skal køre på.

Jeg håber, jeg har givet dig nok til at fortsætte, jeg er ikke ved en maskine, hvor jeg kan skrive og teste det hele, er jeg bange for!

Hvis du bare vil have databaser med navnet 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'

Bemærk, at vi nu kan springe kontrollen for DB_ID> 4 over, da ingen af ​​systemdatabaserne alligevel matcher din navnekonvention.

Okay, jeg har gentænkt det her. I stedet for at prøve og derefter fange fejlen, hvis den mislykkes, hvad med denne nye plan:

  1. Tjek, om databasen matcher den navngivningskonvention, du ønsker.
  2. Tjek, om tabellen findes.
  3. Opret tabellen, hvis den ikke gør det, giv tilladelser som før.
  4. Foretag indsættelsen.

Dette skulle forhåbentlig gøre det:

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'



  1. ORA-00900:ugyldig SQL-sætningsfejl? Hvad er der galt med min sql?

  2. Min PostgreSQL-database er løbet tør for diskplads

  3. Kategorisere mysql-data i separate html-tabeller?

  4. Databasemodellering:Hvordan kategoriserer man produkter som Amazon?