sql >> データベース >  >> RDS >> Sqlserver

システム データベースを省略して、SQL Server 2008 エージェント ジョブが ERROR_NUMBER 208 を超えて移動できるようにするにはどうすればよいですか?

    DB_ID() を使用してみてください 、 DB_ID() だと思います 常に 1 ~ 4 です (ディストリビューション データベース がない場合) )。理論的には、DB_ID() が 4 より大きいかどうかを確認するだけです:

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

    また、エラー ハンドラで正しいデータベースを使用しているようには見えません。確かに、テーブルを作成する try catch は sp_MSforeachdb の呼び出しに含まれている必要があります。

    これは、try catch にこれを含めて、各データベースに対して実行しているテキストで意味します:

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

    もう1つ-現時点では、値 reviewadmin.sessions をハードコーディングしているようです あなたの許可付与コードで - 私はそれがあなたの新しい [?].[Schema].[Sessions] であることを意味していたと思います テーブル - sp_MSforeachdb への呼び出しに含まれている必要があります。 そのため、実行するデータベースが認識されます。

    先に進むのに十分な情報を提供できたことを願っています。残念ながら、すべてを記述してテストできるマシンがありません!

    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'
    

    命名規則に一致するシステム データベースがないため、DB_ID> 4 のチェックをスキップできることに注意してください。

    わかりました、私はこれを再考しました。試して失敗した場合にエラーをキャッチするのではなく、次の新しい計画はどうですか:

    <オール>
  1. データベースが希望する命名規則と一致しているかどうかを確認してください。
  2. テーブルが存在するかどうかを確認してください。
  3. 作成されていない場合はテーブルを作成し、以前と同様に権限を付与します。
  4. 挿入します。
  5. これでうまくいくはずです:

    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. MySql:親と子による注文

    2. Pandas.read_sql の SQLAlchemy クエリに変数をバインドする

    3. チーム内でOracleのストアドプロシージャを操作するためのツール?

    4. Dockerfileはinitialize.sqlからテーブルを作成しません