如何从 .net 中的 Tsql select 语句中提取所有 table 名称和别名

How to extract all table names and aliases from Tsql select statements in .net

我在 sql 服务器中的所有租户 table 都有一个字段 customer_id。我正在尝试为 NPoco 编写一个拦截器,它将从查询中提取所有 table 和别名。将其匹配到未租户的table的异常列表,并修改select以检查where子句中所有已租户的table的租户密钥。

我很难找到可以从 sql 语句中提取 table 名称和别名的 sql 解析器。

一个好的解决方案是解析以下语句。

SELECT fis.OrderDateKey, SUM(fis.SalesAmount) AS TotalSales
FROM FactInternetSales fis
  Join product on fis.productid = product.productid
  where p.name like 'prefix%'
  GROUP BY fis.OrderDateKey
  HAVING fis.OrderDateKey > 20010000
  ORDER BY fis.OrderDateKey;

会为我提供足够的信息来可靠地构建一个包含 2 个项目 {"FactInternetSales", "fis"} 和 {"product", "product"}[=13= 的字典]

到目前为止,我只发现分词器只知道对我来说过于通用而无法依赖的类型。 (即关键字、标识符、运算符、文本)。有什么东西可以在 .net 中完成这种工作吗?或者是否有更好的策略将这些租户检查附加到每个查询 运行?

抱歉,我有些疑惑。

  1. 服务器里的table你都有吧?在 sys.tables 中,您拥有所有 table 个名称。在 sys.columns 中是 table 的列名称,请注意架构。在 sys.columns 中也有 user_types... 您可以将此 table 与 select 匹配以查找 table 和列。也有视图系统 tables,还有存储过程,甚至内容...
  2. 如果 tables 不存在,则 selects 不起作用,所以我不明白这个问题。
  3. 如果您使用 sql 服务器配置文件(如果可以),它可以捕获有关对数据库的任何查询的更多信息。
  4. 在 Whosebug 中,您必须编写一些代码或 link 与您的问题相关的一些工作。 howto.

有什么问题可以问我,希望能帮到你!! :)

This answer 对我找到问题的解决方案很有帮助。

如果有人感兴趣,this is my first pass。我们实际上使用 systemId 作为我们的租户,所以你会在代码中看到它。到目前为止,我发现它唯一不能处理的查询是带有子查询的查询。我现在正在研究这个问题,但我可能不会添加它,因为我的团队需要的绝大多数都在这里处理。