2011-01-29 13 views
2

selectステートメントの各フィールドの元になるテーブル/フィールドの実際の名前を取得できるかどうかは疑問です。SQL Selectステートメントに関する情報を取得する方法

債権者と債権者の両方に2つのテーブルがあるとします。債権者と債務者の両方にコード、名前、電話のフィールドがあります。

ユーザーは、次のSQL文を入力した場合:

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

これは、フィールド名CustomerCode、顧客名やContactNumberを返すSQLサーバになります。

SQLサーバーから各フィールドを実際の名前とそのテーブルにマップする何らかのメタデータを取得できますか?

プログラムでは、SQLのselect文が与えられているので、各フィールドの実際の名前と、それらのテーブルの実際の名前を判別できるようにしたいと考えています。

SQLを自分自身で解析したくないので、SQL Serverに文を送信し、行データなしでこの情報を返すことができると考えました。

私たちがやっていることは、テーブル/フィールドレベルのセキュリティを実装することです。ユーザーは、SQLステートメントを入力して、表からフィールドを選択したり、複数の表にまたがって(結合を使用して)結果を表に表示することができます。フィールドはグリッドコントロールに動的に追加されますが、ユーザーに表示されるフィールドのみが動的に追加されます。

ユーザが複数のテーブルに参加すると、どのフィールドがどのテーブルから来るのか、どのようにプログラム的に知ることができますか? SQLでエイリアスを使用すると、問題は悪化します。

現在、これは独自のデータベースを使用する社内組み込みSQLエンジンで動作しています。このエンジンは、行データなしで必要なすべてのテーブル/フィールド情報を返すことができるため、アプリケーションセキュリティモデルの一部がこれを中心に構築されています。しかし、このアプリケーションをSQLサーバのようなものに動かすことは、これを動作させることができなければ難しいかもしれません。

SQLサーバーのほかに、他のSQLデータベースもこのタイプの機能をサポートしていますか?

+0

結果セットの列が常に直接表の列にマップされるとは限らないため、これは一般的なやり方では難しいことです。(実際、彼らはしばしばそうしません)。テーブルAとテーブルBの行の値の合計である結果列を持つことができます。または、結果セットに表示されていない結合にデータが使用されているテーブルを持つことができます。 – payne

答えて

2

私の知る限りでは、その情報を得ることはできません。

しかし、多くのデータベースでは、データベース自体にGRANT/REVOKEセキュリティを使用して問題を処理できます。ユーザーがアプリケーションだけでなくデータベース自体にログインしていると仮定すると、多くのDBMSを使用すると、表から制限付き列に対してSELECT権限を付与できます。この手法を使用すると、ユーザーが列のALIASを指定すると、サーバーを欺くことはありません。

簡単なgoogleは、少なくともPostgreSQL、SQL Server、およびOracleは、ユーザーIDに基づいて列レベルのGRANT SELECT保護を提供していることを示しています。

興味深い質問です。

+0

+1。良い答えですが、個人的には、最も単純な場合を除いて、列の権限を許可しないようにしています。 –

+0

私もあまりにも、おそらくOPは本当にこれを行う必要があり、明らかにアプリケーションコードでそれをやっているようです。彼がそれをデータベース層に移すことができれば、維持するのは難しいだろうと思う(既存の管理フロントエンドにGRANTとREVOKEを使用することができます)。もし彼がそれを行う必要があれば、ほとんどのデータベースはすでにそれを扱います。 –

+0

許可/取り消しを使用すると、そのように聞こえるように聞こえます。ありがとうございます。もう1つの問題は、ユーザーがクエリを作成し、次に返された結果をドリルダウンできることです。たとえば、ユーザは、請求書テーブルから請求書を選択するためのクエリ(請求書番号、請求書日付、顧客名、総総額、総税額)を書き込みます。ユーザーがユーザーが行をダブルクリックすると、アプリケーションは最初の列を見て、この列が請求表から来たものであることを認識します。 –

1

いいえ、どこから来たのか分かりません。

問題を解決する方法は、すべてのアクセスをテーブルから削除し、適切なアクセス権を持つビューを介してのみアクセスを許可することです。

+0

それは、OPが要求している細分性を持っていると私を攻撃しません。実際にMS SQL 2k8では –

+0

の列のアクセス権が可能です。しかし、それらを管理することは、言うことができる、興味深いことができます。 –

+0

注:表レベルDENYは列レベルGRANTよりも優先されません。この階層の矛盾は、下位互換性のために保持されています。 http://msdn.microsoft.com/en-us/library/ms188371.aspx –

関連する問題