2014-06-24 7 views
6

Quando si lavora con le viste in SQL Server Management Studio, preferisco sceneggiare le viste in istruzioni ALTER, apportare le modifiche, formattare correttamente il codice e quindi eseguire l'istruzione. Tuttavia, a volte quando scrivo una vista con cui ho lavorato in precedenza, la mia formattazione è andata persa e vedo un sacco di proprietà estese aggiunte alla mia vista.Editor di query blocco dalla modifica delle visualizzazioni in SQL Server Management Studio

Da ciò ho dedotto che qualcun altro ha utilizzato l'editor di query (designer) SSMS per modificare la visualizzazione, il che è fastidioso poiché interrompe completamente la mia formattazione.

C'è un modo per impedire agli utenti di utilizzare la finestra di progettazione per modificare le viste in SSMS? Idealmente alcune impostazioni del database, ma in alternativa, alcuni hack che impedirebbero al designer di aprire la vista.

L'approccio pragmatico sarebbe semplicemente quello di parlare con gli utenti e farli smettere di usare il designer, ma temo che le vecchie abitudini siano dure a morire, e non voglio passare un altro minuto di codice di riformattazione che ho già formattato molte volte prima ...

risposta

8

No, non c'è un modo efficace per farlo.

Aggiungendo costrutti che il progettista non supporta ma che non cambiano la semantica potrebbe essere una possibilità

WHERE (1 = (SELECT ROW_NUMBER() OVER (ORDER BY @@SPID))) 

Tuttavia in realtà non funziona. All'apertura della visualizzazione viene visualizzato il messaggio

Non è possibile rappresentare il testo SQL nel riquadro della griglia e nel riquadro del diagramma.

e questi riquadri sono vuoti ma il riquadro SQL viene ancora visualizzato e contiene l'SQL riformattato per la modifica. Anche il precedente ha il rischio di cambiare il piano di esecuzione in modo negativo.

Un altro approccio potrebbe essere quello di creare un trigger DDL.

Le stringhe nome_programma di default che vedo per il progettista rispetto a una finestra di query sono "Microsoft SQL Server Management Studio" e "Microsoft SQL Server Management Studio - Query", quindi è possibile utilizzarle.

CREATE TRIGGER NoAlterViewFromSSMS 
ON DATABASE 
FOR ALTER_VIEW 
AS 
    IF APP_NAME() = 'Microsoft SQL Server Management Studio' 
    BEGIN 
     RAISERROR ('Please don''t use the designer to ALTER views',16, 1) 
     ROLLBACK 
    END 
GO 

Ma questo non funzionerà finché non tenteranno di salvare e i tuoi colleghi potrebbero essere molto infastiditi. L'AppName utilizzato dallo studio di gestione è configurabile in ogni caso, quindi questo potrebbe anche essere aggirato.

L'unica altra opzione che posso pensare sarebbe quella di cercare nel sito di Connect bug che impediscano l'apertura del designer (ne ricordo vagamente uno con sintassi di commento annidato) ma anche se ne trovi uno sei a rischio che lo faranno essere riparato in un service pack futuro.

1

Il nome dell'applicazione di sql server quando si utilizza la query per modificare la visualizzazione, è Microsoft SQL Server Management Studio - Query e il nome dell'applicazione di sql server quando si utilizza la finestra di progettazione per modificare la vista è Microsoft SQL Server Management Studio.

È possibile creare DDL Trigger per ALTER_VIEW per controllare APP_Name() e limitare l'utente a utilizzare query anziché designer.

CREATE TRIGGER LimitUseDesignerForView ON DATABASE 
FOR ALTER_VIEW 
AS 
    IF APP_NAME() = 'Microsoft SQL Server Management Studio' 
    BEGIN 
     RAISERROR ('Use query in order to alter your view',16, 1) 
     ROLLBACK 
    END 
GO 

È anche possibile ottenere l'elenco di punti di vista di SQL Server che utilizzano progettista dal seguente query:

SELECT DISTINCT OBJECT_NAME(ep.major_id) 
FROM sys.extended_properties ep 
WHERE ep.name LIKE 'MS_DiagramPane%' 

vi suggerisco di non limitare l'utente da APP_NAME() perché l'utente forse usare l'applicazione strumenti al fine per utilizzare view designer come EMS, ecc.

È possibile limitare i propri utenti utilizzando la limitazione sul trigger DDL DDL_EXTENDED_PROPERTY_EVENTS.

CREATE TRIGGER LimitUseDesignerForView ON DATABASE 
FOR DDL_EXTENDED_PROPERTY_EVENTS 
AS 
    IF (EVENTDATA().value('(/EVENT_INSTANCE/Parameters/Param)[1]','nvarchar(max)') LIKE 'MS_DiagramPane%') BEGIN 
     RAISERROR ('Use query in order to alter your view',16, 1) 
     ROLLBACK 
    End 
GO 
0

Forse è possibile revocare l'autorizzazione di Alter Schema agli utenti, questo dovrebbe impedire loro di eseguire istruzioni ALTER View.

Si potrebbe dare il permesso ALTER SCHEMA per un altro utente e permettere a voi stessi di impersonare, quindi utilizzare EXECUTE AS per aggiornare la visualizzazione:

GRANT ALTER ON SCHEMA :: dbo TO user2; 
REVOKE ALTER ON SCHEMA :: dbo TO user1; 

GRANT IMPERSONATE ON USER:: user2 TO user1; 

-- Alter view script 
EXECUTE AS USER = 'user2'; 

ALTER VIEW ...... 

EXECUTE AS USER = 'user1'; 
Problemi correlati