Anda dapat mencoba menggunakan DB_ID()
, saya percaya DB_ID()
selalu 1-4 (kecuali jika Anda memiliki basis data distribusi
). Secara teori, cukup periksa untuk melihat apakah DB_ID() lebih besar dari 4:
exec sp_MSforeachdb 'IF DB_ID(''?'')) > 4
BEGIN
DELETE FROM [?].schema.sessions WHERE name like ''xyz_%''
AND sessionStart <DATEADD(mi, -5,GETDATE())
END'
Juga sepertinya Anda tidak menggunakan database yang benar di penangan kesalahan - pasti tangkapan percobaan Anda yang membuat tabel harus di panggil ke sp_MSforeachdb
juga?
Maksud saya dalam teks Anda, Anda menjalankan untuk setiap db, termasuk ini dalam tangkapan percobaan:
CREATE TABLE [?].[SCHEMA].[SESSIONS]
(
[authuser] [VARCHAR](30) NULL,
[sessionID] [CHAR](36) NULL,
[sessionStart] [DATETIME] NULL
)
Satu hal lagi - saat ini Anda tampaknya sulit mengkodekan nilai reviewadmin.sessions
dalam kode pemberian izin Anda - saya berasumsi bahwa yang Anda maksud adalah [?].[Schema].[Sessions]
baru Anda. table - lagi yang harus di panggil ke sp_MSforeachdb
sehingga tahu database mana yang akan dijalankan.
Saya harap saya telah memberi Anda cukup untuk melanjutkan, saya tidak berada di mesin di mana saya dapat menulis &menguji semuanya, saya takut!
Jika Anda hanya ingin database dengan nama 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'
Perhatikan bahwa kita sekarang dapat melewati pemeriksaan untuk DB_ID> 4, karena tidak ada database sistem yang cocok dengan konvensi penamaan Anda.
Oke, saya sudah memikirkan kembali ini. Daripada mencoba dan kemudian menangkap kesalahan jika gagal, bagaimana dengan rencana baru ini:
- Periksa apakah database cocok dengan konvensi penamaan yang Anda inginkan.
- Periksa apakah tabel ada.
- Buat tabel jika tidak, berikan izin seperti sebelumnya.
- Lakukan penyisipan.
Semoga ini berhasil:
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'