Bạn có thể thử sử dụng DB_ID()
, Tôi tin rằng DB_ID()
luôn là 1-4 (trừ khi bạn có cơ sở dữ liệu phân phối
). Về lý thuyết, chỉ cần kiểm tra xem DB_ID () có lớn hơn 4 hay không:
exec sp_MSforeachdb 'IF DB_ID(''?'')) > 4
BEGIN
DELETE FROM [?].schema.sessions WHERE name like ''xyz_%''
AND sessionStart <DATEADD(mi, -5,GETDATE())
END'
Ngoài ra, có vẻ như bạn đang sử dụng cơ sở dữ liệu chính xác trong trình xử lý lỗi - chắc chắn cách thử của bạn để tạo bảng phải nằm trong lệnh gọi tới sp_MSforeachdb
nữa?
Ý tôi là trong văn bản của bạn, bạn đang chạy cho từng db, bao gồm điều này trong một bản thử:
CREATE TABLE [?].[SCHEMA].[SESSIONS]
(
[authuser] [VARCHAR](30) NULL,
[sessionID] [CHAR](36) NULL,
[sessionStart] [DATETIME] NULL
)
Một điều nữa - tại thời điểm này, dường như bạn chưa mã hóa giá trị reviewadmin.sessions
trong mã cấp quyền của bạn - Tôi cho rằng bạn muốn đó là [?].[Schema].[Sessions]
bảng - một lần nữa sẽ có trong lệnh gọi tới sp_MSforeachdb
vì vậy nó biết cơ sở dữ liệu nào để chạy trên.
Tôi hy vọng tôi đã cho bạn đủ để tiếp tục, tôi không phải ở một cái máy mà tôi có thể viết và kiểm tra toàn bộ những gì tôi sợ!
Nếu bạn chỉ muốn cơ sở dữ liệu có tên 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'
Lưu ý rằng bây giờ chúng ta có thể bỏ qua việc kiểm tra DB_ID> 4, vì không có cơ sở dữ liệu hệ thống nào phù hợp với quy ước đặt tên của bạn.
OK, tôi đã nghĩ lại điều này. Thay vì thử và sau đó bắt lỗi nếu nó không thành công, còn gói mới này thì sao:
- Kiểm tra xem cơ sở dữ liệu có khớp với quy ước đặt tên bạn muốn không.
- Kiểm tra xem bảng có tồn tại hay không.
- Tạo bảng nếu không, hãy cấp quyền như trước đây.
- Thực hiện việc chèn.
Điều này hy vọng sẽ làm được:
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'