在我看來,在Excel中沒有合理的安全性。所有的安全應該駐留在服務器上。如果要防止對數據庫的意外或惡意更改,則服務器上的數據庫應該是隻讀的,或者所有用戶都應具有對SQL服務器的只讀訪問權限。此外,您可以在服務器上執行跟蹤,SQL審計C2或使用擴展屬性。然而,所有這些都在SQL服務器的一邊。您可以在「客戶端」(如本例中的Excel)上執行的操作只是支持功能。所以問題是(對我)可以在Excel中實現哪種支持功能以確保SQL Server安全。以下是我所做的一些事情:
(1)使用全局變量使連接字符串動態化或將字符串存儲在隱藏工作表上。然後您可以在開發服務器和生產服務器之間自動切換。例如:
(2)有一個單獨的錯誤處理程序,用於連接到服務器並處理SQL語法錯誤。例如:
Set rstResult = New ADODB.Recordset
strSQL = "set nocount on; "
strSQL = strSQL & "/* #" & ActiveWorkbook.Path & "/" & ActiveWorkbook.Name & "{" & WorksheetUsers.Name & "}btnDownloadUserDataFromServer */"
strSQL = strSQL & "select v.LastName, "
strSQL = strSQL & " v.FirstName "
strSQL = strSQL & "from vUsers as v "
strSQL = strSQL & "order by v.LastName, v.FirstName "
rstResult.ActiveConnection = conRCServer
On Error GoTo SQL_StatementError
rstResult.Open strSQL
On Error GoTo 0
下面是SQL語法和在上面的例子中的錯誤處理程序是用於可能的SQL連接錯誤一個單獨的處理程序。
(3)在SQL語法中加入自我標識。正如你在上面的例子中看到的,我也讓服務器知道哪個文件,哪個工作表(在文件中)以及用戶調用哪個函數來執行此語句。如果您通過跟蹤在服務器上捕獲這些數據,那麼您可以看到誰在編寫自己的查詢,誰在使用您的標準文件以及使用了哪些功能(及其各自的影響)。
(4)如果發生錯誤,您可能需要考慮編寫自動錯誤電子郵件。示例:
SQL_ConnectionError:
Y = MsgBox("Cannot connect to the server. Please make sure that you have a working internet connection. " & _
"Also ensure that are connected to the corporate network and are allowed to access the server. " & _
"Do you want me to prepare an error-email?", 52, "Problems connecting to Server...")
If Y = 6 Then
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
With OutMail
.to = Ref.Range("C7").Value2
.CC = Ref.Range("C8").Value2
.Subject = "Problems connecting to database '" & Ref.Range("C4").Value & "' on server '" & Ref.Range("C2").Value & "'"
.HTMLBody = "<span style=""font-size:10px"">---Automatically generated Error-Email---" & _
"</span><br><br>Error report from the file '" & _
"<span style=""color:blue"">" & ActiveWorkbook.Name & _
"</span>' located and saved on '<span style=""color:blue"">" & _
ActiveWorkbook.Path & "</span>'.<br>" & _
"Excel is not able to establish a connection to the server. Technical data to follow." & "<br><br>" & _
"Computer Name: <span style=""color:green;"">" & Environ("COMPUTERNAME") & "</span><br>" & _
"Logged in as: <span style=""color:green;"">" & Environ("USERDOMAIN") & "/" & Environ("USERNAME") & "</span><br>" & _
"Domain Server: <span style=""color:green;"">" & Environ("LOGONSERVER") & "</span><br>" & _
"User DNS Domain: <span style=""color:green;"">" & Environ("USERDNSDOMAIN") & "</span><br>" & _
"Operating System: <span style=""color:green;"">" & Environ("OS") & "</span><br>" & _
"Excel Version: <span style=""color:green;"">" & Application.Version & "</span><br>" & _
"<br><span style=""font-size:10px""><br>" & _
"Possible reasons for this error include: (1) no Internet connection, (2) no working VPN connection to the corporate network, " & _
"(3) the server is currently offline, (4) DNS authentication problems, (5) ... other reasons ..., " & _
"(6) the user does not have the required permission to connect to the underlying database on the server." & _
"<br><br>---Automatically generated Error-Email---"
.Display
End With
Set OutMail = Nothing
Set OutApp = Nothing
End If
Exit Sub
我還研究了更改連接參數的方法。但是在我爲這些連接參數工作的大多數企業環境中,這些參數已被覆蓋(例如,ADODB.Connection.CommandTimeout由服務器的每個用戶的SQL超時或Windows企業預設(如果存在)覆蓋)。所以,他們沒有爲我工作。但是,對於我和我在過去幾年中工作的公司來說,上述工作非常順利。
讓我知道這是你一直在尋找的答案。
如何通過數據>來自其他來源>從SQL Server進行連接。您可以在編輯查詢對話框中執行SELECT查詢。我的這篇文章可能會很有用:http://yoursumbuddy.com/tables-edit-query-dialog/。否則,如果您要堅持使用VBA,請務必查看AddParameter和CreateParameter,旨在減少SQL注入的機會。但是,如果您只是選擇,我會讓數據菜單爲您完成工作。 –
@ j_wal-ter:如果是這樣,請將我的答案標記爲「已接受」。否則,請讓我知道缺少的東西。 [如何將答案標記爲「已接受」。](http://stackoverflow.com/tour) – Ralph
謝謝你的回答,道格!是否有可能在每次啓動Excel文件時執行此選擇? –