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 のチェックをスキップできることに注意してください。
わかりました、私はこれを再考しました。試して失敗した場合にエラーをキャッチするのではなく、次の新しい計画はどうですか:
<オール>これでうまくいくはずです:
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'