2011-10-18 15 views
7

Według MSDN widoki złożone z prostych wyborów automatycznie pozwalają na użycie instrukcji wstawiania/aktualizacji/usuwania w tabeli. Czy istnieje sposób, aby temu zapobiec - powiedzieć serwerowi SQL, że widok jest tylko do odczytu i nie można go użyć do modyfikowania tabeli?Tworzenie widoków tylko do odczytu w serwerze Sql

Odpowiedz

12

Najlepszym sposobem byłoby usunięcie uprawnień UPDATE/DELETE/INSERT w widoku.

Poza tym można utworzyć wyzwalacz INSTEAD OF w widoku, który po prostu nie robi nic, aby aktualizacje cicho zawodziły lub są quite a few constructs that make views non updatable. Możesz wybrać taki, który nie zmienia semantyki lub wydajności, a następnie go narusza.

Edytuj: Poniżej wydaje się pasować do rachunku.

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

Uprawnienia +1 powinny zapobiegać temu kodowi. Ale jeśli ludzie mogą pisać poprzez widok, to podejrzewam, że są też pozwolenia na stołach bazowych ... – gbn

+0

Dzięki, działa jak czar. Te widoki będą w rzeczywistości odnosić się do innej bazy danych, do której użytkownik nie będzie miał dostępu. Chcę, aby były one tylko do odczytu, aby użytkownik nie mógł modyfikować bazy danych, do której nie ma dostępu za pośrednictwem widoków w bazie danych, do której ma dostęp. Chcę używać uprawnień do poszczególnych baz danych zamiast uprawnień dla poszczególnych obiektów, aby zachować prostotę i być pewnym, że nie przeoczę naruszenia definicji uprawnień. –

+3

Wskażę niebezpieczeństwo z kodem dołączonym do końca. Wydaje się, że zależy od "Z OPCJĄ KONTROLI". Jeśli wrócisz i poznasz edycję View with SQL Server Management Studio, to nie będzie zawierać "WITH CHECK OPTION", a widok zostanie ponownie odczytany/zapisany. – BIBD

7

Mógłbyś podać operatorowi UNION aby uczynić SQL Server zawieść podczas INSERT/UPDATE/DELETE operację, tak:

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

Ostatnią kwerenda nie zwraca żadnych wierszy w ogóle, ale musi mieć taką samą ilość pól z tymi samymi typami danych co pierwsze zapytanie, aby bezpiecznie używać UNION. Zobacz ten link, aby uzyskać więcej informacji: Different ways to make a table read only in a SQL Server database

+0

Możesz również dodać "UNION SELECT TOP 0 * FROM table" (przynajmniej w SQLServer 2014). – Christoph