Можете да опитате да използвате 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'
Също така не изглежда, че използвате правилната база данни в манипулатора на грешки - със сигурност вашият опит за улавяне, който създава таблицата, трябва да бъде в извикването на sp_MSforeachdb
също?
Имам предвид във вашия текст, че изпълнявате за всяка db, включително това в try catch:
CREATE TABLE [?].[SCHEMA].[SESSIONS]
(
[authuser] [VARCHAR](30) NULL,
[sessionID] [CHAR](36) NULL,
[sessionStart] [DATETIME] NULL
)
Още нещо - в момента изглежда, че сте кодирали трудно стойността 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'