2015-05-17 34 views
1

當前正在尋找一種通過VBA連接到Microsoft SQL Server數據庫的方式(ADODB),重點在於危害最小的風險,阻止並更改數據庫的結構。因此訪問是隻讀的。通過VBA(ADODB)連接到Microsoft SQL數據庫以最小的風險損害數據庫

我學嘗試如下:

Set DBConn = New ADODB.Connection 
Set TmpRecset = New Recordset 

DBConn.ConnectionString = pConnStr 
DBConn.Open 

On Error GoTo TermConnection 

With TmpRecset 
    .ActiveConnection = DBConn 
    .Source = pQuery 
    .LockType = adLockReadOnly 
    .CursorType = adOpenForwardOnly 
    .CursorLocation = adUseClient 
    .Open 
End With 

On Error GoTo TermRecordset 

//Doing something useful with TmpRecset 

On Error GoTo 0 

TermRecordset: 
TmpRecset.Close 
Set TmpRecset.ActiveConnection = Nothing 

TermConnection: 
DBConn.Close 
Set DBConn = Nothing 

End Sub 

而我使用的是下面的連接字符串:

"Provider=SQLOLEDB;Data Source=IP\Database;Initial Catalog=Databasename;Trusted_connection=yes;" 

我用手動錯誤處理,以確保,即記錄和數據庫無論結果如何通過記錄集的參數,我定義了只讀訪問。

有沒有其他一些機制可以確保數據庫的完整性?

致以問候

+0

如何通過數據>來自其他來源>從SQL Server進行連接。您可以在編輯查詢對話框中執行SELECT查詢。我的這篇文章可能會很有用:http://yoursumbuddy.com/tables-edit-query-dialog/。否則,如果您要堅持使用VBA,請務必查看AddParameter和CreateParameter,旨在減少SQL注入的機會。但是,如果您只是選擇,我會讓數據菜單爲您完成工作。 –

+0

@ j_wal-ter:如果是這樣,請將我的答案標記爲「已接受」。否則,請讓我知道缺少的東西。 [如何將答案標記爲「已接受」。](http://stackoverflow.com/tour) – Ralph

+0

謝謝你的回答,道格!是否有可能在每次啓動Excel文件時執行此選擇? –

回答

1

在我看來,在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企業預設(如果存在)覆蓋)。所以,他們沒有爲我工作。但是,對於我和我在過去幾年中工作的公司來說,上述工作非常順利。

讓我知道這是你一直在尋找的答案。

+0

@ j_wal-ter:如果是這種情況,請將我的答案標記爲「已接受」。否則,請讓我知道缺少的東西。如果您不知道如何將答案標記爲「已接受」[請點擊此處查看](http://stackoverflow.com/tour)。 – Ralph

+0

謝謝你這個詳細的答案,拉爾夫。首先,我將更精確地定義邊界條件: - 我無法將SQL數據庫一般設置爲只讀 - 我無法更改整個SQL數據庫的配置 因此,當我評估您的觀點時,我唯一的選擇是爲TmpRecset設置限制參數,並希望它們不會被覆蓋,並且可能在將它發送到SQL Server之前再次檢查使用的SQL命令。所以有人必須在兩個位置更改SQL查詢來編輯數據庫。那是對的嗎? –

+0

如果您的SQL服務器允許用戶更改服務器上的數據(DML),甚至允許他們更改數據庫結構(DDL),那麼您的代碼中可以做任何事情來防止除編寫VBA代碼更新/更改/刪除服務器上的任何內容。然而,其他人可以改變你的VBA代碼(如果它沒有被保護)或者編寫新的VBA代碼來做到這一點,服務器將接受/實現它。 SQL Server安全性在服務器上。不在Excel或任何其他Microsoft Office產品中。如果您無法更改服務器上的安全性,那麼您只能希望和監視。 – Ralph