2011-10-18 14 views
7

In base a MSDN, le viste composte da selezioni semplici consentono di utilizzare automaticamente le istruzioni di inserimento/aggiornamento/eliminazione sulla tabella. C'è un modo per impedirlo: dire al server Sql che la vista è in sola lettura, e non puoi usarla per modificare la tabella?Creazione di viste in lettura in Sql Server

risposta

12

Il modo migliore sarebbe rimuovere le autorizzazioni UPDATE/DELETE/INSERT nella vista.

Oltre a ciò è possibile creare un trigger INSTEAD OF nella vista che semplicemente non fa in modo che gli aggiornamenti non vengano eseguiti correttamente o che ci siano quite a few constructs that make views non updatable. Quindi puoi sceglierne uno che non cambia semantica o efficienza e quindi violarlo.

Modifica: Il seguente sembra adattarsi al conto.

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

Le autorizzazioni +1 dovrebbero impedire questo codice. Ma se la gente può scrivere tramite la vista, sospetto che ci siano anche permessi sui tavoli di base ... – gbn

+0

Grazie, funziona come un incantesimo. Queste viste faranno effettivamente riferimento a un altro database, a cui l'utente non avrà accesso. Voglio renderli di sola lettura in modo che l'utente non sia in grado di modificare quel database a cui non ha accesso tramite le viste nel database a cui ha accesso. Voglio utilizzare le autorizzazioni per-database invece delle autorizzazioni per oggetto per mantenere le cose semplici e per essere più sicuro di non perdere una violazione delle definizioni dei permessi. –

+3

Indicherò un pericolo con il codice aggiunto alla fine. Sembra incentrato sul 'WITH CHECK OPTION'. Se torni e modifichi tardi la vista con SQL Server Management Studio, non includerà il 'WITH CHECK OPTION' e la vista sarà nuovamente letta/riscritta. – BIBD

7

è possibile specificare un operatore UNION al fine di rendere SQL Server non riuscire durante l'INSERT/UPDATE/DELETE operazione, in questo modo:

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

L'ultima query non restituisce alcuna riga a tutti, ma deve avere la stessa quantità di campi con gli stessi tipi di dati della prima query, al fine di utilizzare il UNION in modo sicuro. Vedere questo link per maggiori informazioni: Different ways to make a table read only in a SQL Server database

+0

È inoltre possibile aggiungere una tabella "UNION SELECT TOP 0 * FROM" (almeno in SQLServer 2014). – Christoph

Problemi correlati