Sql-Server
如何拒絕通過 SSMS 訪問 SQL Server 以進行某些登錄,但允許通過 .Net SqlClient 數據提供程序
我們有一種情況,開發人員沒有任何
UPDATE
權限,但他們使用應用程序並查看連接字元串 -> 他們知道某些SQLLogin1
具有 UPDATE 權限的 SQL 帳戶(例如)的密碼。我們目前的操作並不完美,有時需要修改生產數據(還沒有 GUI)。開發人員沒有聯繫 DBA 並要求他修改數據,而是(不正確地)使用 SQL 帳戶
SQLLogin1
(有權修改數據),並通過 SQL Server Management Studio 連接自己修改數據。如果開發人員沒有看到新的連接字元串和新密碼, DBA 無法更改密碼
SQLLogin1
,因為使用的應用程序連接字元串SQLLogin1
由開發人員維護。問題:
有沒有辦法拒絕訪問
SQLLogin1
SQL 登錄,但前提是它通過 SSMS 連接?同時如果
SQLLogin1
正在連接.Net SqlClient Data Provider
(program_name
中sys.dm_exec_sessions
),則必須允許登錄。這樣,我們不想讓開發人員使用 SSMS 連接
SQLLogin1
,而正在使用的應用程序SQLLogin1
仍然能夠連接。
您可以使用伺服器登錄觸發器進行自定義登錄驗證,並在您認為合適時拒絕它們。如果您使用 SSMS,您將在“伺服器對象”下方和“觸發器”內看到此觸發器。
例如:
CREATE TRIGGER strRejectSSMSConnectionForSQLLogin1 ON ALL SERVER FOR LOGON AS BEGIN IF ORIGINAL_LOGIN() = N'SQLLogin1' AND PROGRAM_NAME() LIKE N'Microsoft SQL Server Management Studio%' BEGIN RAISERROR('Direct connection by SSMS refused.', 16, 1) ROLLBACK END END
觸發器內部將
ROLLBACK
拒絕連接(有一個隱式事務包裝了登錄事件對觸發器的呼叫)。實現登錄觸發器時要小心,如果沒有正確編碼,您將拒絕應該能夠登錄的登錄(包括您自己的!)。確保首先在測試/開發環境中進行測試。
請記住,此程式碼在創建會話之前執行,因此依賴會話 ID (SPID) 的系統視圖將不包含目前檢查的登錄,直到觸發器結束而沒有回滾或足夠高的失敗。