2010-02-23 42 views
0

在.NET中,是否有可能将sql语句传递给SQL服务器进行解析并返回语句中涉及的表和操作类型。因此,对于这样的说法:在运行之前涉及sql语句的列表?

select * from Table1 
left outer join Table2 on Table1.id=Table2.foreignid; 
delete from Table2 where date < 2009/12/12 

SQL Server可能返回参与这样的表:

Table1 Read 
Table2 Read 
Table2 Delete 

所以不执行该语句,它只是返回涉及的表。

我问的原因是我正在使用的应用程序具有应用程序级别的表权限,我想通过表基础应用于表。解析出语句中涉及的表的当前方法使用正则表达式,并且除了简单语句之外的任何其他语法都失败。显然你不能真正使用这种工作的正则表达式

+0

嗯......你的表格不是在那里列出的吗? – 2010-02-23 13:07:58

+0

当然,他们只是想要以可靠的方式解析表格,并以复杂的SQL查询进行扩展。我的例子应该是故意的简单。由于SQL Server必须解析一条sql语句作为执行过程的一部分,我想知道是否可以指示它返回语句中涉及的表而不是执行它 – 2010-02-23 13:40:31

+0

为什么要自己做?为什么不简单地使用数据库级别的权限?这就是他们为... – 2010-02-23 22:56:01

回答

2

SET SHOWPLAN_ALL会为你做吗?它模拟服务器上的调用查询,您可能能够解析结果。

编辑:它看起来像SET SHOWPLAN_TEXT会更容易解析。

+0

输出是复杂的,并在XML(或者也许一个变种的调用将返回XML?)这应该工作,但它可能会很多工作。 – 2010-02-23 20:58:51

+0

啊,这是优秀的,它在那里。从我的第一次看,我只需要解析结果中的DefinedValues列,并使用逗号分隔符来分析查询中涉及的列。而且我还需要使用Type列来告诉我如SELECT或DELETE的操作。 非常感谢 – 2010-02-24 09:23:57

1

我问的原因是我正在使用的应用程序具有应用程序级别表权限,我希望按表基础在表上应用这些权限。

在我看来,您应该创建一个数据库级角色来捕获这些权限,并将其应用于该级别。您为数据库管理系统付费 - 不要花时间编写已经实现的解决方案的最佳解决方案。

应用程序级权限可能对行级有意义,甚至可以在数据库中实现。但是,如果他们处于桌面级别,我没有看到任何证明你自己编码实施的借口。使用你的数据库,你付钱。

+0

你是绝对正确的,我希望它已经是这样了。在我继承的应用程序中只有一个SQL登录名,并且应用程序在同一个数据库中管理用户本身,因此它可以应用应用程序级权限。在我使用SHOWPLAN解决方案之前,我将研究是否可以在应用程序登录时(这是一个Web应用程序)即时将角色分配给sql用户。我无法摆脱应用程序级别的用户系统,所以我可能不得不将SQL登录绑定到应用程序登录。非常感谢Roland – 2010-02-24 09:31:40

+0

将SHOWPLAN标记为现在的解决方案,这可能会改变 – 2010-02-24 09:33:11

+0

Gaz Newt。我希望你能够设法做到SHOWPLAN解决方案需要做的事情。 – 2010-02-24 09:53:01