0

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

我很难找到一个可以从 sql 语句中提取表名和别名的 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"} 的字典

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

4

2 回答 2

1

这个答案对于找到我的问题的解决方案很有用。

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

于 2017-08-08T17:26:16.367 回答
0

对不起,但我有一些疑问。

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

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

于 2017-08-04T21:10:41.050 回答