2009-08-12 14 views
9

मैं ऑडिट ट्रिगर से कुछ प्रकार के लेनदेन आईडी को संग्रहीत करने पर विचार कर रहा था। समाधान इस पोस्ट SQL Server Triggers - grouping by transactions में sys.dm_tran_current_transaction का उपयोग करने के लिए प्रतीत होता है।ऑडिट ट्रिगर में वर्तमान लेनदेन आईडी

हालांकि, मैं इस का उपयोग नहीं कर सकते क्योंकि एसक्यूएल बयान चल उपयोगकर्ता खाता "दृश्य सर्वर स्थिति" अनुमति और त्रुटि में परिणाम नहीं होगा:

 
Msg 297, Level 16, State 1, Line 3 
The user does not have permission to perform this action. 

किसी को भी इस दृश्य के लिए एक विकल्प के बारे में पता है कि इस दृश्य से चयन करने की अनुमति देने के लिए ट्रिगर पर एक समान लेनदेन आईडी या "EXECUTE AS के साथ" उपयोग करने का एक तरीका प्रदान करेगा।

"EXECUTE AS के साथ" मेरे प्रयासों से ऐसा लगता है कि सर्वर स्तर की अनुमतियां नहीं चलती हैं, जो वास्तव में अपेक्षित है क्योंकि यह डेटाबेस उपयोगकर्ता का प्रतिरूपण कर रहा है।

उत्तर

13

आप कोड हस्ताक्षर का उपयोग कर लगभग किसी भी सुरक्षा समस्या को हल कर सकते हैं। सबसे दानेदार और बारीक ट्यून किए गए एक्सेस कंट्रोल, समझने के लिए कठिन तरफ थोड़ा सा है।

ट्रिगर पर EXECUTE AS OWNER का उपयोग करें, एक प्रमाणपत्र बनाएं, ट्रिगर पर हस्ताक्षर करें, निजी कुंजी ड्रॉप करें (ताकि कोई भी इसे फिर से कुछ भी हस्ताक्षर करने के लिए उपयोग न कर सके), प्रमाण पत्र (केवल सार्वजनिक कुंजी) निर्यात करें, प्रमाणपत्र आयात करें मास्टर, सर्टिफिकेट से व्युत्पन्न लॉगिन बनाएं, इस लॉगिन को प्रमाणित करें (extend the database execute as impersonation पर), फिर इस लॉगिन के लिए सर्वर सर्वर देखें। यह बुलेट प्रूफ है, पूरी तरह से नियंत्रित निजीकृत नियंत्रण। यदि ट्रिगर को बदलने की जरूरत है, तो हस्ताक्षर प्रक्रिया (प्रमाणित लॉगिन और अनुदान सहित) को फिर से किया जाना है। सुरक्षा बिंदु से, यह वांछित है (आप विशिष्ट ट्रिगर के संस्करण पर हस्ताक्षर कर रहे हैं), परिचालन बिंदु से बल्कि एक पिटा है, लेकिन यह प्रबंधनीय है।

create table t (i int); 
create table audit (transaction_id int); 
go 

create trigger t_audit_trigger 
on t 
with execute as owner 
after insert, update, delete 
as 
begin 
    set nocount on; 
    insert into audit (transaction_id) 
    select transaction_id from sys.dm_tran_current_transaction; 
    if (@@ROWCOUNT != 1) 
     raiserror(N'Failed to audit transaction', 16, 1); 
end 
go 

create certificate t_audit_view_server 
    encryption by password = 'Password#123' 
    with subject = N't_audit_view_server' 
    , start_date = '08/10/2009'; 
go 

add signature to t_audit_trigger 
    by certificate t_audit_view_server 
    with password = 'Password#123'; 
go 

alter certificate t_audit_view_server 
    remove private key; 

backup certificate t_audit_view_server 
    to file = 'c:\temp\t_audit_view_server.cer'; 
go 

use master; 
go 

create certificate t_audit_view_server 
    from file = 'c:\temp\t_audit_view_server.cer'; 
go 

create login t_audit_view_server_login 
    from certificate t_audit_view_server; 
go 

grant authenticate server to t_audit_view_server_login; 
grant view server state to t_audit_view_server_login; 
go 
+0

इस विषय पर एमएसडीएन विषय के अतिरिक्त लिंक के लिए धन्यवाद, बहुत जानकारीपूर्ण। –

+0

क्लब लॉल में आपका स्वागत है। आपके साथ, अब हम ग्रह पर 4 लोग हैं जो वास्तव में उस लेख को पढ़ते हैं। –

+0

यदि आपके पास कई ट्रिगर्स हैं, तो आप उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन के अंदर दृश्य को क्वेरी कर सकते हैं, और प्रमाण पत्र के साथ उस फ़ंक्शन पर हस्ताक्षर कर सकते हैं (जैसा कि उत्तर # 6 में उत्तर दिया गया है http://dbaspot.com/sqlserver-programming/197082- कहीं- किसी भी कार्य-कथन-रिटर्न-लेन-देन identific-आईडी-बीच-begin-ट्रांस प्रतिबद्ध-trans.html)। फिर आप उस ट्रिगर के अंदर उस फ़ंक्शन का उपयोग कर सकते हैं। इसलिए, जब आप कोई परिवर्तन करने का निर्णय लेते हैं तो आपको एक ही ऑब्जेक्ट पुनः हस्ताक्षर करना होगा। –

2

हालांकि SQL सर्वर 2008 में कस्टम निर्मित ऑडिटिंग फ्रेमवर्क का उपयोग करने के बजाय सीधे आपके प्रश्न का उत्तर नहीं दे रहा है, तो आप चेंज डेटा कैप्चर टेक्नोलॉजी का उपयोग कर सकते हैं।

पुस्तकें ऑनलाइन से निम्न संदर्भ देखें: http://msdn.microsoft.com/en-us/library/bb522489.aspx

संपादित करें (समाधान, जोड़ा): यहाँ कैसे प्रणाली दृश्य का उपयोग करने में एक संग्रहीत प्रक्रिया बनाने के लिए की एक पूर्वाभ्यास है, खंड के रूप में अमल का इस्तेमाल कर रही और प्रतिरूपण का उपयोग कर।

USE MASTER; 

select * from sys.dm_tran_current_transaction 

--Create a login with view server state permissions 
CREATE LOGIN ViewServerStateLogin 
WITH password = 'Hello123'; 
CREATE user ViewServerStateLogin; 

--Create a login to test the permissions assignment 
CREATE LOGIN TestViewServerState 
WITH password = 'Hello123'; 
CREATE user TestViewServerState; 

--Test with Login 
EXECUTE AS LOGIN = 'TestViewServerState'; 
    --This obviously does not work. 
    select * from sys.dm_tran_current_transaction 
revert; 

--Grant view server state permission to the ViewServerStateLogin 
GRANT VIEW SERVER state TO ViewServerStateLogin; 

--Create a procedure to wrap the call to the system view 
CREATE PROCEDURE proc_TestViewServerState 

AS 
    SET NOCOUNT ON; 

    EXECUTE AS LOGIN='ViewServerStateLogin' 

     select * from sys.dm_tran_current_transaction 

    revert; 

RETURN(0); 

--Assign execute permission to the test accounts 
GRANT EXECUTE ON proc_TestViewServerState TO TestViewServerState 

--Grant impersonation rights to the test login 
GRANT IMPERSONATE ON LOGIN::ViewServerStateLogin TO TestViewServerState 

--Test with Procedure 
EXECUTE AS LOGIN = 'TestViewServerState'; 
    EXEC proc_TestViewServerState 
revert; 
+0

TestViewServerState impersonate अनुमति प्रदान के साथ ही समस्या यह है कि उपयोगकर्ता कर सकते हैं तो भी कार्य करें: लॉगइन रूप में निष्पादित = 'ViewServerStateLogin' चयन * sys.dm_tran_database_transactions से के रूप में dtdt वापस लौटने मैं एक पर के रूप में अमल उपयोग करने की कोशिश प्रक्रिया, लेकिन फिर प्रतिरूपण एक सर्वर स्तर की अनुमति है, और डेटाबेस उपयोगकर्ता का प्रतिरूपण करते समय इस प्रकार खो जाता है। –

-1

संग्रहित प्रक्रिया को एन्क्रिप्ट करें और ViewServerStateLogin के लिए पीडब्ल्यू साझा न करें। फिर आपको लेखा परीक्षकों को संतुष्ट करने के लिए पर्याप्त घनत्व का काला बॉक्स मिलता है।

1

SQL सर्वर 2008 से, माइक्रोसॉफ्ट ने sys.dm_exec_requests पेश किया, जो sys.sysprocesses को बहिष्कृत करना है। यह दृश्य लेनदेन_आईडी देता है, और इसे दृश्य सर्वर राज्य प्रदान किए बिना बुलाया जा सकता है। Sys.sysprocesses की तरह, यह वर्तमान प्रक्रिया के लिए विवरण देता है यदि सर्वर देखें राज्य प्रदान नहीं किया गया है, और यदि सभी प्रक्रियाएं हैं।

संबंधित मुद्दे