如何获取有关SQL Select语句的信息

时间:2011-01-29 03:06:31

标签: sql

我想知道是否有可能获得select语句中每个字段来自的表/字段的真实名称。

假设您有两张表,债权人和债务人都有代码,姓名和电话字段。

如果用户输入以下sql语句:

SELECT Code AS CustomerCode, Name AS CustomerName, Phone AS ContactNumber FROM Debtors.

这将导致SQL Server返回字段名称CustomerCode,CustomerName和ContactNumber。

是否有可能从SQL服务器获取某些元数据,这些元数据将每个字段映射到其真实名称及其来源表?

在程序上,给定一个SQL select语句,我希望能够确定每个字段的真实名称以及它们来自的表的真实名称。

我不想自己解析SQL,所以我认为可能会将语句发送到sql server并在没有行数据的情况下获取这些信息。

我们要做的是实现表/字段级安全性。用户可以输入sql语句来从表中或跨多个表(使用连接)中选择字段,并将结果显示在表中。这些字段会动态添加到网格控件中,但只会添加允许用户查看的字段。

如果用户加入多个表,我们如何在程序上知道哪个字段来自哪个表?如果他们在SQL中使用别名,问题会变得更糟。

目前,这是在内部构建的sql引擎(使用专有数据库)上工作,它可以在没有行数据的情况下返回所有必需的表/字段信息,因此部分应用程序安全模型是围绕此构建的。但是,如果我们无法使这个应用程序工作,那么将此应用程序移动到SQL服务器之类可能会很困难

除了Sql server,其他任何sql数据库都支持这种类型的功能吗?

2 个答案:

答案 0 :(得分:2)

据我所知,你无法获得这些信息。

但是,您可以通过在数据库本身中使用GRANT / REVOKE安全性来处理许多数据库中的问题。假设用户正在登录数据库本身(而不仅仅是您的应用程序),许多DBMS允许您从表中获取对受限列的SELECT权限。使用该技术,如果用户为列指定ALIAS,它将不会欺骗服务器。

快速谷歌表示至少PostgreSQL,SQL Server和Oracle提供基于用户ID的列级GRANT SELECT保护。

顺便说一句有趣的问题。

答案 1 :(得分:1)

没有。重点是你应该只知道提供给你的名字,而不是它来自何处。

解决问题的方法是从表中删除所有访问权限,并仅通过具有适当访问权限的视图授予访问权限。