12
votes

Création de vues réadonnées dans SQL Server

Selon MSDN, les vues composées de sélection simples vous permettent automatiquement d'utiliser des instructions d'insertion / mise à jour / Supprimer sur la table. Existe-t-il un moyen d'éviter cela - de dire à SQL Server que la vue est réadonnée et que vous ne pouvez pas l'utiliser pour modifier la table?


0 commentaires

3 Réponses :


17
votes

Le meilleur moyen serait de supprimer les autorisations update / delete / insérer / insert code> sur la vue.

En dehors de cela, vous pouvez créer un au lieu de la gâchette code> sur la vue qui ne fait que simplement que les mises à jour échouent silencieusement ou il y a Pas de constructions qui font des vues non mises à jour . Donc, vous pouvez en choisir un qui ne change pas la sémantique ou l'efficacité, puis la violez. P>

EDIT: STRUT> Le ci-dessous semble adapter la facture. P>

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


5 commentaires

+1 Les autorisations doivent empêcher ce code. Mais si le folk peut écrire via la vue, je suppose que des autorisations sont aussi des autorisations sur les tables de base ...


Merci, fonctionne comme un charme. Ces points de vue feront réellement référence à une autre base de données, que l'utilisateur n'aura pas accès à. Je tiens à les faire rétablir afin que l'utilisateur ne puisse pas modifier cette base de données, il n'a pas accès à via les vues de la base de données qu'il a accès à. Je souhaite utiliser des autorisations par base de données au lieu d'autorisations par objet pour garder les choses simples et être plus sûrs de ne pas manquer une infraction dans les définitions de permission.


Je signalerai un danger avec le code ajouté à la fin. Il semble charger sur le "avec l'option de contrôle". Si vous revenez en retard et que vous modifiez la vue avec SQL Server Management Studio, il n'inclut pas l'option de contrôle »et la vue sera lue / écriture à nouveau.


Pour toute autre personne à la recherche de clarté, Sélectionnez Top 100% doit être combiné avec avec l'option de contrôle à la fin de la vue afin de tentative d'écriture sur cette vue pour échouer. Dans mes tests avec 2014, l'une d'entre elles ne permet toujours pas de mettre à jour la vue.


Pour quelqu'un d'autre, la recherche de cela, il ne semble pas présenter un comportement cohérent pour moi. J'ai créé ma vue avec "Sélectionnez Top 100%" et "avec option de contrôle", mais si je tente de supprimer les données de la vue, les suppressions affectent la table sous-jacente. Ceci est sur SQL Server 2016.



13
votes

Vous pouvez spécifier un opérateur code> Union code> afin de faire échouer SQL Server lors de la fonctionnement insertion / mise à jour / Suppr> forte>, comme ceci:

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


1 commentaires

Vous pouvez également ajouter un "Union Select top 0 * de table" (au moins dans SQLServer 2014).



-1
votes

Le meilleur moyen de gérer cela est d'autoriser uniquement l'accès aux vues. Ou refuser l'insertion / mettre à jour / supprimer l'accès aux utilisateurs donnés. Marche parfaitement. Créez également des vues »avec (Nolock)".


0 commentaires