2016-08-26 13 views
0

少数のデータベースでセキュリティレイヤーを作成しています。その一環として、異なるデータベースの2つのテーブル(共用体)を結合するOriginal_Databaseのビューを作成する必要があります(Chained_Database1およびChained_Database2)。SQL Server 2012 - ユーザーの秘密に基づいてビューからデータを動的に選択する方法

USE Original_Database; 
GO 

CREATE VIEW QueryATable 
AS 
    SELECT * FROM Chained_Database1.dbo.ATable 
    UNION 
    SELECT * FROM Chained_Database2.dbo.ATable; 
GO 

でユーザーusergroupA(ユーザーグループ)のログであれば、その後、彼はChained_Database1.dbo.ATableからのデータのみを見ることができるはずOriginal_Databaseからの眺めQueryATableから選択します。

同様に、usergroupBがログインしてビューQueryATableから選択すると、彼はChained_Database2.dbo.ATableのデータしか見ることができません。

私はユーザーに異なる権限を与えようとしました。これは、ビューのアクセスを拒否するか、2つの表から結果を出すことです。

お手数をおかけしますようお願い申し上げます。

ありがとうございます!

+0

1つのテーブルにアクセスするためだけにユーザーにアクセスできるように、別のビューを作成する必要があります。私は要件を明確に理解していません –

+0

usergroupBにはDatabase2のデータしか表示されませんか? – scsimon

+0

はい、正しい... –

答えて

0

要件に基づいて、UNIONは無意味で、両方のデータセットから選択して明示的に1に制限するため、パフォーマンスが低下するだけです。理論的には、クエリを実行したユーザーのルックアップテーブルがあり、ビューのユーザーパラメータを使用できないため、結果はWHERE句に限定されます。だから、組合をしないでください。代わりに、2つの個別のビューを作成します。あなたはおそらくSTORED PROCEDUREまたはいくつかの他の方法でこれを扱うことができ、その後、別のビューを作成したくない場合は

CREATE VIEW QueryATable 
AS 
    SELECT * FROM Chained_Database1.dbo.ATable 
    GRANT SELECT ON QueryATable TO <who ever...> 
GO 


CREATE VIEW QueryBTable 
AS 
    SELECT * FROM Chained_Database2.dbo.ATable 
    GRANT SELECT ON QueryBTable TO <who ever...> 
GO 

...これは、ユーザーが唯一になると仮定していること

CREATE PROCEDURE yourProcedure(@userID) 
AS 

IF 1 = (SELECT COUNT(*) FROM LookUpTableA WHERE userID = @userID) 
    SELECT * FROM Chained_Database1.dbo.ATable 
IF 1 = (SELECT COUNT(*) FROM LookUpTableB WHERE userID = @userID) 
    SELECT * FROM Chained_Database2.dbo.ATable 
ELSE 
    SELECT 'User Not Valid' 
GO 

注意ルックアップテーブルの1つ。彼らが両方にいたらあなたはそれを違って扱う必要があります。

+0

あなたの答えのためのサイモン、Thx。すべてのユーザーグループは、単一のスキーマにアクセスし、元のデータベースから表示する必要があります。元のデータベースからのこの単一ビューは、Chained_Database1および2からのビューに結合する必要があります。私は、UsergroupAがビューOriginal_Database .QueryATableを選択したときに、選択されたアクセスではなく、chained_database2のビューの存在をチェックするusergroupAに割り当てることができる権限があるかどうかを考えていました。そのため、ビューはエラーをスローしませんが、chained_database1からデータを取得するだけです。希望の情報が理にかなっています。 – user6762139

+0

プロシージャーを使用してそれを行う方法や、ビューでルックアップテーブルを説明しました。しかし、これはひどい考えです。 – scsimon

+0

メインビューの追加の制約や結合は、パフォーマンス上の観点からは間違いです。しかし、私は純粋にchained_database2のビューを検証するだけの権限を持っているusergroupAにロールを割り当てることができるかどうかをパーミッションの観点から見ていますが、他のことはしません。私たちはオブジェクトのパーミッションを変更、削除、実行、所有権の取得、偽装、挿入、更新、受信、作成、ビューの表示、変更トラッキングの表示、選択、参照を行います。これらのいずれかが私が探しているもので動作するかどうかはわかりません。 – user6762139

関連する問題