sql >> Database >  >> RDS >> Sqlserver

Hoe kan ik systeemdatabases weglaten en de agenttaak van SQL Server 2008 voorbij ERROR_NUMBER 208 laten gaan?

Je zou kunnen proberen om DB_ID() . te gebruiken , ik geloof dat de DB_ID() is altijd 1-4 (tenzij je een distributiedatabase hebt ). Controleer in theorie of DB_ID() groter is dan 4:

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

Het lijkt er ook op dat u niet de juiste database in de foutafhandeling gebruikt - uw try-catch die de tabel maakt, moet zeker in de aanroep van sp_MSforeachdb staan ook?

Ik bedoel in je tekst die je uitvoert voor elke db, inclusief dit in een try-catch:

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

Nog een ding - op dit moment lijkt het erop dat je de waarde reviewadmin.sessions hard hebt gecodeerd in de code voor het verlenen van toestemming - ik neem aan dat je dat bedoelde als je nieuwe [?].[Schema].[Sessions] tabel - opnieuw die in de aanroep van sp_MSforeachdb . zou moeten staan zodat het weet op welke database het moet draaien.

Ik hoop dat ik je genoeg heb gegeven om door te gaan, ik ben niet bij een machine waar ik alles kan schrijven en testen, vrees ik!

Als u alleen databases wilt met de naam 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'

Merk op dat we nu de controle voor DB_ID> 4 kunnen overslaan, aangezien geen van de systeemdatabases toch overeenkomt met uw naamgevingsconventie.

Oké, ik heb dit heroverwogen. In plaats van te proberen en dan de fout op te vangen als het mislukt, wat dacht je van dit nieuwe plan:

  1. Controleer of de database overeenkomt met de gewenste naamgeving.
  2. Controleer of de tabel bestaat.
  3. Maak de tabel als dat niet het geval is, verleen de machtigingen zoals voorheen.
  4. Doe de invoeging.

Dit zou het hopelijk moeten doen:

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. Onder welke omstandigheden verhoogt ROWNUM=1 de prestaties in een bestaande syle-query aanzienlijk?

  2. SQL:Telling krijgen uit veel tabellen voor een gebruikersrecord in de USER-tabel. Wat is de beste aanpak?

  3. Maak verbinding met MSSQL-database met Flask-SQLAlchemy

  4. Postgres hoe berekende kolom met clausule te implementeren