Vous pouvez essayer d'utiliser DB_ID()
, je crois que le DB_ID()
est toujours compris entre 1 et 4 (sauf si vous disposez d'une base de données de distribution
). En théorie, il suffit de vérifier si DB_ID() est supérieur à 4 :
exec sp_MSforeachdb 'IF DB_ID(''?'')) > 4
BEGIN
DELETE FROM [?].schema.sessions WHERE name like ''xyz_%''
AND sessionStart <DATEADD(mi, -5,GETDATE())
END'
De plus, il ne semble pas que vous utilisiez la bonne base de données dans le gestionnaire d'erreurs - votre capture d'essai qui crée la table devrait sûrement figurer dans l'appel à sp_MSforeachdb
aussi ?
Je veux dire dans votre texte que vous exécutez pour chaque db, y compris ceci dans un try catch :
CREATE TABLE [?].[SCHEMA].[SESSIONS]
(
[authuser] [VARCHAR](30) NULL,
[sessionID] [CHAR](36) NULL,
[sessionStart] [DATETIME] NULL
)
Encore une chose - pour le moment, vous semblez avoir codé en dur la valeur reviewadmin.sessions
dans votre code d'autorisation - je suppose que vous vouliez dire que c'était votre nouveau [?].[Schema].[Sessions]
table - encore une fois qui devrait être dans l'appel à sp_MSforeachdb
afin qu'il sache sur quelle base de données s'exécuter.
J'espère que je vous en ai donné assez pour continuer, je ne suis pas sur une machine où je peux écrire et tester le tout, j'en ai peur !
Si vous voulez juste des bases de données avec le nom 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'
Notez que nous pouvons maintenant ignorer la vérification de DB_ID> 4, car aucune des bases de données système ne correspond de toute façon à votre convention de dénomination.
OK, j'ai repensé à ça. Plutôt que d'essayer et de détecter l'erreur en cas d'échec, que diriez-vous de ce nouveau plan :
- Vérifiez si la base de données correspond à la convention de dénomination souhaitée.
- Vérifiez si le tableau existe.
- Créez la table si ce n'est pas le cas, accordez les autorisations comme avant.
- Faites l'insertion.
Cela devrait, espérons-le, le faire :
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'