VIEW in SQL Server
- 24-07-2022
- Toanngo92
- 0 Comments
Mục lục
Ver conceito
View é uma tabela virtual criada por colunas selecionadas em uma ou mais tabelas. A tabela na visualização gerada faz referência à tabela original. Essas tabelas originais podem ser de diferentes bancos de dados. Uma visão também pode adicionar uma coluna de outra visão criada no mesmo banco de dados ou mesmo em um banco de dados diferente. Uma exibição pode ter até 1.024 colunas. Os dados dentro da exibição recuperados da tabela original farão referência à definição da exibição. As linhas e colunas na exibição serão criadas dinamicamente quando a exibição for referenciada.
Algumas situações em que as visualizações podem ser usadas como um negócio:
- Precisa obter a receita total do pedido por dia (apenas a coluna de receita) para atender aos negócios de relatórios
- Precisa fazer uma tabela que exiba algumas colunas para dar dados ao dev sem deixar o dev consultar diretamente no banco de dados para poder ver as colunas restantes, e essa tabela mostra apenas os dados de texto e não permite atualizações.
Com tais situações, como a situação nº 1, o administrador de banco de dados (DBA) usará a visão para fazer relatórios de negócios em vez de escrever uma instrução select complexa muitas vezes, ou a situação nº 2, a visão garantirá a segurança e a perspectiva de negócios para o DBA.
Criar visualização
Os usuários podem criar exibições usando colunas de tabelas ou outras exibições somente se o usuário tiver acesso a essas tabelas e exibições.
Sintaxe:
CREATE VIEW <view_name> AS <select_statement>
Por exemplo:
Crie uma visualização da tabela Production.Product para exibir o productid, productnumber, name, security stock do produto:
CREATE VIEW vwProductInfo AS SELECt ProductID, ProductNumber,Name,SafetyStockLevel FROM Production.Product; GO
Obter dados da visualização:
SELECT * FROM vwProductInfo
Crie uma View que combine uma cláusula JOIN para unir uma tabela
Cada view pode armazenar os dados de muitas tabelas diferentes porque é o resultado de uma consulta SELECT, essa é a vantagem que torna a view tão poderosa.
A palavra-chave JOIN pode ser usada durante a criação da view, é basicamente apenas uma junção para unir as tabelas através de colunas relacionadas, após a junção, a view é criada com base nos dados recuperados após a operação.
Sintaxe:
CREATE VIEW <view_name> AS SELECT * FROM table_name1 JOIN table_name2 ON table_name1.column_name = table_name2.column_name
Por exemplo:
Crie uma exibição chamada vwPersonDetails com as colunas especificadas das tabelas Person e Employee no esquema HumanResources. As palavras-chave JOIN e ON são usadas para unir 2 tabelas com base na coluna BusinessEntityID
CREATE VIEW vwPersonDetails AS SELECT p.Title, p.[FirstName], p.[MiddleName], p.[LastName], e.[JobTitle] FROM [humanResources].[Employee] e INNER JOIN [Person].[Person] p ON p.[BusinessEntityID] = e.[BusinessEntityID]; GO SELECT * FROM vwPersonDetails
No exemplo acima, existem muitas linhas que não possuem valores nas colunas title e name, e exibem valores nulos. É possível que o usuário que vê essa saída não entenda o significado dos valores NULL. Portanto, para substituir todos os valores NULL na saída por uma string vazia, a função COLALESCE() pode ser usada
CREATE VIEW vwPersonDetails AS SELECT COALESCE(p.Title,'') AS Title, p.[FirstName], COALESCE(p.[MiddleName],'') AS MiddleName, p.[LastName], e.[JobTitle] FROM [humanResources].[Employee] e INNER JOIN [Person].[Person] p ON p.[BusinessEntityID] = e.[BusinessEntityID]; GO SELECT * FROM vwPersonDetails
Algumas regras a serem seguidas ao usar visualizações:
- As visualizações só podem ser criadas no banco de dados atual. Somente após a criação de uma visualização, as tabelas e visualizações baseadas nessa visualização podem ser criadas a partir de outro banco de dados ou servidor.
- O nome da exibição deve sempre ser exclusivo e não pode ter o mesmo nome da tabela no esquema.
- As visualizações não podem ser criadas a partir de tabelas temporárias.
criar exibição combinada com Ordenar por para classificar
O exemplo abaixo usa a cláusula TOP em combinação com ORDER BY para recuperar 10 funcionários no sentido inverso com base na coluna FirstName:
CREATE VIEW vwSortedPersonDetails AS SELECT TOP 10 COALESCE (p.title,' ') AS Title, p.[FirstName] ,COALESCE(p.MiddleName,' ') AS MiddleName ,p.[LastName] ,e.[JobTitle] FROM [HumanResources].[Employee] e INNER JOIN [Person].[Person] p ON p.[BusinessEntityID] = e.[BusinessEntityID] ORDER BY p.FirstName DESC GO SELECT * FROM vwSortedPersonDetails
Editando dados por meio do View
As visualizações podem ser usadas para editar dados em uma tabela, os dados podem ser adicionados, editados ou excluídos através dos seguintes comandos:
- INSERIR
- ATUALIZAR
- EXCLUIR
INSERIR visualização
A instrução INSERT é usada para adicionar uma nova linha a um banco de dados ou exibição, durante a execução do comando, se um valor de coluna não for fornecido, o SQL Server Database Engine terá que fornecer um valor com base na definição da coluna. Se o Mecanismo de Banco de Dados não fornecer esse valor, a nova linha não será adicionada.
Valores para coluna com valor automático:
- Tem atributo IDENTITY .
- Tem um valor padrão definido
- Data e hora do tipo de dados
- Colunas que permitem valores nulos
- Coluna com valor calculado
Ao utilizar a instrução INSERT em uma view, caso alguma regra seja violada, o registro não será adicionado.
Por exemplo:
Etapa 1: criar a tabela Employee_Personal_details
CREATE TABLE Employee_Personal_Details( EmpID int NOT NULL, FirstName varchar(30) NOT NULL, LastName varchar(30) NOT NULL, Address varchar(30) )
Etapa 2: criar a tabela Employee_Salary_Details
CREATE TABLE Employee_Salary_Details( EmpID int not null, Designation varchar(30), Salary int not null )
Etapa 3: criar a visualização vwEmployee_Details usando colunas das tabelas Employee_Personal_Details e Employee_Salary_Details , juntando 2 tabelas por meio da coluna EmpID
CREATE VIEW vwEmployee_Personal_Details AS SELECT e1.EmpID, FirstName, LastName, Designation, Salary FROM Employee_Personal_Details e1 JOIN Employee_Salary_Details e2 ON e1.EmpID = e2.EmpID
Use a instrução INSERT para colocar dados na tabela por meio da exibição vwEmployee_Details . No entanto, o SQL dá uma mensagem de erro e os dados não podem ser incluídos na tabela:
INSERT INTO vwEmployee_Personal_Details VALUES(2,'Jack','Wilson','Software Developer',16000)
Os valores só podem ser adicionados a colunas com tipos de dados de usuário predefinidos da seguinte forma:
- Especifica o valor de um tipo de dados definido pelo usuário
- Chame uma função definida pelo usuário para retornar um valor com um tipo de dados definido pelo usuário
Algumas regras a serem seguidas ao inserir dados na visualização:
- A instrução INSERT precisa determinar o valor para todas as colunas na exibição na tabela se a tabela não permitir nulos e não houver definição DEFAULT.
- Quando há uma auto-junção na mesma visão ou tabela, a instrução INSERT não funcionará
O exemplo cria uma exibição chamada vwEmpdetails usando a tabela Employee_Personal_Details . A tabela Employee_Personal_Details contém uma coluna LastName que não permite inserir valores nulos:
O exemplo acima ao inserir dará um erro porque não é permitido inserir valores nulos para a coluna EmpID
CREATE VIEW vwEmpDetails AS SELECT FirstName, Address FROM Employee_Personal_Details GO INSERT INTO vwEmpDetails VALUES('Jack','NYC')
Atualizar visualização
A instrução UPDATE pode ser usada para alterar os dados na exibição. A atualização da exibição também atualizará os dados da tabela relacionada.
Por exemplo:
Etapa 1: crie uma tabela chamada Product_Details
CREATE TABLE Product_Details( ProductID int, ProductName varchar(30), Rate money ) GO INSERT INTO Product_Details VALUES (1,'DVD Writer',1250), (2,'DVD Writer',2250), (3,'DVD Writer',1250),(4,'External Hard Drive',2250), (5,'External Hard Drive',2250), (6,'External Hard Drive',2250); GO
Suponha para adicionar alguns valores à tabela como mostrado:
Etapa 2: criar uma visualização com base na tabela ProductDetails
CREATE VIEW vwProduct_Details AS SELECT ProductName,Rate FROM Product_Details
Etapa 3: atualize a visualização para alterar todo o valor do DVD para 4000
UPDATE vwProduct_Details SET Rate=3000 WHERE ProductName='DVD Writer'
Esses tipos de dados ocupam um grande tamanho de memória como nvarchar(max) , varchar(max) , varbinary(max) . Para atualizar dados desse tipo, é utilizada a cláusula .WRITE . A cláusula .WRITE especifica a partição onde o valor da coluna será modificado. A cláusula .WRITE não pode ser usada para atualizar o valor NULL de uma coluna. Portanto, não pode ser usado para definir o valor da coluna como NULL
Sintaxe:
column_name .WRITE(expression,@Offeset,@Length)
Suponha que a tabela Product_Details seja modificada para que a coluna Description tenha dados do tipo nvarchar(max)
A visualização é criada com base nesta tabela, possui colunas ProductName,Description, Rate
CREATE VIEW vwProduct_Details AS SELECT ProductName, Description, Rate FROM Product_Details
O exemplo de código acima usa o comando UPDATE para a exibição vwProduct_Details. A cláusula .WRITE será utilizada com 2 parâmetros 0 e 2 para alterar o valor dos 2 primeiros caracteres da coluna Descrição. Em seguida, o valor 'Interno' mudará para 'Externo'
UPDATE vwProduct_Details SET Description .WRITE(N'Ex',0,2) WHERE ProductName='PortableHardDrive'
Algumas regras a serem seguidas ao usar a instrução UPDATE na exibição:
- O valor da coluna com o atributo IDENTITY não pode ser atualizado.
- O registro não pode ser atualizado se a tabela contiver uma coluna com o valor TIMESTAMP
- Quando há uma associação automática na mesma visualização ou tabela, o comando UPDATE não funciona.
- Ao atualizar a linha, se a restrição for violada, a instrução será encerrada e um erro será retornado, nenhum registro será atualizado.
EXCLUIR visualização
O SQL Server permite que os usuários excluam registros da exibição. As linhas podem ser removidas da VIEW usando a instrução DELETE. Quando um registro é removido da visualização, as linhas correspondentes são excluídas da tabela
Por exemplo, há a visualização vwCustDetails, que recuperará todas as informações da conta de diferentes clientes. Quando o cliente fecha a conta, os detalhes do cliente precisam ser excluídos.
Sintaxe:
DELETE FROM <view_name> WHERE <search_condition>
Por exemplo:
DELETE FROM vwCustDetails WHERE CustID='C0004'
Alterar visualização
Além de editar dados, os usuários também podem editar definições na exibição. Uma vista pode ser editada através do comando ALTER VIEW. O comando ALTER VIEW modifica a visualização atual sem reorganizar as permissões ou outras propriedades.
ALTER VIEW pode ser aplicado a visualizações indexadas, no entanto, removerá todos os índices da visualização incondicionalmente. As visualizações geralmente são alteradas quando o usuário solicita informações adicionais ou faz alterações na definição da tabela subjacente
ALTER VIEW <view_name> AS <select_statement>
Por exemplo:
ALTER VIEW vwProductInfo AS SELECT ProductID, ProductNumber,Name, SafetyStockLevel,ReOrderPoint FROM Production.Product; GO
SOLTAR Visualização
Uma visão pode ser removida do banco de dados se não for necessária, ela é usada por meio da instrução DROP VIEW. Depois que a exibição é excluída, os dados na tabela principal não são afetados. A definição de visualização e as informações relacionadas à visualização serão removidas do diretório do sistema. Todas as permissões de visualização também serão removidas. Se um usuário consultar uma exibição que faz referência a uma exibição excluída, o sql server retornará uma mensagem de erro.
Sintaxe:
DROP VIEW <view_name>
Por exemplo:
DROP VIEW vwProductInfo
Visualizar definição
A definição de uma visualização ajuda o usuário a entender como seus dados são recuperados das tabelas de origem. Existem vários procedimentos armazenados no sistema que ajudam na recuperação de definições de exibição. O procedimento armazenado sp_helptext exibe informações relacionadas à exibição quando o nome da exibição é fornecido como seu parâmetro. Informações sobre a definição de uma visão podem ser obtidas se as informações não forem criptografadas.
sp_helptext<view_name>
Por exemplo:
exec sp_helptext vwEmployee_Personal_Details
VERIFICAR OPÇÃO Ver
A palavra-chave CHECK OPTION da exibição é opcional, que é uma opção associada à instrução CREATE VIEW. Ele é usado para garantir que todas as atualizações na visualização satisfaçam as condições mencionadas na definição da visualização. Se a condição não for satisfeita, o mecanismo de banco de dados retornará um erro. Assim, CHECK OPTION é utilizado para garantir a lógica e integridade dos dados, ele irá verificar a definição da view para ver se as condições WHERE na instrução SELECT foram violadas ou não.
Com a cláusula WITH CHECK OPTION, força todos os modificadores a serem executados na exibição para cumprir a condição definida na instrução SELECT.
Sintaxe:
CREATE VIEW <view_name> AS select_statement [WITH CHECK OPTION]
Exemplo para recriar a visualização vwProductInfo com SafetyStockLevel menor ou igual a 1000:
CREATE VIEW vwProductInfo AS SELECT ProductID, ProductNumber, Name, SafetyStockLevel, ReOrderPoint FROM Production.Product WHERE SafetyStockLevel <= 1000 WITH CHECK OPTION; GO
Na próxima etapa, use a instrução UPDATE usada para editar a visualização vwProductInfo alterando o valor da coluna SafetyStockLevel para o produto com ID 321 e 2500.
UPDATE vwProductInfo SET SafetyStockLevel = 2500 WHERE ProductID = 321
Essa instrução não será executada porque viola a restrição WITH CHECK OPTION , SafetyStockLevel <= 1000. Portanto, nenhuma linha é atualizada na exibição vwProductInfo .
OPÇÃO DE VINCULAÇÃO DE ESQUEMA em exibição
Uma visualização pode ser vinculada ao esquema de uma tabela usando a opção SCHEMABINDING. Esta opção pode ser usada com instruções CREATE VIEW ou ALTER VIEW. Quando SCHEMABIDING é usado, a tabela base ou tabelas que não podem ser modificadas afetarão a definição da visualização. A exibição deve primeiro ser modificada ou excluída para remover as dependências de tabela a serem modificadas.
Ao usar SCHEMABINDING em uma exibição, o nome do esquema deve ser especificado junto com o nome do objeto na instrução SELECT
Sintaxe:
CREATE VIEW <view_name> WITH SCHEMABINDING AS <select_statement>
Por exemplo:
CREATE VIEW vwNewProductInfo WITH SCHEMABINDING AS SELECT ProductID,ProductNumber,Name,SafetyStockLevel FROM Production.Product; GO
Usando sp_refreshview
Durante a criação da view, SCHEMABIDING pode ser usado para vincular valores da view ao esquema da tabela adicionada na view. No entanto, as visualizações podem ser criadas sem selecionar a opção SCHEMABIDING. Nessas situações, se ocorrer uma alteração no objeto, como uma tabela ou exibição da qual essa exibição depende, um procedimento armazenado denominado sp_refreshview deverá ser executado. Este procedimento armazenado atualiza os metadados da exibição, caso não seja executado, os metadados da exibição não serão atualizados de acordo com as alterações na tabela original. O conjunto de resultados retornará alguns resultados inesperados quando a exibição for solicitada.
Sintaxe:
sp_refreshview '<view_name>'
Por exemplo:
Etapa 1 – crie a tabela Customers .
CREATE TABLE Customers( CustID int, CustName varchar(50), Address varchar(60) )
Etapa 2 – crie uma visualização vwCustomers com base na tabela Customers.
CREATE VIEW vwCustomers AS SELECT * FROM Customers
Etapa 3 – selecione os dados em exibição
SELECT * FROM vwCustomer
A saída acima retornará 3 colunas CustID,CustName,Address
Passo 4 – ALTER TABLE e adicione a coluna Age na tabela Customers.
ALTER TABLE Customers ADD Age int
Etapa 5 – selecione novamente os dados na exibição, mas você verá que a coluna Idade ainda não é exibida
SELECT * FROM vwCustomer
Etapa 6 – Execute o procedimento armazenado sp_refreshview para atualizar os metadados e a saída da exibição:
EXEC sp_refreshview 'vwCustomers'
As tabelas que têm uma conexão de esquema com uma exibição não podem ser eliminadas, a menos que a exibição seja eliminada primeiro ou altere a definição para nenhum esquemabiding. Se a exibição não tiver sido excluída ou atualizada e você tentar excluir a tabela, o Mecanismo de Banco de Dados retornará uma mensagem de erro.
Da mesma forma, quando uma instrução ALTER TABLE é aplicada a uma definição de exibição vinculada ao esquema, a instrução falhará.
Por exemplo:
ALTER TABLE Production.Product ALTER COLUMN ProductID varchar(7)
O Mecanismo de Banco de Dados retornará um erro porque esta tabela está vinculada ao esquema com a exibição vwNewProductInfo e, portanto, modificá-la viola a definição da exibição.
Recursos da Visualização
Em geral, quando você usa o View, há as seguintes vantagens:
Sobre segurança
Você pode restringir os usuários a acessarem a tabela diretamente, ao invés de permitir que eles acessem através da visualização para que seja mais seguro. Por quê? Como a exibição é apenas uma exibição, só é permitido ler as informações existentes na exibição, não exibir mais informações ou alterar dados.
Por exemplo, você pode permitir que os usuários acessem o nome do cliente, telefone e e-mail por meio da exibição, mas restringi-los de acessar contas bancárias e outras informações confidenciais.
Simplificar
Ao escrever uma consulta com muitas tabelas, será muito complicado, você tem que testar muito para ter certeza de que o resultado está correto, às vezes não. No entanto, se você combinar exibições, dividir em vários segmentos e cada exibição for um segmento, a execução de consultas na exibição será muito mais fácil de entender.
Consistência
Às vezes, você precisa escrever uma fórmula complexa que é usada em muitas consultas, e nesse ponto você terá que escrevê-la repetidamente.
Mas se você colocar essa fórmula em uma visão, então outras consultas se referem a ela a partir da visão, será conveniente e consistente, depois editando a fórmula, basta editá-la na visão.