如何在Access前端中找到恶意SELECT语句?

时间:2013-05-28 04:19:46

标签: sql sql-server ms-access blocking

我有两个版本的访问前端。一个用于Access 2003的仍然由几台尚未升级到Access2010和Win7的计算机运行,不幸的是,Acces2010版本在2003年的Access崩溃中导致我无法解决的主要形式结束。后端是SqlServer 2005 SqlExpress版本。

因此,我坚持使用2003年人的老版本,幸运的是他们不需要2010版本的新功能。

现在,当Access 2003版本在某处运行时,从大型机转储加载数据的维护实用程序会被“在Patient_Clinic_Visits上选择1”阻止。我找不到的是“Patient_Clinic_visits上的SELECT 1”来自哪里。

我已查看了所有模块代码和所有查询,但找不到类似的内容。

我认为它必须是前端形式,但是如何在没有查看RecordSource的表单的所有对象和控件的情况下搜索它,其中包含一些SQL代码?

欢呼声,

JonHD

2 个答案:

答案 0 :(得分:1)

最后,我搜索了其他一些问题,并考虑以编程方式转储可能存在的违规信息。这是我想要做的两个不同答案的混合物。在VBA中对Instant Window的限制,以及它将从Debug.Print中保留多少行,我已经使用WScript对象转储到日志文件。

代码基本上是:

  • 依次打开数据库中的每个表单
  • 转储其RecordSource描述
  • 然后对于其表单上的每个控件,以某种方式转储 MAY 包含SQL的相关信息
  • 注意:我使用的事实是,导致错误的Writeline(某些代码)将失败并且不会写入以避免对要转储或不转储属性的不同控件类型进行大量测试。
  • 然后关闭表格
  • 然后它遍历数据库中的所有查询,并转储SQL代码

(注1:最后这没有找到我的问题的答案 - 请参阅我最近的另一个问题!!)

(注意2:这是一个快速而又脏的脚本。我注意到它第一次运行WriteStream时没有写任何东西,即使它在执行代码时它似乎正在做某事。无论如何当我运行它时它再次起作用。没有花时间调试原因!)。

Function DumpFormsAndQueries()

        Dim obj As AccessObject
        Dim objctrl As Control
        Dim frm As Form
        Dim dbs As Object


        Dim fsoSysObj    As FileSystemObject
        Dim filFile      As Object
        Dim txsStream    As TextStream
        Dim strPath      As String

        Set dbs = Application.CurrentProject

        Set fsoSysObj = New FileSystemObject

        ' Return Windows Temp folder.

        strPath = "C:\Temp\"

        On Error Resume Next
        ' See if file already exists.
        Set filFile = fsoSysObj.GetFile(strPath & "Database_Form_dump.Log")
        ' If not, then create it.
        If Err <> 0 Then
            Set filFile = fsoSysObj.CreateTextFile(strPath & "Database_Form_dump.Log")
        End If

        Debug.Print ">> dumping to: " & strPath & "Database_form_dump.log"

        Set txsStream = filFile.OpenAsTextStream(ForAppending)

        For Each obj In dbs.AllForms

            DoCmd.OpenForm obj.name, acDesign
            Set frm = Forms(obj.name)

            Debug.Print ">>>> dump form: " & obj.name

            txsStream.WriteLine "====================================================================="
            txsStream.WriteLine "Form        : " & obj.name
            txsStream.WriteLine "RecordSource: " & frm.RecordSource
            txsStream.WriteLine "====================================================================="

            For Each objctrl In frm.Controls

                txsStream.WriteLine "                 --------------------------------------------------"
                txsStream.WriteLine "                 : " & objctrl.name & " Type = " & TypeName(objctrl)
                txsStream.WriteLine "                 --------------------------------------------------"
                On Error Resume Next
                txsStream.WriteLine "                 >>>> Recordsource: (" & objctrl.RecordSource & ")"
                txsStream.WriteLine "                 >>>> Controlsource: (" & objctrl.ControlSource & ")"
                txsStream.WriteLine "                 >>>> Rowsource: (" & objctrl.RowSource & ")"
                txsStream.WriteLine "                 >>>> Caption: (" & objctrl.Caption & ")"
                txsStream.WriteLine "                 >>>> Text: (" & objctrl.Text & ")"
                txsStream.WriteBlankLines 1


            Next objctrl


            DoCmd.Close acForm, obj.name, acSaveNo

             txsStream.WriteBlankLines 3

        Next obj

            txsStream.WriteLine "====================================================================="
            txsStream.WriteLine "   Q U E R I E S - in database"
            txsStream.WriteLine "====================================================================="

        Dim db As DAO.Database
        Dim qdf As DAO.QueryDef

        Set db = CurrentDb()
        For Each qdf In db.QueryDefs
            txsStream.WriteLine "Query: " & qdf.name

            txsStream.WriteLine "SQL (start) ---------------------------------------------------- "
            txsStream.WriteLine qdf.sql
            txsStream.WriteLine "SQL (end) ---------------------------------------------------- "
        Next qdf
        Set qdf = Nothing
        Set db = Nothing


        txsStream.Close

        Debug.Print ">> ended"

End Function

答案 1 :(得分:0)

在“访问”菜单中,选择“数据库工具” - >“数据库文档管理器”。在那里,选择所有对象并按“确定”。这需要一些时间,但随后会出现一个报告,列出数据库中的所有内容,包括最后的代码。

对于大型数据库来说,报告可能非常大。

您可以将报告导出到Word(有一个选项)。在那里,搜索你的字符串。 (我认为它应该是“SELECT 1 来自 Patient_Clinic_visits”)