Quando e por que alguém decide que precisa criar uma Visualização em seu banco de dados? Por que não apenas executar um procedimento armazenado normal ou selecionar?
Quando e por que alguém decide que precisa criar uma Visualização em seu banco de dados? Por que não apenas executar um procedimento armazenado normal ou selecionar?
Respostas:
Uma visão fornece vários benefícios.
1. As visualizações podem ocultar a complexidade
Se você tiver uma consulta que exija a junção de várias tabelas ou tenha lógica ou cálculos complexos, poderá codificar toda essa lógica em uma visualização e selecionar a partir da visualização da mesma maneira que faria com uma tabela.
2. As visualizações podem ser usadas como um mecanismo de segurança
Uma visualização pode selecionar determinadas colunas e / ou linhas de uma tabela (ou tabelas) e as permissões definidas na visualização em vez das tabelas subjacentes. Isso permite exibir apenas os dados que um usuário precisa ver.
3. As visualizações podem simplificar o código legado de suporte
Se você precisar refatorar uma tabela que quebraria muito código, poderá substituí-la por uma exibição com o mesmo nome. A visualização fornece exatamente o mesmo esquema da tabela original, enquanto o esquema real foi alterado. Isso evita que o código legado que faz referência à tabela seja quebrado, permitindo que você altere o código legado à sua vontade.
Estes são apenas alguns dos muitos exemplos de como as visualizações podem ser úteis.
Entre outras coisas, pode ser usado para segurança. Se você possui uma tabela "customer", convém dar a todos os seus vendedores acesso aos campos de nome, endereço, CEP etc., mas não credit_card_number. Você pode criar uma exibição que inclua apenas as colunas às quais precisam acessar e conceder acesso à exibição.
Select name, address, zipcode from customer
não serviria ao propósito em vez de creating a view
?
select * from customer
que lhes dará acesso a tudo. Se você lhes der acesso à visualização e não à tabela, eles não poderão acessar os campos que não estão na visualização.
Uma visão é um encapsulamento de uma consulta. As consultas que são transformadas em visualizações tendem a ser complicadas e, portanto, salvá-las como uma visualização para reutilização pode ser vantajosa.
Normalmente, crio visualizações para desnormalizar e / ou agregar dados frequentemente usados para fins de relatório.
EDITAR
Por meio de elaboração, se eu tivesse um banco de dados no qual algumas das entidades fossem pessoa, empresa, função, tipo de proprietário, pedido, detalhes do pedido, endereço e telefone, onde a tabela de pessoas armazenava funcionários e contatos e o endereço e endereço de e-mail. tabelas de telefone armazenavam números de telefone para pessoas e empresas, e a equipe de desenvolvimento recebia a tarefa de gerar relatórios (ou tornar os dados de relatórios acessíveis a não desenvolvedores), como vendas por funcionário, vendas por cliente ou vendas por região, vendas por mês , clientes por estado, etc. Eu criaria um conjunto de visualizações que normalizariam os relacionamentos entre as entidades do banco de dados, para que uma visão mais integrada (sem trocadilhos) das entidades do mundo real estivesse disponível. Alguns dos benefícios podem incluir:
Várias razões: se você tem junções complicadas, às vezes é melhor ter uma visualização para que qualquer acesso sempre tenha as junções corretas e os desenvolvedores não precisem se lembrar de todas as tabelas de que precisam. Normalmente, isso pode ser para um aplicativo financeiro em que seria extremamente importante que todos os relatórios financeiros fossem baseados no mesmo conjunto de dados.
Se você possui usuários que deseja limitar os registros que eles podem ver, use uma visualização, conceda-lhes acesso apenas à visualização e não às tabelas subjacentes e, em seguida, consulte a visualização
Os relatórios Crystal parecem preferir usar visualizações em procs armazenados, portanto, as pessoas que escrevem muito relatórios tendem a usar muitas visualizações
As visualizações também são muito úteis ao refatorar bancos de dados. Muitas vezes, você pode ocultar a alteração para que o código antigo não a veja criando uma exibição. Leia os bancos de dados de refatoração para ver como isso funciona, pois é uma maneira muito poderosa de refatorar.
A principal vantagem de uma visão sobre um procedimento armazenado é que você pode usar uma visão da mesma maneira que uma tabela. Ou seja, uma visão pode ser referida diretamente na FROM
cláusula de uma consulta. Por exemplo SELECT * FROM dbo.name_of_view
,.
Em praticamente todas as outras formas, os procedimentos armazenados são mais poderosos. Você pode passar parâmetros, incluindo out
parâmetros que permitem que você efetivamente para retornar vários valores de uma vez, você pode fazer SELECT
, INSERT
, UPDATE
, e DELETE
operações, etc. etc.
Se você deseja que a View possa consultar a partir da FROM
cláusula, mas também deseja passar parâmetros, há uma maneira de fazer isso também. Isso é chamado de função com valor de tabela.
Aqui está um artigo bastante útil sobre o tópico:
EDIT: A propósito, isso meio que levanta a questão: que vantagem uma visão tem sobre uma função com valor de tabela? Não tenho uma resposta muito boa para isso, mas observarei que a sintaxe T-SQL para criar uma exibição é mais simples que para uma função com valor de tabela, e os usuários do seu banco de dados podem estar mais familiarizados com as exibições.
Pode funcionar como um bom "intermediário" entre seu ORM e suas tabelas.
Exemplo:
Tínhamos uma tabela Person que precisávamos alterar a estrutura nela, para que a coluna SomeColumn fosse movida para outra tabela e tivesse um relacionamento de um para muitos.
No entanto, a maioria do sistema, no que diz respeito à Pessoa, ainda usava o SomeColumn como uma única coisa, não muitas coisas. Usamos uma view para reunir todas as SomeColumns e colocá-las na view, que funcionou bem.
Isso funcionou porque a camada de dados havia mudado, mas o requisito de negócios não havia mudado fundamentalmente; portanto, os objetos de negócios não precisavam mudar. Se os objetos de negócios precisassem mudar, não acho que essa seria uma solução viável, mas as visualizações definitivamente funcionam como um bom ponto intermediário.
Para se concentrar em visualizações de dados específicas, os usuários podem se concentrar em dados específicos que lhes interessam e nas tarefas específicas pelas quais são responsáveis. Dados desnecessários podem ser deixados de fora da visualização. Isso também aumenta a segurança dos dados porque os usuários podem ver apenas os dados definidos na exibição e não os dados na tabela subjacente. Para obter mais informações sobre o uso de modos de exibição para fins de segurança, consulte Usando modos de exibição como mecanismos de segurança.
Para simplificar a manipulação de dados As visualizações podem simplificar como os usuários manipulam dados. Você pode definir junções, projeções, consultas UNION e consultas SELECT usadas como visualizações, para que os usuários não precisem especificar todas as condições e qualificações cada vez que uma operação adicional for executada nesses dados. Por exemplo, uma consulta complexa usada para fins de relatório e executa subconsultas, junções externas e agregação para recuperar dados de um grupo de tabelas pode ser criada como uma exibição. A visualização simplifica o acesso aos dados porque a consulta subjacente não precisa ser gravada ou enviada toda vez que o relatório é gerado; a visualização é consultada. Para mais informações sobre como manipular dados.
Você também pode criar funções definidas pelo usuário em linha que operam logicamente como visualizações parametrizadas ou visualizações que possuem parâmetros nas condições de pesquisa da cláusula WHERE. Para obter mais informações, consulte Funções definidas pelo usuário em linha.
Para personalizar as visualizações de dados, permite que usuários diferentes vejam dados de maneiras diferentes, mesmo quando estão usando os mesmos dados simultaneamente. Isso é particularmente vantajoso quando usuários com muitos interesses e níveis de habilidade diferentes compartilham o mesmo banco de dados. Por exemplo, pode ser criada uma exibição que recupera apenas os dados dos clientes com os quais um gerente de contas lida. A visualização pode determinar quais dados recuperar com base no ID de login do gerente de conta que usa a visualização.
Para exportar e importar dados As visualizações podem ser usadas para exportar dados para outros aplicativos. Por exemplo, convém usar as lojas e as tabelas de vendas no banco de dados de pubs para analisar dados de vendas usando o Microsoft® Excel. Para fazer isso, você pode criar uma exibição com base nas lojas e nas tabelas de vendas. Você pode usar o utilitário bcp para exportar os dados definidos pela exibição. Os dados também podem ser importados para determinadas visualizações de arquivos de dados usando o utilitário bcp ou a instrução BULK INSERT, desde que as linhas possam ser inseridas na visualização usando a instrução INSERT. Para obter mais informações sobre as restrições para copiar dados em visualizações, consulte INSERIR. Para obter mais informações sobre como usar o utilitário bcp e a instrução BULK INSERT para copiar dados de e para uma exibição, consulte Copiando para ou de uma exibição.
Para combinar dados particionados O operador do conjunto Transact-SQL UNION pode ser usado em uma exibição para combinar os resultados de duas ou mais consultas de tabelas separadas em um único conjunto de resultados. Isso aparece para o usuário como uma única tabela chamada visualização particionada. Por exemplo, se uma tabela contiver dados de vendas para Washington e outra tabela contiver dados de vendas para a Califórnia, uma exibição poderá ser criada a partir do UNION dessas tabelas. A exibição representa os dados de vendas para as duas regiões. Para usar visualizações particionadas, você cria várias tabelas idênticas, especificando uma restrição para determinar o intervalo de dados que podem ser adicionados a cada tabela. A visualização é criada usando essas tabelas base. Quando a exibição é consultada, o SQL Server determina automaticamente quais tabelas são afetadas pela consulta e faz referência apenas a essas tabelas. Por exemplo, se uma consulta especificar que apenas dados de vendas para o estado de Washington são necessários, o SQL Server lerá apenas a tabela que contém os dados de vendas de Washington; nenhuma outra tabela é acessada.
As visualizações particionadas podem se basear em dados de várias fontes heterogêneas, como servidores remotos, não apenas em tabelas no mesmo banco de dados. Por exemplo, para combinar dados de diferentes servidores remotos, cada um dos quais armazena dados para uma região diferente da sua organização, você pode criar consultas distribuídas que recuperam dados de cada fonte de dados e, em seguida, criar uma exibição com base nessas consultas distribuídas. Qualquer consulta lê apenas dados das tabelas nos servidores remotos que contêm os dados solicitados pela consulta; os outros servidores referenciados pelas consultas distribuídas na visualização não são acessados.
Quando você particiona dados em várias tabelas ou vários servidores, as consultas que acessam apenas uma fração dos dados podem ser executadas mais rapidamente porque há menos dados a serem verificados. Se as tabelas estiverem localizadas em servidores diferentes ou em um computador com vários processadores, cada tabela envolvida na consulta também poderá ser verificada em paralelo, melhorando assim o desempenho da consulta. Além disso, tarefas de manutenção, como reconstruir índices ou fazer backup de uma tabela, podem ser executadas mais rapidamente. Usando uma exibição particionada, os dados ainda aparecem como uma única tabela e podem ser consultados como tal sem ter que fazer referência manual à tabela subjacente correta.
As visualizações particionadas são atualizáveis se uma dessas condições for atendida: Um gatilho INSTEAD OF é definido na visualização com lógica para suportar instruções INSERT, UPDATE e DELETE.
A visualização e as instruções INSERT, UPDATE e DELETE seguem as regras definidas para visualizações particionadas atualizáveis. Para mais informações, consulte Criando uma vista particionada.
https://technet.microsoft.com/en-us/library/aa214282(v=sql.80).aspx#sql:join
Aqui estão dois motivos comuns:
Você pode usá-lo para segurança. Não conceda permissões na tabela principal e crie visualizações que limitam o acesso a colunas ou linhas e conceda permissões aos usuários para ver a visualização.
Você pode usá-lo por conveniência. Junte algumas tabelas que você usa o tempo todo na exibição. Isso pode tornar as consultas consistentes e fáceis.
Há mais de um motivo para fazer isso. Às vezes, facilita consultas de junção comuns, pois é possível consultar um nome de tabela em vez de fazer todas as junções.
Outro motivo é limitar os dados a diferentes usuários. Então, por exemplo:
Tabela1: Colunas - USER_ID; USERNAME; SSN
Os usuários administradores podem ter privs na tabela real, mas os usuários que você não deseja ter acesso para dizer o SSN, criam uma visualização como
CREATE VIEW USERNAMES AS SELECT user_id, nome de usuário FROM Tabela1;
Em seguida, dê a eles privs para acessar a vista e não a mesa.
As visualizações podem ser uma dádiva de Deus ao gerar relatórios em bancos de dados herdados. Em particular, você pode usar nomes de tabelas sensuais em vez de nomes de 5 letras enigmáticas (onde 2 deles são um prefixo comum!) Ou nomes de colunas cheios de abreviações que, com certeza, faziam sentido na época.
Geralmente, eu exibo visualizações para facilitar a vida, obter detalhes estendidos de alguma entidade armazenada em várias tabelas (eliminar muitas junções no código para melhorar a legibilidade) e às vezes compartilhar dados em vários bancos de dados ou até facilitar a leitura das inserções.
Aqui está como usar um modo de exibição junto com permissões para limitar as colunas que um usuário pode atualizar na tabela.
/* This creates the view, limiting user to only 2 columns from MyTestTable */
CREATE VIEW dbo.myTESTview
WITH SCHEMABINDING AS
SELECT ID, Quantity FROM dbo.MyTestTable;
/* This uses the view to execute an update on the table MyTestTable */
UPDATE dbo.myTESTview
SET Quantity = 7
WHERE ID = 1
Quando quero ver um instantâneo de uma (s) tabela (s) e / ou exibir (de maneira somente leitura)
Eu gosto de usar modos de exibição sobre procedimentos armazenados quando estou executando apenas uma consulta. As visualizações também podem simplificar a segurança, podem ser usadas para facilitar inserções / atualizações em várias tabelas e podem ser usadas para capturar instantâneos / materializar dados (executar uma consulta demorada e manter os resultados em cache).
Usei visualizações materializadas para consultas de execução que não precisam ser mantidas precisas em tempo real.
Isso não responde exatamente à sua pergunta, mas achei que valeria a pena mencionar as Visualizações materializadas . Minha experiência é principalmente com Oracle, mas supostamente o SQL-Server é bastante semelhante.
Usamos algo semelhante em nossa arquitetura para resolver problemas de desempenho XML. Nossos sistemas são projetados com muitos dados armazenados como XML em uma linha e os aplicativos podem precisar consultar valores específicos dentro dele. O manuseio de muitos XMLTypes e a execução de XPaths em um grande número de linhas tem um grande impacto no desempenho. Por isso, usamos uma forma de visualizações materializadas para extrair os nós XML desejados em uma tabela relacional sempre que a tabela base for alterada. Isso efetivamente fornece um instantâneo físico da consulta em um determinado momento, em oposição às visualizações padrão que executariam sua consulta sob demanda.
Eu vejo um procedimento armazenado mais como um método que eu posso chamar contra meus dados, enquanto para mim uma exibição fornece um mecanismo para criar uma versão sintética dos dados de base nos quais consultas ou procedimentos armazenados podem ser criados. Vou criar uma visão quando simplificação ou agregação fizer sentido. Escreverei um procedimento armazenado quando desejar fornecer um serviço muito específico.
Um aspecto curioso das exibições é que elas são vistas pelo Microsoft Access como tabelas: quando você anexa um front-end do Microsoft Access a um banco de dados SQL usando ODBC, vê as tabelas e exibições na lista de tabelas disponíveis. Portanto, se você estiver preparando relatórios complicados no MS Access, poderá permitir que o servidor SQL faça a junção e a consulta e simplifique bastante sua vida. O mesmo vale para preparar uma consulta no MS Excel.
Eu tenho apenas 10 visualizações nos meus bancos de dados de produção. Eu uso vários para colunas que uso o tempo todo. Um conjunto que eu uso vem de 7 tabelas, algumas com junções externas e, em vez de reescrever, constantemente eu só preciso chamar essa visualização em um select e fazer uma ou duas junções. Para mim, é apenas uma economia de tempo.
Estou criando xxx que mapeia todos os relacionamentos entre uma tabela principal (como tabela de produtos) e tabelas de referência (como ProductType ou ProductDescriptionByLanguage). Isso criará uma visão que me permitirá recuperar um produto e todos os seus detalhes traduzidos de suas chaves estrangeiras para sua descrição. Então eu posso usar um ORM para criar objetos para criar grades, caixas de combinação etc.
Pense nisso como refatoração do esquema do banco de dados.
Acho que primeiro. Para ocultar a complexidade do Query. É muito apropriado para visualizações. Como quando normalizamos o aumento das tabelas de banco de dados. Agora, a busca de dados é muito difícil quando o número de tabelas aumenta. Portanto, a melhor maneira de lidar com isso é seguir as visualizações.
Criamos a visualização para limitar ou restringir o acesso a todas as linhas / colunas em uma tabela. Se o proprietário desejar que apenas linhas / colunas específicas ou limitadas precisem ser compartilhadas, ele criará uma visualização com essas colunas.
Por segurança: concede a cada usuário permissão para acessar o banco de dados apenas por meio de um pequeno conjunto de visualizações que contêm os dados específicos que o usuário ou grupo de usuários está autorizado a ver, restringindo o acesso do usuário a outros dados.
Simplicidade para consultas e estrutura : uma visualização pode extrair dados de várias tabelas e apresentar uma única tabela, simplificando as informações e transformando consultas de várias tabelas em consultas de tabela única para uma visualização, além de fornecer aos usuários uma visão específica da estrutura do banco de dados, apresentando o banco de dados como um conjunto de tabelas virtuais específicas para usuários ou grupos de usuários específicos.
Para criar uma estrutura consistente do banco de dados : As exibições apresentam uma imagem consistente e inalterada da estrutura do banco de dados, mesmo se as tabelas de origem subjacentes forem alteradas.