Usando coleções para tornar seu acesso SQL mais fácil e eficiente

Para superar as limitações de SQL, muitas empresas introduziram linguagens de programação para construir aplicativos que fazem interface com bancos de dados SQL - por exemplo, PL / SQL da Oracle.

Os aplicativos PL / SQL podem ser ineficientes. Mas você pode otimizar essa interface usando coleções de tipos de dados, tornando os aplicativos PL / SQL mais rápidos e eficientes.

 

Quase todo aplicativo ou software hoje interage com algum tipo de banco de dados, em particular com bancos de dados relacionais. Embora haja várias linguagens para a manipulação de bancos de dados relacionais, o SQL continua sendo um padrão . Embora o SQL seja uma linguagem robusta, ele tem algumas limitações.

 

Para superar as limitações de SQL, muitas empresas introduziram linguagens de programação para construir aplicativos que fazem interface com bancos de dados SQL - por exemplo, PL / SQL da Oracle. 

 

PL / SQL (extensões de Linguagem de Procedimentos para a Linguagem de Consulta Estruturada) é uma linguagem de programação fácil de usar que simplifica a criação de consultas SQL poderosas. Embora o próprio termo seja específico da linguagem de programação Oracle, o conceito geral de extensão de consultas SQL com lógica procedural se aplica a muitas linguagens de programação (por exemplo, T-SQL da Microsoft). Para simplificar neste artigo, entretanto, nos referiremos ao PL / SQL em todo o livro.

 

Os aplicativos PL / SQL combinam lógica procedural e instruções SQL para recuperar e processar dados de um banco de dados SQL. Como eles alternam entre código procedural e consultas SQL, os aplicativos PL / SQL podem ser ineficientes. Mas você pode otimizar essa interface usando coleções de tipos de dados, tornando os aplicativos PL / SQL mais rápidos e eficientes.

 

Por que usar PL / SQL em vez de outra linguagem como Java?

 

Embora haja muitos benefícios em usar outros programas como Java, cada um tem suas próprias especialidades. PL / SQL é puramente do lado do servidor e se concentra na interação com o banco de dados relacional. Java é uma linguagem orientada a objetos que possui funcionalidade tanto do lado do cliente quanto do lado do servidor. Se o seu foco está na funcionalidade não orientada a banco de dados, Java é sua escolha. Mas quando se trata de funcionalidade de banco de dados pura, o código Java pode resultar em velocidade e desempenho reduzidos do aplicativo. Como o PL / SQL é totalmente integrado ao SQL e ao banco de dados subjacente, o código PL / SQL construído corretamente pode limitar o número de chamadas de banco de dados necessárias, acelerando assim o acesso aos dados.

 

Quais são alguns dos problemas potenciais com o uso do Java para aplicativos com uso intensivo de banco de dados? Por um lado, a imposição de uma estrutura orientada a objetos no banco de dados pode levar a conexões desnecessárias com o banco de dados, o que consome recursos e reduz a velocidade. Java também pode pré-carregar grandes conjuntos de dados, reduzindo o desempenho geral do aplicativo.

 

Você pode usar PL / SQL e Java juntos? Absolutamente. PL / SQL pode chamar Java e vice-versa. Os programadores que se sentem confortáveis ​​com PL / SQL e Java podem e devem encontrar maneiras de otimizar o desempenho geral do aplicativo, distribuindo tarefas onde são mais adequadas e executadas com mais eficiência. Se você está familiarizado com a programação de banco de dados relacional simples, a PL / SQL é uma boa escolha para você. Se você for forte em programação orientada a objetos, não deverá ter problemas com os dois.

 

Cada linguagem tem seus fãs e seus detratores, e você deve considerar cuidadosamente as necessidades de seu aplicativo específico e suas próprias habilidades de programação ao selecionar se deseja usar PL / SQL, Java, ambos ou outra linguagem.

 

Simplificando o acesso SQL com coleções

 

Coleções são essencialmente grupos indexados de dados que têm o mesmo tipo - por exemplo, arrays ou listas (arrays, por exemplo, são coleções de elementos baseados em índice). A maioria das linguagens de programação em geral oferece suporte para coleções.

 

As coleções reduzem o número de chamadas de banco de dados devido ao armazenamento em cache (armazenado em cache pelas próprias coleções) de dados estáticos acessados ​​regularmente. Chamadas reduzidas significam maior velocidade e eficiência. As coleções também podem reduzir o código total necessário para um aplicativo, aumentando ainda mais a eficiência. 

 

Cada elemento em uma coleção possui um identificador exclusivo denominado subscrito. As coleções vêm com seu próprio conjunto de métodos para operar nos elementos individuais. PL / SQL inclui métodos para manipular elementos individuais ou a coleção em massa.

 

PL / SQL usa três tipos de coleções: arrays associativos, tabelas aninhadas e varrays. Escolher a coleção certa (ou coleções) para sua aplicação requer a compreensão das diferenças entre os tipos de coleção e como cada uma funciona. As principais diferenças são:

 

Se eles são limitados ou ilimitados (ou seja, número fixo de elementos ou variável). 

 

Quer sejam densos ou esparsos (ou seja, existem lacunas entre os elementos.

Se eles estão armazenados no aplicativo ou no banco de dados.

 

Matrizes associativas

 

As versões anteriores do PL / SQL usavam o que antes era conhecido como tabelas PL / SQL e, posteriormente, tabelas index-by. Em uma tabela PL / SQL, as coleções foram indexadas usando um número inteiro. Os elementos individuais da coleção podem ser referenciados usando o valor do índice. 

 

Como nem sempre era fácil identificar um elemento por seu subscrito, as tabelas PL / SQL evoluíram para incluir indexação por strings alfanuméricas. A capacidade de indexar pelos próprios dados em vez do valor do índice facilita a identificação mais fácil e rápida dos dados para manipulação, como exclusão ou atualização. 

 

As tabelas PL / SQL ou tabelas index-by são agora conhecidas como matrizes associativas. Matrizes associativas são coleções unidimensionais, também conhecidas como conjuntos de pares de valores-chave. Você pode pensar nisso como uma tabela de coluna única. Matrizes associativas multidimensionais podem ser criadas criando coleções de coleções.   

 

As matrizes associativas são ilimitadas, portanto, não há necessidade de especificar um tamanho ao criar uma. Eles podem ser densos ou esparsos. Você pode, por exemplo, definir os valores dos elementos 1, 3, 10 e 200 de uma matriz associativa sem definir valores para quaisquer outros elementos. As matrizes associativas, no entanto, devem ser armazenadas no aplicativo PL / SQL em vez de no banco de dados SQL, portanto, não podem ser manipuladas com instruções SQL.

 

Melhores usos para matrizes associativas

 

Os arrays associativos são sua melhor escolha quando você prioriza a velocidade e a flexibilidade da indexação em relação ao local de armazenamento. Um caso de uso da vida real para matrizes associativas seria em padrões de programação fundamentais (como memoização, ou onde as chamadas de função são retornadas ao resultado original em cache para ajudar a acelerar os programas).

 

Tabelas aninhadas

 

Como as matrizes associativas, as tabelas aninhadas são ilimitadas e não requerem nenhuma especificação de tamanho na criação. As tabelas aninhadas sempre começam como coleções densas de elementos com subscritos sequenciais. No entanto, como as tabelas aninhadas permitem a manipulação de elementos individuais, as tabelas aninhadas podem se tornar esparsas por meio da exclusão de elementos.

 

As tabelas aninhadas podem ser criadas no banco de dados ou em um bloco PL / SQL no nível do aplicativo. Quando tabelas aninhadas são criadas no banco de dados, elas são armazenadas em uma tabela de banco de dados separada de outras colunas. No entanto, todos os tipos de tabelas aninhadas para uma tabela de banco de dados são armazenados juntos na mesma tabela de banco de dados separada.

 

Melhores usos para tabelas aninhadas

 

As tabelas aninhadas são sua melhor escolha quando você precisa da capacidade de alterar dinamicamente elementos individuais, seja o número de elementos ou o conteúdo dos elementos. As tabelas aninhadas também são úteis quando você deseja armazenar elementos no banco de dados SQL em vez de no aplicativo PL / SQL.

 

Varrays

 

Varrays (abreviação de arrays de variáveis) são limitados - a criação de um varray requer a configuração do número máximo de elementos para o varray. Varrays são, portanto, úteis para armazenar coleções sequenciais de tamanho fixo de elementos que têm o mesmo tipo.

 

Varrays armazenam elementos na mesma ordem em que são adicionados ao array em endereços de memória contíguos. O endereço mais baixo representa o primeiro elemento do varray e o endereço mais alto representa o último elemento. 

 

Embora o tamanho inicial de um varray seja fixo, cada elemento individual possui tamanhos máximos que podem ser alterados dinamicamente. Além disso, você pode modificar o comprimento de um varray usando os métodos EXTENDe TRIM. Elementos individuais dentro de um varray (além das extremidades), no entanto, não podem ser atualizados ou excluídos e, portanto, os varrays são sempre densos.

 

Melhores usos para varrays

 

Varrays são sua melhor escolha quando você está trabalhando com um conjunto fixo e delimitado de elementos, por exemplo, quando você precisa preservar uma lista ordenada. Varrays também são úteis quando você precisa ou deseja armazenar dados no próprio banco de dados SQL.

 

Exemplos de uso de coleções em aplicativos PL / SQL

 

Como base para fornecer codificação de exemplo para os vários tipos de coleção, usaremos o exemplo a seguir.

 

Suponha que você trabalhe como profissional de segurança cibernética no departamento de TI de uma grande empresa. O diretor de TI pede que você comece a criar logs mensais de vulnerabilidades identificadas criadas por injeções de SQL, identificando os quatro principais tipos de vulnerabilidade todos os meses por local.

 

Além disso, para cada vulnerabilidade, você deve registrar informações específicas sobre a gravidade de várias fontes, incluindo o número de ID de vulnerabilidades e exposições comuns (CVE) do National Vulnerability Database (NVD), o número de ID de enumeração de fraqueza comum (CWE) associado, a vulnerabilidade comum Pontuação do Sistema de Pontuação (CVSS) e o tipo de vulnerabilidade da injeção de SQL.

 

Para começar, o que são injeções de SQL? De acordo com o especialista em segurança cibernética Mark Preston, da Cloud Defense , “As injeções de SQL são ataques que ocorrem quando os cibercriminosos exploram vulnerabilidades em consultas de pesquisa executadas por um banco de dados host. Isso permite que invasores obtenham acesso a informações confidenciais ou até mesmo alterem autorizações ou permissões de usuário. Eles também podem destruir ou manipular dados confidenciais encontrados nesse banco de dados. ”

 

Você também precisará associar cada vulnerabilidade a um projeto interno para corrigi-la. Considere como você pode usar as várias coleções para implementar as várias partes desta atribuição de trabalho. Vamos começar com a montagem das quatro principais vulnerabilidades por mês e local. Como você sabe que precisa de uma coleção de tamanho fixo, já que está rastreando apenas quatro vulnerabilidades por local por mês, você pode usar um varrary.

 

Vamos começar criando um varray de quatro elementos,, top_vulnsem uma tabela SQL existente. Embora a prática normal seja usar a forma completa de 'vulnerabilidade', para tornar os exemplos de código mais fáceis de ler, nós o abreviamos para vuln ou vulns. top_vulnsterá o mesmo tipo de dados da coluna vuln_typeda tabela vulns.

 

CREATE TYPE top_vulns IS VARRAY(4) of vulns.vuln_type%TYPE;

/

 

Em seguida, crie uma tabela para os dados de log, com as principais vulnerabilidades mensais definidas como o top_vulnstipo recém-criado.

 

CREATE TABLE vuln_log (

 month_id DATE,

 location_id VARCHAR2(30)

 monthly_top_vulns top_vulns);

/

 

Adicione uma entrada para abril:

 

INSERT INTO vuln_log (month_id, location_id, monthly_top_vulns)

 VALUES (TO_DATE(‘04/21’, ‘MM/YY’), ‘San Diego’, top_vulns(‘DoS’, ‘Code execution’,

‘Overflow’, ‘SQL injection’));

 

Como você está usando um varray, se subsequentemente produzir os dados em um relatório, a ordem das principais vulnerabilidades será mostrada na ordem em que foram inseridas. 

 

Lembre-se de que você não pode modificar os elementos individuais em um varray. Existem, no entanto, maneiras de alterar o comprimento do varray, usando os métodos EXTENDe TRIM. Tenha cuidado ao usar EXTENDe TRIM, no entanto, porque eles contam quaisquer elementos excluídos.

 

Digamos que o diretor agora queira rastrear apenas as três principais vulnerabilidades. Você pode usar TRIMpara eliminar os dados extras. Se o diretor decidiu reduzir a exploração ainda mais, no entanto, você não poderia usar outro TRIMmétodo não dimensionado , porque TRIMainda pensa que há quatro elementos no varray. 

 

Se você quiser ser capaz de manipular os elementos individuais da coleção ou se achar que o diretor de TI ainda não decidiu quantas vulnerabilidades você deve rastrear a cada mês, pode usar uma tabela aninhada em vez de um varray.

 

A sintaxe é ligeiramente diferente do início. Criaremos o tipo de vulnerabilidade principal como uma tabela em vez de um varray, mas novamente com o mesmo tipo de dados da vuln_typecoluna da tabela vulns. Como as tabelas aninhadas não são coleções de tamanho fixo, não incluiremos um parâmetro de tamanho. Comparando a sintaxe com a sintaxe tradicional da tabela PL / SQL, você pode ver que nenhuma linguagem de indexação é usada.

 

CREATE TYPE top_vulns_tab IS TABLE OF vulns.vuln_type%TYPE

/

 

Em seguida, criamos novamente a tabela de log. Lembre-se de que, para tabelas aninhadas, os dados são armazenados em uma tabela separada, portanto, adicione uma instrução nomeando essa tabela.

 

CREATE TABLE vuln_log (

 month_id DATE,

 location_id VARCHAR2(30),

 monthly_top_vulns_tab top_vulns_tab)

 NESTED TABLE monthly_top_vuns_tab STORE AS top_vulns_table;

/

 

Agora, podemos começar a adicionar dados ao banco de dados. As injeções de SQL, em particular, estão entre as vulnerabilidades de rede mais comuns que os programadores enfrentam. Na verdade, em abril de 2021, os quatro principais tipos de vulnerabilidades e ataques nas instalações de San Diego foram DoS (negação de serviço), execução de código, estouro e injeções de SQL.

 

Com isso em mente, digamos que você precise inserir uma entrada para março de 2021 nas instalações de Houston, onde as quatro principais vulnerabilidades são XSS (script entre sites), corrupção de memória, DoS e injeção de SQL.

 

INSERT INTO vuln_log (month_id, location_id, monthly_top_vulns_tab)

VALUES (TO_DATE(‘03/21’, ‘MM/YY’), ’Houston’, monthly_top_vulns_tab(‘XSS’, 

‘memory corruption’, ‘DoS’, ‘SQL injection’) );

/

 

Agora você descobre que recebeu os dados errados; você deve ter tido estouro em vez de corrupção de memória. Com o varray, não haveria nada que você pudesse fazer a não ser remover a entrada inteira e criar uma nova. Com a tabela aninhada, no entanto, você pode simplesmente atualizar a entrada.

 

Use o TABLEcomando para manipular dados em uma coleção de tabelas aninhadas.

 

UPDATE TABLE(SELECT monthy_top_vulns_tab

       FROM vuln_log

       WHERE month_id = ‘03/21’

   AND location_id = ‘Houston’)

 SET column_value = ‘overflow’

 WHERE column_value = ‘memory corruption’)

 

Como podemos aplicar matrizes associativas neste exemplo? Conforme observado acima, os dados que temos para cada vulnerabilidade incluem CVE, CWE e CVSS. As matrizes associativas são unidimensionais (ou seja, uma única coluna), portanto, trabalharemos com uma tabela que lista os CVEs de vulnerabilidade em cada mês. Queremos indexar pelo CVE, que é uma string alfanumérica, em vez de por identificadores numéricos, como nas versões anteriores das tabelas PL / SQL. 

 

Primeiro, lembre-se de que as matrizes associativas são armazenadas no aplicativo, e não no banco de dados, portanto, use a sintaxe apropriada.

 

DECLARE

 TYPE top_vulns_CVE_tab IS TABLE OF vulns.CVE%TYPE

  INDEX by vulns.CVE%TYPE;

 monthly_top_vulns_CVE top_vulns_CVE_tab;

 

Agora, digamos que desejamos remover um registro de uma vulnerabilidade identificada por CVE-2021-0370. Em vez de ter que pesquisar a tabela usando um loop como teríamos que fazer se a tabela fosse indexada pelo identificador numérico, agora podemos referenciar e manipular diretamente a entrada específica.

 

monthly_top_vulns_cve.DELETE(‘CVE-2021-370’)

 

Conclusão

 

Ao desenvolver aplicativos para trabalhar com bancos de dados SQL , a capacidade de minimizar o número de chamadas de banco de dados é uma consideração importante para uma operação eficiente. Use os recursos de coleções especiais em seu PL / SQL ou outra linguagem de programação para garantir que seu aplicativo seja o mais rápido e eficiente possível. Ao criar coleções ordenadas ou indexadas de dados do mesmo tipo, você pode simplificar as pesquisas e a manipulação eventual de elementos individuais da coleção.

 

 

O Avance Network é uma comunidade fácil de usar que fornece segurança de primeira e não requer muito conhecimento técnico. Com uma conta, você pode proteger sua comunicação e seus dispositivos. O Avance Network não mantém registros de seus dados; portanto, você pode ter certeza de que tudo o que sai do seu dispositivo chega ao outro lado sem inspeção.


Strong

5178 Blog des postes

commentaires