[SQL SERVER]讓一般使用者執行DBCC TraceON

[SQL SERVER]讓一般使用者執行DBCC TraceON

一般給予AP的資料庫帳號基本是以最小為原則,

日前進行效能調校時,我為了提高FullScan速度不得已使用querytraceon 8649,

但DBCC Traceon需要sysadmin role才能順利執行,我雖然嘗試使用execute as 就是行不通,

後來G到一篇透過簽章方式假冒具有sysadmin role使用者來執行,

自己寫下來備忘。

 

--querytraceon 8649 test
create proc dbo.Test
AS
set nocount on
     select * from AdventureWorks2012.dbo.SalesOrderHeader t1
     join AdventureWorks2012.dbo.SalesOrderDetail t2 on t1.SalesOrderID=t2.SalesOrderID
     option(recompile,querytraceon 8649)   

go

 

--建立資料庫主要金鑰
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'xxxxx';
go

use mydb

go


CREATE CERTIFICATE mycert
WITH SUBJECT = 'Mycertificate';

--使用憑證來簽署SP
ADD SIGNATURE TO dbo.Test
BY CERTIFICATE mycert;
GO

--移除私鑰
ALTER CERTIFICATE mycert
REMOVE PRIVATE KEY;
GO

--取得該憑證公開部分的二進位格式
SELECT CERTENCODED(CERT_ID('mycert'));
GO

  USE master;
GO
--將憑證加入至 master 資料庫中
CREATE CERTIFICATE mycert
FROM BINARY =0x……
go

--建立登入並使用該憑證
CREATE LOGIN mycertuser
FROM CERTIFICATE mycert;
GO

--移除連接權限
REVOKE CONNECT SQL FROM mycertuser;
GO

--將該使用者加入 sysadmin role
ALTER SERVER ROLE sysadmin
ADD MEMBER mycertuser;

--建立一般登入使用者
CREATE LOGIN myTest
WITH PASSWORD = 'xxxx', DEFAULT_DATABASE = mydb;

use mydb
go
--建立資料庫使用者
CREATE USER myTest FROM LOGIN myTest;


--授予執行TEST權限
GRANT EXECUTE ON OBJECT::Test TO myTest;

 

使用mytest 使用者執行該SP

image

 

強制平行執行計畫

image

 

 

drop user myTest
drop login myTest

use master
go
drop  LOGIN mycertuser
drop CERTIFICATE mycert

 

 

--Update For SQL2012以前版本

由於 CERTENCODED function是SQL2012以後才有的,

所以之前的版本要把憑證匯入到其他資料庫需使用以下方法

1.備份現有憑證

BACKUP CERTIFICATE mycert TO FILE = 'e:\mycert';

 

2.從檔案匯入憑證

CREATE CERTIFICATE mycert 

    FROM FILE = 'e:\mycert' 

 

 

 

參考

ADD SIGNATURE (Transact-SQL)

Next-Level Parallel Plan Forcing: An Alternative to 8649

Forcing a Parallel Query Execution Plan

Is it possible to grant rights to DBCC TraceOn to a user