sql >> Databáze >  >> RDS >> Sqlserver

Jak mohu vynechat systémové databáze a umožnit úloze agenta SQL Server 2008 přejít za ERROR_NUMBER 208?

Můžete zkusit použít DB_ID() , věřím v DB_ID() je vždy 1-4 (pokud nemáte distribuční databázi ). Teoreticky stačí zkontrolovat, zda je DB_ID() větší než 4:

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

Také to nevypadá, že používáte správnou databázi v obslužné rutině chyb - váš pokusný úlovek, který vytváří tabulku, by měl být ve volání sp_MSforeachdb také?

Myslím tím, že ve vašem textu běžíte pro každou db, včetně tohoto v pokusu:

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

Ještě jedna věc – v tuto chvíli se zdá, že máte pevně zakódovanou hodnotu reviewadmin.sessions ve vašem kódu udělování povolení – předpokládám, že jste to mysleli jako svůj nový [?].[Schema].[Sessions] tabulka - opět která by měla být ve volání sp_MSforeachdb takže ví, na které databázi má běžet.

Doufám, že jsem vám dal dost, abyste mohli pokračovat, nejsem u stroje, kde bych mohl napsat a otestovat celou věc, obávám se!

Pokud chcete pouze databáze s názvem 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'

Všimněte si, že nyní můžeme přeskočit kontrolu DB_ID> 4, protože žádná ze systémových databází stejně neodpovídá vaší konvenci pojmenování.

Dobře, přehodnotil jsem to. Namísto pokusu a následného zachycení chyby, pokud selže, co říkáte na tento nový plán:

  1. Zkontrolujte, zda databáze odpovídá požadované konvenci pojmenování.
  2. Zkontrolujte, zda tabulka existuje.
  3. Pokud ne, vytvořte tabulku, udělte oprávnění jako dříve.
  4. Proveďte vložení.

To by snad mělo stačit:

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. Nevyřešený symbol:sql::mysql::get_driver_instance(void)

  2. ROracle - dbWriteTable, sloupce data

  3. Záložní databáze MySQL

  4. Povolení SSL nebo TLS v Oracle Apps R12