2011-10-18 54 views
7

MSDNによれば、単純な選択で構成されるビューは自動的にテーブルに対して挿入/更新/削除ステートメントを使用できるようにします。これを防ぐ方法はありますか?SQL Serverにビューが読み取り専用であることを伝えるために、それを使ってテーブルを変更することはできませんか?Sql Serverで読み取り専用ビューを作成する

答えて

12

最も良い方法は、ビューでUPDATE/DELETE/INSERTの権限を削除することです。

とは別に、ビューにINSTEAD OFというトリガーを作成するだけで、更新をサイレントに失敗させることはありません。または、quite a few constructs that make views non updatableが存在します。意味や効率を変えずに違反したものを選ぶことができます。

編集:以下は法案に適合しているようです。

CREATE VIEW Bar 
AS 
SELECT TOP 100 PERCENT x 
FROM foo 
WITH CHECK OPTION 
+0

+1のアクセス許可は、このコードではありません。しかし、フォークがビューを介して書き込むことができる場合は、ベーステーブルにもパーミッションがあると思われます。 – gbn

+0

ありがとう、魅力のように動作します。 これらのビューは実際にはユーザーがアクセスできない別のデータベースを参照します。私はそれらを読み取り専用にして、アクセス権のあるデータベースのビューを介してアクセスできないデータベースをユーザーが変更できないようにしたいと考えています。オブジェクトごとのアクセス権の代わりにデータベースごとのアクセス権を使用して、単純なものを維持し、権限の定義に違反しないことを確実にしたいと考えています。 –

+3

最後にコードを追加して危険を指摘します。それは 'WITH CHECK OPTION'にヒンジがあるようです。 SQL Server Management Studioを使用してビューを後で編集した場合、「WITH CHECK OPTION」は表示されず、ビューは再び読み書きされます。 – BIBD

7

あなたはこのように、SQL Serverは操作をDELETE/INSERT/UPDATE中に失敗するようにするためにUNION演算子を指定することができます。

create view SampleView 
as 
    select ID, value from table 
    union all 
    select 0, '0' where 1=0 

最後のクエリがローを返しませんまったく同じですが、最初のクエリと同じデータ型のフィールドが同じでなければなりません。UNIONを安全に使用するには詳細については、このリンクを参照してください:Different ways to make a table read only in a SQL Server database

+0

「UNION SELECT TOP 0 * FROMテーブル」(少なくともSQL Server 2014では)を追加することもできます。 – Christoph

関連する問題