Sql-Server
使用 sa 使用者將 xp_logevent 上的執行權限授予 sa
使用以下程式碼執行 SQL Server 2012 CLR 儲存過程:
const string executeLog = "EXEC master..xp_logevent @errorNumber, @message, informational"; using (SqlCommand cmd = new SqlCommand(executeLog, connection)) { cmd.CommandType = CommandType.Text; cmd.Parameters.AddWithValue("@errorNumber", 60001); cmd.Parameters.AddWithValue("@message", url); cmd.ExecuteScalar(); }
我收到此錯誤:
System.Data.SqlClient.SqlException:對對象“xp_logevent”、數據庫“mssqlsystemresource”、架構“sys”的執行權限被拒絕。
我嘗試以
sa
使用者身份執行此操作:grant execute on xp_logevent to sa
但我得到另一個錯誤:
您找不到不存在的使用者“sa”或使用者沒有權限。
如何向 sa 使用者授予執行權限?
如何向 sa 使用者授予執行權限?
您不需要在伺服器角色中按
sa
原樣授予執行任何內容,並且幾乎可以做任何事情。因此,如果您在執行 時遇到錯誤,那麼您沒有以. 連接字元串是使用還是正常/外部連接?如果使用,則權限基於執行 SQLCLR 儲存過程的人。如果使用正常連接,則權限預設基於 SQL Server NT 服務的登錄帳戶(如果是預設實例,則為MSSQLSERVER / SQLEXPRESS ),否則它可以是執行 SQLCLR 儲存過程的任何人的權限,如果程式碼已添加以進行模擬。sa``sysadmin``xp_logevent``sa``context connection = true;``context connection = true;
那麼,它是如何製造的
SqlConnection
呢?該問題的答案將有助於確定適當的解決方案。如果此 SQLCLR 儲存過程將由任何人(即不一定是db_owner
數據庫角色或sysadmin
伺服器角色的使用者)呼叫,那麼您可以執行以下操作以將此權限授予盡可能小的範圍。在包含 SQLCLR 儲存過程的數據庫中:
- 創建非對稱密鑰(請參閱CREATE ASYMMETRIC KEY)
- 從該非對稱密鑰創建使用者(請參閱CREATE USER)
- 將此新使用者添加到
db_owner
數據庫角色- 創建一個 T-SQL 儲存過程(可能稱為它
dbo.LogEvent
),它接受您傳入的兩個參數 (@errorNumber
和@message
) 並簡單地執行EXEC xp_logevent @errorNumber, @message, informational;
- 將此新儲存過程授予
EXECUTE
將呼叫 SQLCLR 儲存過程的任何使用者和/或數據庫角色- 使用用於創建新使用者的相同非對稱密鑰簽署這個新的儲存過程(請參閱添加簽名)
- 更新您的 SQLCLR 程式碼以執行這個新的 T-SQL 儲存過程(即
dbo.LogEvent
),而不是xp_logevent
- 然後,您可以將您的
using
聲明更改為new SqlCommand("dbo.LogEvent", connection)
- 然後更改
cmd.CommandType = CommandType.Text;
為cmd.CommandType = CommandType.StoredProcedure;
- 刪除
const string executeLog
線其他注意事項:
- 請不要使用
AddWithValue
,因為它有問題。相反,只需SqlParameter
使用顯式設置的數據類型創建 ,然後將其添加到SqlCommand.SqlParameters
集合中。ExecuteScalar
如果您沒有從結果集中擷取某些內容,則無需呼叫。相反,呼叫ExecuteNonQuery