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)"
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).
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.
SELECT * FROM <yourTableName> option (querytraceon 9481)