Cấp cho người dùng đặc quyền sử dụng QUERYTRACEON 9481


7

Microsoft đề nghị sử dụng OPTION (QUERYTRACEON 9481)cho các truy vấn có hiệu suất "xuống cấp" đối với cơ sở dữ liệu SQL Server 2014 chạy dưới mức tương thích 120.

Trong tình huống của tôi, "xuống cấp" có nghĩa là đi từ vài giây đến vài phút trở lên. Hiệu suất khôn ngoan, 9481 hoạt động cực kỳ tốt; tuy nhiên, người dùng thông thường nhận được một lỗi tốt thay vì kết quả truy vấn (chạy báo cáo SSRS):

User 'xxxxx' does not have permission to run DBCC TRACEON.

Tài liệu chỉ ra rằng người dùng phải là thành viên của vai trò sysadmin để chạy DBCC TRACEON.

Có cách giải quyết nào để cho phép những người không phải là sysadins chạy các truy vấn sử dụng gợi ý này không?

Tôi không muốn giảm mức độ tương thích xuống 110 vì phần lớn các truy vấn của chúng tôi đều được chấp nhận hoặc hoạt động tốt hơn.

Câu trả lời:



0

Vui lòng sử dụng tùy chọn gợi ý vì nó không cần sự cho phép.

TÙY CHỌN (SỬ DỤNG GỢI Ý ('FORCE_LEGACY_CARDINALITY_ESTIMATION'))


Điều đó chỉ hoạt động cho năm 2016 và OP đang hỏi về năm 2014. Có thể cập nhật câu trả lời của bạn để phản ánh điều này, nó hữu ích cho những người khác nhưng không thực sự trả lời câu hỏi ban đầu.
HandyD

-1

Thay vì sử dụng TÙY CHỌN (QUERYTRACEON 9481), đây là một giải pháp / giải pháp được đề xuất.
Nó cho phép người dùng không sa thay đổi Công cụ ước tính Cardinality cho câu lệnh, truy vấn hoặc cuộc gọi thủ tục cụ thể (cho phiên hiện tại).

Giải pháp:

Kimberly Tripp đã giải thích tuyệt vời trong bài đăng của mình trên sqlskills.com:
"Đặt CE TraceFlags trên cơ sở truy vấn theo truy vấn (hoặc phiên)"

  1. Tạo một thủ tục lưu trữ trên cơ sở dữ liệu msdb, cho phép thiết lập Cờ theo dõi mong muốn mà không có quyền sysadmin.
    (tất nhiên, sysadmin đảm nhiệm việc thiết lập danh sách các giá trị Trace Flag được phép).

  2. Bao bọc bất kỳ câu lệnh có vấn đề nào (sql động, truy vấn đặc biệt hoặc cuộc gọi thủ tục) bằng một cuộc gọi đến Quy trình được lưu trữ này và thay đổi cờ theo dõi phiên để thực hiện.
    Điều này cho phép người dùng có quyền thấp hơn thay đổi Công cụ ước tính Cardinality để thực thi câu lệnh có vấn đề.

Ví dụ sử dụng:

EXEC msdb.dbo.msdbSetTraceFlag 9481, 1; 
GO  

Problematic STATEMENT or PROCEDURE   

EXEC msdb.dbo.msdbSetTraceFlag 9481, 0;  -- don't remember to turn it back off!    
GO

Mã thủ tục lưu trữ:

USE msdb;
GO

CREATE PROCEDURE msdbSetTraceFlag
    (@TraceFlag int,
     @OnOff bit = 0)
WITH EXECUTE AS OWNER
AS
DECLARE @OnOffStr char(1) = @OnOff;
-- Sysadmins can add supported trace flags and then use this
-- from their applications
IF @TraceFlag NOT IN (
              9481 -- LegacyCE if database is compat mode 120 or higher
            , 2312 -- NewCE if database compat mode 110 or lower
                     )
     BEGIN
         RAISERROR('The Trace Flag supplied is not supported. Please contact your system administrator to determine inclusion of this trace flag: %i.', 16, 1, @TraceFlag);
         RETURN
     END
ELSE
     BEGIN
         DECLARE @ExecStr nvarchar(100);
         IF @OnOff = 1
             SELECT @ExecStr = N'DBCC TRACEON(' + CONVERT(nvarchar(4), @TraceFlag) + N')';
         ELSE
             SELECT @ExecStr = N'DBCC TRACEOFF(' + CONVERT(nvarchar(4), @TraceFlag) + N')';
         -- SELECT (@ExecStr)
         EXEC(@ExecStr)
         -- RAISERROR (N'TraceFlag: %i has been set to:%s (1 = ON, 0 = OFF).', 10, 1, @TraceFlag, @OnOffStr);
     END;
GO

GRANT EXECUTE ON msdbSetTraceFlag TO PUBLIC --or to a specific set of users;
GO

Lưu ý: Quy trình được lưu trữ này được tạo trong msdb chứ không phải trên master, vì điều kiện tiên quyết "đáng tin cậy", được mặc định cho msdb.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.