Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để tôi có thể bỏ qua cơ sở dữ liệu hệ thống và cho phép công việc tác nhân SQL Server 2008 di chuyển qua ERROR_NUMBER 208?

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:

  1. 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.
  2. Kiểm tra xem bảng có tồn tại hay không.
  3. Tạo bảng nếu không, hãy cấp quyền như trước đây.
  4. 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'



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Danh sách các định dạng ngày có sẵn với CONVERT () trong SQL Server

  2. T-SQL:Đối lập với nối chuỗi - cách tách chuỗi thành nhiều bản ghi

  3. Chọn bản ghi đầu tiên

  4. SSRS - Giữ một bảng có cùng chiều rộng khi ẩn các cột động?

  5. java.lang.ClassNotFoundException:com.microsoft.jdbc.sqlserver.SQLServerDriver:Tôi có đang tải đúng trình điều khiển không?