2010-08-09 117 views
1

我想設置觸發器的方式,當管理員(不是用戶)對數據庫進行任何更改時,所有具有管理員名稱和時間的更改數據將保存在審計表(已創建)具有所有可能的字段。SQL Server 2008管理工作室觸發器

我已經在每個表上爲這些表中的任何更新創建觸發器。觸發器將信息保存在audittable中。但是,我想限制此操作僅限管理員。就像我只想保留管理員對他們的名字,時間和他們所做的更改(我有一個單獨的管理員名稱,用戶名,密碼以及所有表格)所做的更改記錄。

有人可以幫助我。 感謝

+1

因此,現在想要做一個更改而不留下審計線索的管理員只需模擬一個非管理員用戶?而且管理員將總是*能夠模仿非管理員用戶......我不會打電話給您的審計安全無恙。 – 2010-08-09 16:56:28

回答

1

爲了讓你可以使用用戶:

  1. 服務器級別(登錄)

    選擇SYSTEM_USER,SUSER_SNAME(),SUSER_SID()

  2. 分貝水平(db用戶)

    select session_user,current_user,user,user_name(),user_id()

比檢查該用戶是admin還是不在該附加表中。

0

根據您定義的「管理員」,您可以嘗試以下兩種功能之一。

SELECT IS_MEMBER('dbo'), IS_SRVROLEMEMBER('sysadmin') 

IS_MEMBER函數評估數據庫角色,IS_SRVROLEMEMBER評估服務器角色。所以,如果你想知道用戶是否是數據庫管理員,你可以使用IS_MEMBER。這些將適用於用戶定義的角色以及內置角色。

UPDATE:

下面是當服務器管理員將數據插入到表,將數據添加到審計表中的觸發器的例子。

CREATE TRIGGER trg_InfoUpdates ON tblCustomerInfo 
FOR INSERT AS 

    IF IS_SRVROLEMEMBER('sysadmin') = 1 
     BEGIN 
     INSERT INTO tblAuditLog (CustomerID) 
     SELECT CustomerID 
     FROM inserted 
     END 
    ; 
+0

好,但我怎麼能實現。例如,讓我們說我們有這樣任何一種更新的任何用戶提出: CREATE TRIGGER trg_InfoUpdates ON tblCustomerInfo 對於插入 AS DECLARE @CustomerID INT 選擇@CustomerID =(選擇的CustomerID FROM tblCustomerInfo) BEGIN INSERT INTO tblAuditLog(CustomerID) 值(@CustomerID) END 現在如何實現IS_SRVROLEMEMEBER以實現保持管理員更改的目標? – Michelle 2010-08-09 17:09:51

+0

我給我的答案添加了一個例子。請注意,當一次插入多行時,您的觸發器會有問題,因爲@CustomerID變量只能保存一個更改。另外,插入的表格包含在此事務中插入的行。因此,您不必在觸發器中查詢tblCustomerInfo表。還有一個刪除的表對於UDPATES和DELETES很有用。 – bobs 2010-08-09 17:39:24

+0

謝謝soo !!我有它的工作! – Michelle 2010-08-10 15:43:30

相關問題