Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak mogę pominąć systemowe bazy danych i zezwolić na przejście zadania agenta SQL Server 2008 poza ERROR_NUMBER 208?

Możesz spróbować użyć DB_ID() , uważam, że DB_ID() to zawsze 1-4 (chyba że masz bazę dystrybucji ). W teorii wystarczy sprawdzić, czy DB_ID() jest większe niż 4:

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

Wygląda też na to, że nie używasz poprawnej bazy danych w programie obsługi błędów — z pewnością próba, która tworzy tabelę, powinna znajdować się w wywołaniu sp_MSforeachdb również?

Mam na myśli to, że w swoim tekście uruchamiasz dla każdej bazy danych, włączając to w try catch:

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

Jeszcze jedno - w tej chwili wydaje się, że na stałe zakodowałeś wartość reviewadmin.sessions w twoim kodzie przyznawania uprawnień - zakładam, że miałeś na myśli to, że ma to być twój nowy [?].[Schema].[Sessions] tabela - ponownie, która powinna znajdować się w wywołaniu sp_MSforeachdb więc wie, na której bazie danych ma działać.

Mam nadzieję, że dałem ci wystarczająco dużo, aby kontynuować, nie jestem przy maszynie, w której mogę pisać i testować wszystko, czego się boję!

Jeśli potrzebujesz tylko baz danych o nazwie 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'

Zauważ, że możemy teraz pominąć sprawdzanie DB_ID> 4, ponieważ żadna z systemowych baz danych i tak nie pasuje do twojej konwencji nazewnictwa.

OK, przemyśliłem to. Zamiast próbować, a następnie wyłapywać błąd, jeśli się nie powiedzie, co powiesz na ten nowy plan:

  1. Sprawdź, czy baza danych jest zgodna z pożądaną konwencją nazewnictwa.
  2. Sprawdź, czy tabela istnieje.
  3. Utwórz tabelę, jeśli nie, przyznaj uprawnienia jak poprzednio.
  4. Zrób wstawkę.

Miejmy nadzieję, że to powinno wystarczyć:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zdalne połączenie z bazą danych otwarte przez długi czas

  2. Jak wygenerować skrypt INSERT dla istniejącej tabeli programu SQL Server, która zawiera wszystkie przechowywane wiersze?

  3. SQL Server :jak wybrać stałą liczbę wierszy (wybierz każdą x-tą wartość)

  4. Użycie klauzuli OUTPUT do wstawienia wartości spoza INSERTED

  5. 7 sposobów na znalezienie zduplikowanych wierszy w SQL Server, ignorując dowolny klucz podstawowy