CREATE SERVER AUDIT (Transact-SQL)

適用於:SQL ServerAzure SQL 受控執行個體

使用 SQL Server Audit 來建立伺服器稽核物件。 如需詳細資訊,請參閱 SQL Server 稽核 (資料庫引擎)

Transact-SQL 語法慣例

Syntax

CREATE SERVER AUDIT audit_name
{
    TO { [ FILE (<file_options> [ , ...n ] ) ] | APPLICATION_LOG | SECURITY_LOG | URL | EXTERNAL_MONITOR }
    [ WITH ( <audit_options> [ , ...n ] ) ]
    [ WHERE <predicate_expression> ]
}
[ ; ]

<file_options>::=
{
    FILEPATH = 'os_file_path'
    [ , MAXSIZE = { max_size { MB | GB | TB } | UNLIMITED } ]
    [ , { MAX_ROLLOVER_FILES = { integer | UNLIMITED } } | { MAX_FILES = integer } ]
    [ , RESERVE_DISK_SPACE = { ON | OFF } ]
}

<audit_options> ::=
{
    [ QUEUE_DELAY = integer ]
    [ , ON_FAILURE = { CONTINUE | SHUTDOWN | FAIL_OPERATION } ]
    [ , AUDIT_GUID = uniqueidentifier ]
    [ , OPERATOR_AUDIT = { ON | OFF } ]
}

<predicate_expression> ::=
{
    [ NOT ] <predicate_factor>
    [ { AND | OR } [ NOT ] { <predicate_factor> } ]
    [ , ...n ]
}

<predicate_factor>::=
    event_field_name { = | < > | != | > | >= | < | <= | LIKE } { number | ' string ' }

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

引數

TO { FILE |APPLICATION_LOG |SECURITY_LOG |URL |EXTERNAL_MONITOR }

判斷稽核目標的位置。 選項有二進位檔案、Windows 應用程式記錄檔或 Windows 安全性記錄檔。 SQL Server 無法寫入 Windows 安全性 記錄檔,而不需在 Windows 中設定其他設定。 如需詳細資訊,請參閱 將 SQL Server 稽核事件寫入安全性記錄檔。

SQL Server 不支持目標 URL

重要

在 Azure SQL 受控執行個體中,SQL 稽核會在伺服器層級執行。 位置只能是 URLEXTERNAL_MONITOR

FILEPATH = 'os_file_path'

稽核記錄檔的路徑。 檔案名稱是根據稽核名稱和稽核 GUID 所產生。 如果此路徑無效,則不會建立稽核。

FILEPATHAzure SQL 受控執行個體 不支援 target。 您必須改用 PATH

MAXSIZE = max_size

指定稽核檔案所能成長的大小上限。 max_size值必須是整數,後面接著 MB、GB、TB 或 UNLIMITED。 您可以為 max_size 指定的大小下限為 2 MB,而上限則為 2,147,483,647 TB。 指定 時 UNLIMITED ,檔案會成長到磁碟已滿為止。 (0 也表示 UNLIMITED。指定小於 2 MB 的值會引發錯誤 MSG_MAXSIZE_TOO_SMALL。 預設值是 UNLIMITED

MAXSIZEAzure SQL 受控執行個體 不支援 target。

MAX_ROLLOVER_FILES = { integer |UNLIMITED }

除了目前的檔案以外,指定要保留在檔案系統中的檔案數目上限。 值 MAX_ROLLOVER_FILES 必須是整數或 UNLIMITED。 預設值是 UNLIMITED。 每當稽核重新啟動時,就會評估此參數(當 資料庫引擎 實例重新啟動或稽核關閉后再次開啟時,或因為 到達 而需要MAXSIZE新的檔案時,就會發生這種情況。 評估時 MAX_ROLLOVER_FILES ,如果檔案數目超過 MAX_ROLLOVER_FILES 設定,則會刪除最舊的檔案。 因此,當的設定 MAX_ROLLOVER_FILES 為 0 時 MAX_ROLLOVER_FILES ,每次評估設定時都會建立新的檔案。 評估設定時 MAX_ROLLOVER_FILES ,只會自動刪除一個檔案,因此當的值 MAX_ROLLOVER_FILES 減少時,除非手動刪除舊檔案,否則檔案數目不會壓縮。 可以指定的檔案數量上限為 2,147,483,647。

MAX_ROLLOVER_FILES不支援 Azure SQL 受控執行個體。

MAX_FILES = 整數

適用於:SQL Server 2012 (11.x) 和更新版本。

指定可建立的最大稽核檔案數目。 達到限制時,不會變換至第一個檔案。 MAX_FILES達到限制時,任何導致產生其他稽核事件的動作都會失敗,並出現錯誤。

RESERVE_DISK_SPACE = { ON | OFF }

此選項會將磁碟上的檔案預先配置至 MAXSIZE 值。 只有在 不等於 UNLIMITED時才MAXSIZE適用。 預設值是 OFF

RESERVE_DISK_SPACEAzure SQL 受控執行個體 不支持目標。

QUEUE_DELAY = 整數

判斷在強制處理稽核動作之前經過的時間長度 (以毫秒為單位)。 值為 0 表示同步傳遞。 可設定的查詢延遲值下限為 1000 (1 秒),這是預設值。 最大值為 2147483647 (2,147,483.647 秒或 24 天,20 小時,31 分,23.647 秒)。 指定無效的數位會 MSG_INVALID_QUEUE_DELAY 引發錯誤。

ON_FAILURE = { CONTINUE | SHUTDOWN | FAIL_OPERATION }

指出寫入目標的實例是否應該失敗、繼續或停止 SQL Server,如果目標無法寫入稽核記錄。 預設值是 CONTINUE

CONTINUE

SQL Server 作業繼續。 稽核記錄不會保留。 稽核會繼續嘗試記錄事件,而且如果失敗狀況已解決,就會恢復稽核。 選取繼續選項會允許可能違反安全性原則的未稽核活動。 當繼續進行資料庫引擎作業比維持完整稽核更重要時,請使用此選項。

SHUTDOWN

如果 SQL Server 因為任何原因無法將資料寫入稽核目標,則會強制關閉 SQL Server 的執行個體。 執行 CREATE SERVER AUDIT 陳述式的登入在 SQL Server 內必須擁有 SHUTDOWN 權限。 即使稍後已從執行中的登入撤銷 SHUTDOWN 權限,關閉的行為仍會持續。 如果用戶沒有此許可權,則語句會失敗,而且不會建立稽核。 當稽核失敗可能危害系統的安全性或完整性時,請使用此選項。 如需詳細資訊,請參閱 SHUTDOWN

FAIL_OPERATION

適用於:SQL Server 2012 (11.x) 和更新版本。

如果資料庫動作導致稽核的事件,這些動作就會失敗。 不會造成稽核事件的動作可以繼續,但不會發生任何稽核的事件。 稽核會繼續嘗試記錄事件,而且如果失敗狀況已解決,就會恢復稽核。 當維持完整稽核比資料庫引擎的完整存取權更重要時,請使用此選項。

AUDIT_GUID = uniqueidentifier

若要支援類似資料庫鏡像等案例,稽核需要一個特定的 GUID,而且此 GUID 要符合鏡像資料庫中找到的 GUID。 建立稽核之後,就無法修改 GUID。

OPERATOR_AUDIT

適用於:僅限 Azure SQL 受控執行個體。

指出稽核是否在支援要求期間需要存取您的伺服器時擷取 Microsoft 支援工程師作業。

predicate_expression

適用於:SQL Server 2012 (11.x) 和更新版本。

指定用來判斷是否應該處理事件的述詞運算式。 述詞表達式限制為 3,000 個字元,這會限制字元串自變數。

event_field_name

適用於:SQL Server 2012 (11.x) 和更新版本。

識別述詞來源的事件欄位名稱。 稽核欄位會在 sys.fn_get_audit_file (Transact-SQL) 中說明。 除了 file_nameaudit_file_offsetevent_time 以外的所有欄位都可進行稽核。

注意

雖然 和 action_idclass_type 欄位的類型為 varcharsys.fn_get_audit_file但它們只有在是篩選的述詞來源時,才能與數位搭配使用。 若要取得搭配 class_type 使用之值的清單,請執行下列查詢:

SELECT spt.[name], spt.[number]
FROM   [master].[dbo].[spt_values] spt
WHERE  spt.[type] = N'EOD'
ORDER BY spt.[name];

number

適用於:SQL Server 2012 (11.x) 和更新版本。

包含十進位的任何數值類型。 限制為缺少可用的實體記憶體,或是數字太大而不能表示為 64 位元整數。

'字串'

適用於:SQL Server 2012 (11.x) 和更新版本。

ANSI 或 Unicode 字串 (依述詞比較的需求而定)。 不會針對述詞比較函數執行隱含字串類型轉換。 傳遞錯誤的類型會產生錯誤。

備註

建立伺服器稽核時,處於停用狀態。

CREATE SERVER AUDIT語句位於交易的範圍中。 如果回復交易,也會回復此陳述式。

權限

若要建立、改變或卸除伺服器稽核,主體需要 ALTER ANY SERVER AUDITCONTROL SERVER 許可權。

當您將稽核資訊儲存至檔案時,為了協助防止竄改,請限制對檔案位置的存取。

範例

A. 使用檔案目標建立伺服器稽核

下列範例會建立稱為 HIPAA_Audit 的伺服器稽核,並將二進位檔案當做目標而且不指定任何選項。

CREATE SERVER AUDIT HIPAA_Audit
    TO FILE ( FILEPATH ='\\SQLPROD_1\Audit\' );

B. 使用具有選項的 Windows 應用程式記錄目標建立伺服器稽核

下列範例會建立稱為 HIPAA_Audit 的伺服器稽核,並包含針對 Windows 應用程式記錄檔所設定的目標。 每秒鐘都會寫入此佇列,並在失敗時關閉 SQL Server 引擎。

CREATE SERVER AUDIT HIPAA_Audit
    TO APPLICATION_LOG
    WITH ( QUEUE_DELAY = 1000,  ON_FAILURE = SHUTDOWN);

C. 建立包含 WHERE 子句的伺服器稽核

下列範例會建立資料庫、結構描述和兩個範例資料表。 名為 DataSchema.SensitiveData 的資料表將包含機密資料,而且此資料表的存取權必須記錄在稽核中。 名為 DataSchema.GeneralData 的數據表不包含機密數據。 資料庫稽核規格會稽核 DataSchema 結構描述中所有物件的存取權。 伺服器稽核是使用 WHERE 子句所建立,這個子句會將伺服器稽核限制為只有 SensitiveData 資料表。 伺服器稽核會假設稽核資料夾存在 C:\SQLAudit 中。

CREATE DATABASE TestDB;
GO
USE TestDB;
GO
CREATE SCHEMA DataSchema;
GO
CREATE TABLE DataSchema.GeneralData (ID int PRIMARY KEY, DataField varchar(50) NOT NULL);
GO
CREATE TABLE DataSchema.SensitiveData (ID int PRIMARY KEY, DataField varchar(50) NOT NULL);
GO
-- Create the server audit in the master database
USE master;
GO
CREATE SERVER AUDIT AuditDataAccess
    TO FILE ( FILEPATH ='C:\SQLAudit\' )
    WHERE object_name = 'SensitiveData' ;
GO
ALTER SERVER AUDIT AuditDataAccess WITH (STATE = ON);
GO
-- Create the database audit specification in the TestDB database
USE TestDB;
GO
CREATE DATABASE AUDIT SPECIFICATION [FilterForSensitiveData]
FOR SERVER AUDIT [AuditDataAccess]
ADD (SELECT ON SCHEMA::[DataSchema] BY [public])
WITH (STATE = ON);
GO
-- Trigger the audit event by selecting from tables
SELECT ID, DataField FROM DataSchema.GeneralData;
SELECT ID, DataField FROM DataSchema.SensitiveData;
GO
-- Check the audit for the filtered content
SELECT * FROM fn_get_audit_file('C:\SQLAudit\AuditDataAccess_*.sqlaudit',default,default);
GO