ALTER VIEW (Transact-SQL)
Modifica una vista creata in precedenza. È possibile utilizzare questa istruzione anche per le viste indicizzate. ALTER VIEW non influisce sulle stored procedure o i trigger dipendenti e non comporta modifiche delle autorizzazioni.
Convenzioni della sintassi Transact-SQL
Sintassi
ALTER VIEW [ schema_name . ] view_name [ ( column [ ,...n ] ) ]
[ WITH <view_attribute> [ ,...n ] ]
AS select_statement
[ WITH CHECK OPTION ] [ ; ]
<view_attribute> ::=
{
[ ENCRYPTION ]
[ SCHEMABINDING ]
[ VIEW_METADATA ]
}
Argomenti
schema_name
Nome dello schema a cui appartiene la vista.view_name
Vista da modificare.column
Nome o elenco di nomi delimitato da virgole delle colonne che si desidera includere nella vista specificata.Importante Le autorizzazioni di colonna vengono mantenute solo se il nome delle colonne rimane uguale prima e dopo l'esecuzione dell'istruzione ALTER VIEW.
[!NOTA]
Nelle colonne della vista, le autorizzazioni per un nome di colonna rimangono valide anche in seguito all'esecuzione di un'istruzione CREATE VIEW o ALTER VIEW, indipendentemente dall'origine dei dati sottostanti. Ad esempio, se si concedono autorizzazioni per la colonna SalesOrderID con un'istruzione CREATE VIEW, è possibile utilizzare un'istruzione ALTER VIEW per rinominare la colonna SalesOrderID, ad esempio in OrderRef, e mantenere comunque le autorizzazioni associate alla vista che utilizza la colonna SalesOrderID.
ENCRYPTION
Crittografa le voci nella tabella sys.syscomments contenenti il testo dell'istruzione ALTER VIEW. Se si utilizza WITH ENCRYPTION, la vista non viene pubblicata nell'ambito della replica di SQL Server.SCHEMABINDING
Associa la vista allo schema della tabella o delle tabelle sottostanti. Se si specifica SCHEMABINDING non è possibile apportare modifiche alle tabelle di base, che influiscono sulla definizione della vista. In questi casi, è necessario modificare o eliminare la definizione della vista per rimuovere le dipendenze dalla tabella da modificare. Quando si specifica SCHEMABINDING, l'argomento select_statement deve includere i nomi in due parti (schema**.**object) delle tabelle, viste o funzioni definite dall'utente a cui si fa riferimento. Tutti gli oggetti a cui viene fatto riferimento devono essere presenti nello stesso database.Le viste o tabelle che fanno parte di una vista creata con la clausola SCHEMABINDING non possono essere eliminate, a meno che tale vista non venga eliminata o modificata in modo che non sia più associata a uno schema. In caso contrario, nel Motore di database viene generato un errore. Inoltre, le istruzioni ALTER TABLE eseguite su tabelle che fanno parte di viste associate a schema hanno esito negativo se modificano la definizione della vista.
VIEW_METADATA
Specifica che l'istanza di SQL Server dovrà restituire alle API DB-Library, ODBC e OLE DB le informazioni sui metadati relativi alla vista anziché alla tabella o alle tabelle di base quando vengono richiesti metadati in modalità browse per una query che fa riferimento alla vista. I metadati in modalità browse sono metadati aggiuntivi restituiti dall'istanza di Motore di database alle API DB-Library, ODBC e OLE DB sul lato client. Tali metadati consentono alle API sul lato client di implementare cursori aggiornabili sul lato client. I metadati in modalità browse includono informazioni sulla tabella di base a cui appartengono le colonne del set di risultati.Per le viste create con VIEW_METADATA, i metadati in modalità browse restituiscono il nome della vista anziché i nomi delle tabelle di base nella descrizione delle colonne della vista nel set di risultati.
Quando si crea una vista con l'opzione VIEW_METADATA, tutte le relative colonne, tranne le colonne di tipo timestamp, risultano aggiornabili se la vista include trigger INSERT o UPDATE INSTEAD OF. Per ulteriori informazioni, vedere la sezione Osservazioni in CREATE VIEW (Transact-SQL).
AS
Azioni che la vista deve eseguire.select_statement
Istruzione SELECT che definisce la vista.WITH CHECK OPTION
Forza il rispetto del set di criteri specificato in select_statement per tutte le istruzioni di modifica dei dati eseguite sulla vista.
Osservazioni
Per ulteriori informazioni sull'istruzione ALTER VIEW, vedere la sezione Osservazioni in CREATE VIEW (Transact-SQL).
[!NOTA]
Se la definizione precedente della vista è stata creata con WITH ENCRYPTION o CHECK OPTION, queste opzioni vengono abilitate solo se sono incluse nell'istruzione ALTER VIEW.
Se si modifica una vista in uso con ALTER VIEW, Motore di database acquisisce un blocco di schema esclusivo sulla vista. Quando viene concesso il blocco e non esistono utenti attivi della vista, Motore di database elimina tutte le copie della vista dalla cache delle procedure. I piani esistenti che fanno riferimento alla vista rimangono nella cache, ma vengono ricompilati per chiamate successive.
È possibile utilizzare ALTER VIEW per viste indicizzate. Tuttavia, in questo caso vengono eliminati tutti gli indici nella vista, senza eccezioni.
Autorizzazioni
Per eseguire ALTER VIEW, è richiesta come minimo l'autorizzazione ALTER per OBJECT.
Esempi
Nell'esempio seguente viene creata una vista contenente tutti i dipendenti e le relative date di assunzione, denominata EmployeeHireDate. Vengono concesse autorizzazioni alla vista, ma è richiesta una modifica dei requisiti per selezionare i dipendenti con date di assunzione precedenti alla data specificata. La vista viene quindi sostituita tramite l'istruzione ALTER VIEW.
USE AdventureWorks2012 ;
GO
CREATE VIEW HumanResources.EmployeeHireDate
AS
SELECT p.FirstName, p.LastName, e.HireDate
FROM HumanResources.Employee AS e JOIN Person.Person AS p
ON e.BusinessEntityID = p.BusinessEntityID ;
GO
È necessario modificare la vista per includere solo i dipendenti assunti prima del 2002. Se non si utilizza ALTER VIEW, ma si elimina e ricrea la vista, sarà necessario specificare nuovamente l'istruzione GRANT utilizzata in precedenza e qualsiasi altra istruzione correlata alle autorizzazioni per questa vista.
ALTER VIEW HumanResources.EmployeeHireDate
AS
SELECT p.FirstName, p.LastName, e.HireDate
FROM HumanResources.Employee AS e JOIN Person.Person AS p
ON e.BusinessEntityID = p.BusinessEntityID
WHERE HireDate < CONVERT(DATETIME,'20020101',101) ;
GO