解析SQL查询的替代方法

时间:2016-06-09 20:10:07

标签: sql-server parsing audit

我在我的数据库中的多个表上运行审计,当用户针对所述表运行select时触发该审计。我试图解析审计返回的'声明',并从信息中获取用户名。这是我的疑问:

SELECT *
FROM  (SELECT LastName,
              queryLastName,
              statement,
              Event_time  AS CurrentDateTime,
              'AuditFile' AS SourceTable
       FROM   (SELECT statement,
                      event_time,
                      SUBSTRING(server_principal_name, 9, len(server_principal_name) - 8)                                                                                                               AS LastName,
                      SUBSTRING(SUBSTRING(statement, CHARINDEX('LastName like ''%', statement) + 16, 20), 0, CHARINDEX('%''', SUBSTRING(statement, CHARINDEX('LastName like ''', statement) + 16, 20))) AS queryLastName
               FROM   #MyTempTable
               WHERE  server_principal_name != 'abc'
                      AND CHARINDEX('LastName like ''%', statement) > 0) AS A) AS B
WHERE  querylastname != '' 

现在,上面的查询将正确返回任何具有姓氏'%name%'的SELECT查询,但我也希望能够返回以其他方式查找的名称,例如'%name'或'_name__ ”。有没有更优雅的解决方案来解决这个问题?

编辑:审核文件包含一个名为“Statement”的列。这可以保存触发审计的查询。例如,

SELECT * from tblUserNames where LastName Like '%Smith%' 

将触发审核并将上述查询置于语句中。 我的查询将Smith从字符串中删除,但是如果用户输入'%Smith',则查询将无效,因为它不会获取变体。 “Smith”,“ Smith ”也是如此。如果可能的话,我需要一种更优雅的方式来处理用户可以在名称的任何一端使用通配符查找名称的多种情况。 / p>

0 个答案:

没有答案