如何从.net

时间:2017-08-04 18:06:19

标签: .net sql-server tsql sql-parser

我在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",&#34 ;产品"}

到目前为止,我只发现了只能识别过于通用的类型才能依赖的标记符。 (即关键字,标识符,运算符,文本)。有没有什么可以在.net中做这种工作。或者是否有更好的策略将这些租户检查附加到每个查询运行?

2 个答案:

答案 0 :(得分:1)

This answer对于找到问题的解决方案非常有用。

如果有人有兴趣,this is my first pass。我们实际上使用systemId作为我们的租户,因此您将在代码中看到它。到目前为止,我发现它没有处理的唯一查询是具有子查询的查询。我现在正在深入研究这个问题,但我可能不会将其添加进去,因为我的团队需要的绝大部分都是在这里处理的。

答案 1 :(得分:0)

很抱歉,但我有些疑惑。

  1. 你有服务器中的所有表,对吧?在sys.tables中,您拥有所有表名。在sys.columns中是该表的列名称,请注意模式。在sys.columns中也有user_types ...您可以将此表与select for find表和列匹配。还有视图系统表,存储过程,甚至内容......
  2. 如果表格不存在,则选项不起作用,所以我不理解这个问题。
  3. 如果您使用sql server配置文件(如果可以),它可以捕获有关数据库的任何查询的更多信息。
  4. 在StackOverflow中,您必须编写一些代码或与您的问题相关的一些链接。 howto
  5. 向我提问任何问题,希望对你有所帮助!! :)