Pedro F. Carvalho Analista de Sistemas [email protected] www.pedrofcarvlho.com.br ADMINISTRANDO ESQUEMAS DE OBJETOS Descrição O comando CREATE SCHEMA cria um esquema no banco de dados corrente. O nome do esquema deve ser distinto do nome de todos os outros esquemas existentes no banco de dados corrente. Um esquema é essencialmente um espaço de nomes: contém objetos com nome (tabelas, tipos de dado, funções e operadores), cujos nomes podem ser iguais aos de outros objetos existentes em outros esquemas. Os objetos com nome são acessados "qualificando" seus nomes usando o nome do esquema como prefixo, ou definindo um caminho de procura que inclua os esquemas desejados. O comando CREATE que especifica um nome de objeto não qualificado cria o objeto no esquema corrente (o primeiro do caminho de procura, que pode ser determinado pela função current_schema ). Opcionalmente, o comando CREATE SCHEMA pode incluir subcomandos para criar objetos no novo esquema. Estes subcomandos são tratados, essencialmente, da mesma maneira como são tratados os comandos em separado submetidos após a criação do esquema, exceto que, se for utilizada a cláusula AUTHORIZATION, todos os objetos criados pertencerão a este usuário. Parâmetros nome_do_esquema O nome do esquema a ser criado. Se for omitido, será usado o nome do usuário como nome do esquema. O nome não pode começar por pg_, porque estes nomes são reservados para os esquemas do sistema. nome_do_usuário O nome do usuário que será o dono do esquema. Se for omitido, tem como padrão o usuário que está executando o comando. Somente os superusuários podem criar esquemas pertencentes a outros usuários. Pedro F. Carvalho Analista de Sistemas [email protected] www.pedrofcarvlho.com.br elemento_do_esquema Um comando SQL definindo um objeto a ser criado no esquema. Atualmente, somente CREATE TABLE, CREATE VIEW, CREATE INDEX, CREATE SEQUENCE, CREATE TRIGGER e GRANT são aceitos como cláusula no comando CREATE SCHEMA. Os objetos de outros tipos podem ser criados por comandos em separado, após o esquema ter sido criado. Observações Para criar um esquema o usuário deve possuir o privilégio CREATE no banco de dados corrente (É claro que os superusuários não são afetados por esta exigência). Exemplos Criar um esquema: CREATE SCHEMA meu_esquema; Criar um esquema para o usuário antonio; o esquema também se chamará antonio: CREATE SCHEMA AUTHORIZATION antonio; Criar um esquema e criar uma tabela e uma visão nele: CREATE SCHEMA hollywood CREATE TABLE filmes (titulo text, lancamento date, premios text[]) CREATE VIEW premiados AS SELECT titulo, lancamento FROM filmes WHERE premios IS NOT NULL; Deve ser observado que os subcomandos individuais não terminam por ponto-evírgula. Abaixo está mostrada uma forma equivalente para se obter o mesmo resultado: CREATE SCHEMA hollywood; CREATE TABLE hollywood.filmes (titulo text, lancamento date, premios text[]); CREATE VIEW hollywood.premiados AS SELECT titulo, lancamento FROM hollywood.filmes WHERE premios IS NOT NULL; Nomeação de Objetos no Oracle O comprimento de nomes deve ser de 1 a 30 bytes, com as seguintes exceções: Nomes de bancos de dados são limitados a 8 bytes. Pedro F. Carvalho Analista de Sistemas [email protected] www.pedrofcarvlho.com.br Os nomes dos links de dados pode ser tão longo quanto 128 bytes. nomes sem aspas não podem ser palavras Oracle reservados. nomes sem aspas deve iniciar com um caractere alfabético a partir do seu caráter de banco de dados definido. Citado nomes não são recomendados. Tipos de Dados no Oracle • CHAR: Os dados de comprimento fixo de caracteres de tamanho bytes ou caracteres. O tamanho máximo é de 2.000 bytes ou caracteres, o padrão eo tamanho mínimo é de 1 byte. • BYTE indica que a coluna tem semântica comprimento bytes (isto é, o comprimento da coluna é medida em bytes). CHAR indica que a coluna tem semântica de caracteres (isto é, trata strings como uma seqüência de caracteres). • VARCHAR2: comprimento variável seqüência de caracteres com comprimento máximo de bytes ou caracteres de tamanho. O tamanho máximo é de 4.000 bytes. Você deve especificar o tamanho para VARCHAR2. • DATA: data válida entre 01 de janeiro de 4712 (BC), até 31 de dezembro de 9999 (AD). Ele também armazena o tempo (horas, minutos e segundos). : Número de p precisão e escala s. A precisão pode variar de 1 a 38. A escala pode variar de -84 a 127. • BINARY_FLOAT: 32-bit número de ponto flutuante. Este tipo de dados exige 5 bytes, incluindo o byte de comprimento. • BINARY_DOUBLE: 64-bit número de ponto flutuante. Este tipo de dados requer 9 bytes. • FLOAT (p): American National Standards Institute (ANSI) tipo de dados. O tipo de dados float é um número de ponto flutuante com precisão binário p. A precisão padrão para este tipo de dados binário é de 126 ou 38 decimal. • INTEGER: equivalente ao número (p, 0) • NCHAR (comprimento): tipo de dados somente Unicode. Quando você cria uma tabela com uma coluna NCHAR, você define o tamanho da coluna em caracteres. Você define o caráter nacional definido quando você criar seu banco de dados. O comprimento máximo de uma coluna é determinada pela definição do conjunto de caracteres nacionais. As especificações de largura do tipo de dados nchar se referem ao número de caracteres. O tamanho da coluna máxima permitida é de 2.000 bytes. Se você inserir um valor que é menor que o comprimento da coluna, o banco de dados Oracle almofadas o valor com espaços em branco para comprimento da coluna cheia. Você não pode inserir um valor em uma coluna CHAR NCHAR, nem você pode inserir um valor NCHAR em uma coluna CHAR. • NVARCHAR2 (tamanho byte [| CHAR]): somente Unicode tipo de dados. É como NCHAR exceto que sua duração máxima é de 4.000 bytes e não é completado com brancos. • Longos: Dados de caracteres de comprimento variável, de até 2 GB (ou 231-1 bytes). O tipo de dados LONG está obsoleta; usar o objeto grande (LOB) tipo de dados em vez disso. • LONG RAW: dados binários brutos de comprimento variável de até 2 GB • RAW (tamanho): dados binários brutos de size bytes de comprimento. O tamanho máximo é de 2.000 bytes. Você deve especificar o tamanho para um valor bruto. • ROWID: Base string-64 representa o endereço exclusivo de uma linha no banco de dados. Este tipo de dados é principalmente para os valores retornados pela pseudocoluna ROWID. • UROWID: Base string-64 representando o endereço lógico de uma linha de uma tabela organizada por índice. O tamanho é opcional do tamanho de uma coluna do tipo UROWID. O tamanho máximo eo padrão é 4.000 bytes. UROWID tipo de dados em uma coluna tem um tipo de código de 1 byte seguido pela ID da linha de um tipo de correspondência. Os três tipos são ID linha física, ID da linha lógica, e as identificações Pedro F. Carvalho Analista de Sistemas [email protected] www.pedrofcarvlho.com.br de linha externa (que ocorrem quando se selecciona uma coluna de ID da linha durante um dblink através de um gateway de serviços heterogêneos). • BLOB: objeto grande binário • CLOB: Personagem grande objeto que contenha caracteres de byte único ou multibyte. Ambos largura fixa e conjuntos de caracteres de largura variável são suportadas, e ambos utilizam o banco de dados de caráter CHAR set. •NCLOB: Personagem grande objeto que contenha caracteres Unicode. Ambos largura fixa e conjuntos de caracteres de largura variável são suportadas, e ambos utilizam o banco de dados de caráter NCHAR set. Este tipo de dados armazena os dados de caráter nacional definido Nota: O tamanho máximo para todos os tipos de dados LOB (BLOB, CLOB e NCLOB) é (4 GB - 1) * (o valor do pedaço).?. ? Pedaço é um atributo opcional que você pode definir quando se define um LOB. PEDAÇO especifica o número de bytes a ser alocada para manipulação de LOB. Se o tamanho não é um múltiplo do tamanho do bloco de banco de dados, as rodadas de banco de dados até o tamanho em bytes para o próximo múltiplo. ? Por exemplo, se o tamanho do bloco de banco de dados é 2048 eo tamanho do bloco é 2050, o banco atribui 4.096 bytes (2 blocos). O valor máximo é 32768 (32 KB), que é o maior banco de dados Oracle bloco tamanho permitido. O tamanho padrão de bloco é um bloco de banco de dados Oracle. • BFILE: Contém um localizador para um grande arquivo binário armazenado fora do banco de dados. Ele permite que fluxo de bytes I / O acesso a LOBs externos que residem no servidor de banco de dados. O tamanho máximo é de 4 GB. • TIMESTAMP (fractional_seconds_precision): Especifica o ano, mês, dia e valores de data, bem como hora, minuto e segundo valores de tempo, onde fractional_seconds_precision é o número de dígitos na parte fracionária de um segundo. Os valores aceitos são 0-9. O padrão é 6. Integridades de Banco de Dados NOT NULL: Por padrão, todas as colunas em uma tabela permitir valores nulos. O nulo palavra significa a ausência de um valor. A restrição NOT NULL requer que uma coluna de uma tabela deve conter valores nulos. Por exemplo, você pode definir uma restrição NOT NULL a exigir que um valor seja de entrada na coluna LAST_NAME para cada linha da tabela EMPREGADOS. UNIQUE-chave: A restrição de integridade chave UNIQUE exige que cada valor em uma coluna ou conjunto de colunas (chave) ser exclusivo, ou seja, não há duas linhas de uma tabela tem valores duplicados em uma coluna especificada ou conjunto de colunas. Por exemplo, uma restrição UNIQUE chave é definido na coluna department_name da tabela de serviços para desautorizar as linhas com nomes duplicados departamento. Com exceção de circunstâncias especiais, esta é aplicada com um índice exclusivo. PRIMARY KEY: Cada tabela no banco de dados pode ter no máximo uma restrição PRIMARY KEY. Os valores no grupo de uma ou mais colunas que estão sujeitas a essa restrição constitui o identificador exclusivo da linha. Com efeito, cada linha é chamado pelos seus valores de chave primária. As restrições de verificação: A restrição de integridade CHECK em uma coluna ou conjunto de colunas exige que uma determinada condição ser verdadeira ou desconhecidos para cada linha da tabela Pedro F. Carvalho Analista de Sistemas [email protected] www.pedrofcarvlho.com.br Estados de uma Constraint DISABLE NOVALIDATE: Nova, bem como os dados existentes não podem se conformar com a restrição, porque não está marcada. Isto é frequentemente usado quando os dados são de uma fonte, já validados ea tabela é somente leitura, para que os dados não é nova a ser inserido na tabela. NOVALIDATE é utilizado no armazenamento de dados situações em que os dados já foram limpos. Nenhuma validação é necessário, poupando tempo. DISABLE VALIDATE: Se uma restrição estiver neste estado, a modificação das colunas da restrição não é permitido porque seria incoerente de validar os dados existentes e permitir que dados não verificados para inserir a tabela. Isso é muitas vezes usado quando os dados existentes deve ser validado, mas não modificados e, quando o índice não é normalmente necessário para o desempenho. ENABLE NOVALIDATE: Novos dados está em conformidade com a restrição, mas os dados existentes está em um estado desconhecido. Este é freqüentemente usado quando se sabe que os dados limpos e em conformidade existe na tabela de modo que não há necessidade de validação. No entanto, novas violações não são autorizados a entrar no sistema. ENABLE VALIDATE: Ambos os dados novos e existentes, em conformidade com a restrição. Este é o estado típico e padrão de uma restrição. O Comando Truncate Este comando exclui todas as linhas de uma tabela ou de uma lista de tabelas de forma mais rápida que o comando DELETE tradicional. Apenas o owner de uma tabela pode eliminar seus dados com o comando TRUNCATE. É recomendado o prudência no uso deste comando, especialmente com a cláusula CASCADE, pois informações relevantes podem ser eliminadas. Sintaxe: TRUNCATE [ TABLE ] name [, ...] [ CASCADE | RESTRICT ] A cláusula CASCADE elimina tabelas referenciadas pela tabela que sofre o TRUNCATE. A cláusula RESTRICT é o padrão e faz o TRUNCATE apenas da tabela explicitamente citada no comando, retornando erro caso haja alguma violação de restrição de integridade. Não é permitido TRUNCATE se a tabela truncada é referenciada por uma tabela filha através de foreign key: ERROR: cannot truncate a table referenced in a foreign key constraint SQL state: 0A000 Detail: Table "tstdel3" references "tstdel". Hint: Truncate table "tstdel3" at the same time, or use TRUNCATE ... CASCADE. Alguns 1 - exemplos: Exclusão de registros de TRUNCATE 2 - Exclusão TRUNCATE uma tabela com a cláusula TABLE de registros com TABLE tstdel; referência a um esquema public.tstdel; Pedro F. Carvalho Analista de Sistemas [email protected] www.pedrofcarvlho.com.br 3 - Sintaxe smplificada TRUNCATE 4 - tstdel; Exclusão de mais de TRUNCATE 5 uma tabela ao mesmo tempo tstdel, - Exclusão com tstdel2; cláusula CASCADE TRUNCATE tstdel CASCADE; INDICES NO ORACLE No geral, índices B*Tree serão usados se: A cardinalidade (números de valores distintos) em uma coluna é grande O número de linhas em uma tabela é grande A coluna é usada em cláusulas WHERE e JOIN. No geral, índices Bitmap serão usados se: A cardinalidade (números de valores distintos) em uma coluna é pequeno (como masculino/feminino O número de linhas em uma tabela é grande A coluna é usada em operações de álgebra booleana (AND/OR/NOT) . Um índice é um objeto de um esquema que pode acelerar a recuperação de linhas usando um ponteiro. Os índices podem ser criados de duas formas: De maneira explícita ou implícita. Caso não exista um índice associado a uma coluna, ocorrerá uma análise em toda a tabela. Um índice fornece acesso direto e rápido às linhas em uma tabela. Seu objetivo é reduzir a necessidade de I/O do disco usando um caminho indexado para localizar dados de forma mais rápida. O índice é utilizado e mantido automaticamente pelo Oracle Server. Após a criação de um índice, não é necessária nenhuma atividade direta do usuário. Os índices são lógica e fisicamente independentes da tabela que indexam. Isso significa que eles podem ser criados e eliminados a qualquer momento e não têm nenhum efeito sobre as tabelas-base ou outros índices. É muito importante lembrar que ao eliminar uma tabela, os índices correspondentes também são eliminados. Podemos criar índices e manipular estes índices, sendo que neste momento iremos ver como criar um índice e vamos focar como manipular os índices nas TableSpaces de Pedro F. Carvalho Analista de Sistemas [email protected] www.pedrofcarvlho.com.br dados ou em qualquer outra que não seja a TableSpaces de índices. Pois os índices tem que está na (as) TableSpaces de índice (es). • Vamos criar um índice. CREATE INDEX nome_indice ON nome_tabela(lista_coluna (as)); Como você pode observar no exemplo acima, é bem facil criar um índice. Mais o que realmente nos interessa neste momento é como manipular os índices nas TableSpaces erradas? Antes de tudo ou qualquer coisa, temos que saber onde os índices estão e em quais TableSpaces eles se encontram? • Vamos consultar onde se encontram os índices e quantos são: SET SET COL segment_name FORMAT a30 LINESIZE PAGES SELECT tablespace_name,count(*) indices WHERE owner=’USUARIO’ GROUP BY tablespace_name; 200 100 FROM dba_indexes Observe no exemplo acima que antes do select estou setando alguns parâmetros para melhor exibição do resultado. Neste exemplo acima irei identificar quantos índices e onde eles estão. Após a identificação de onde estão e quantos são os índices fora da TableSpaces de índices, precisamos fazer um rebuild dos índices para a TableSpaces de índice. • Vamos fazer o rebuild dos índices: SELECT ‘alter index ‘||owner||’.'||index_name||’ NomeDaTableSpaceDeIndices;’ FROM WHERE tablespace_name = ‘TableSpaceDados’; rebuild tablespace dba_indexes Obeserve no script acima que ele já deixará no formato para você realizar o rebuild dos índices, após a execução do script acima é só você copiar o resultado na tela e depois colar na tela logo em seguida e você verá que o rebuild será realizado. Com este script acima agente ganha tempo em ter que procurar e depois está realizando novo script para fazer o rebuild. Criando Visões (Views) no Oracle Uma View funciona de forma semelhante a uma tabela. É utilizada em comandos SELECT, INSERT, UPDATE e DELETE, para recuperação e manipulação de dados (com restrições), porém, não armazena esses dados. Pedro F. Carvalho Analista de Sistemas [email protected] www.pedrofcarvlho.com.br Este objeto tem suas linhas e colunas calculadas dinamicamente através de um SELECT pré-estabelecido, cada vez que solicitamos. Apenas a sua definição é armazenada no dicionário de dados. Podemos dizer que se trata de uma tabela virtual, pois não possui linhas próprias, mas sim as obtém em tempo de execução e as disponibiliza em memória para acesso por uma query. Como criar Views: Create [or replace] [with read only]; view <nome da view> as <Instruções sql> Exemplo: Criando e visualizando as informações de uma view: Create view estoque where pmedio < 1000; as select codprod, descricao from produtos Alterando uma View: O comando REPLACE recria uma view já existente. Deve ser utilizado para alterar uma visão existente sem necessidade de apagá-la. É utilizado também para atribuir nova permissão e privilégios. Create or replace view estoque as select codprod, descricao, pvenda preço from produtos where pmedio < 1000; Visualizando uma View: Select Desc estoque; * from estoque; Excluindo uma View: O comando DROP VIEW exclui uma view do dicionário de dados. Nenhum efeito ocorrerá sobre as tabelas referenciadas, bastando para isso ter apenas o privilégio DROP VIEW ou DBA. Drop view estoque; A Cláusula WITH CHECK OPTION: Através da cláusula WITH CHECK OPTION, podemos garantir que os dados inseridos ou atualizados numa tabela através de uma view, poderão ser visualizados através da própria view com esta opção. Exemplo: Create or replace view estoque as select codprod, descricao, pvenda preço from produtos where pmedio < 1000 with check option estoque; A Cláusula WITH READ ONLY: Pedro F. Carvalho Analista de Sistemas [email protected] www.pedrofcarvlho.com.br Através da cláusula WITH READ ONLY podemos impedir operações de DML sobre a view, restringindo desta forma a view apenas à leitura. A cláusula WITH READ ONLY indica que apenas a operação de consulta (SELECT) será permitida na view e, desse modo, operações de atualização, inserção e exclusão não serão permitidas. Exemplo: Create or replace view estoque as select codprod, descricao, pvenda preço from produtos where pmedio < 1000 with read only; A view está protegida para operações DML, portanto em qualquer tentativa de comandos referentes a DML (inserção, atualização e deleção) ocorrerão erros. Checando as Views no Dicionário de Dados: O Dicionário de Dados do Oracle nos permite checar as views criadas, bastando para isso usar o comando: Desc User_Views; Tabelas Temporárias no Banco de Dados Oracle DEFINIÇÃO Uma tabela temporária é uma tabela com vida útil de uma sessão ou transação. Ela está vazia quando a sessão ou transação começa e descarta os dados ao fim da sessão ou transação. Uma tabela temporária é associada à transação. Isto significa que ao término da transação os dados da tabela são perdidos, porém sua descrição permanece gravada no banco de dados mesmo após a mudança de sessão. Nesta solução, o que é temporário é o armazenamento dos dados. Com este tipo de tabela não temos necessidade de remover os dados ao término da transação. Podem ser muito úteis na geração de dados de trabalho temporários. A seguir serão mostrados dois exemplos: O primeiro (Listagem 1) de uma tabela temporária que é associada à transação e o segundo (Listagem 2), de uma tabela temporária que é associada à sessão. SQL> create 2 3 4 dat_cadas date); global temporary (cod_prod desc_prod table TEMP_PROD number(5), varchar2(30), Table created. SQL> insert 2 values (1,'Mesa',sysdate); 1 row created. SQL> select * from TEMP_PROD; into TEMP_PROD Pedro F. Carvalho Analista de Sistemas [email protected] www.pedrofcarvlho.com.br COD_PROD ---------1 Mesa 18-MAR-05 DESC_PROD ------------------------------ DAT_CADAS --------- SQL> commit; Commit complete. SQL> select * from TEMP_PROD; no rows selected SQL> Name ------------------------------COD_PROD DESC_PROD DAT_CADAS DATE desc Null? TEMP_PROD; Type ---NUMBER(5) VARCHAR2(30) -------- SQL> Listagem 1. Tabela temporária por transação Neste primeiro exemplo foi criada uma tabela temporária associada à transação. Isto significa que ao término da transação (commit ou rollback) os dados da tabela são perdidos. No exemplo, utilizamos o comando commit para finalizar a transação. Note que após executar o comando commit, o select seguinte não retorna nenhum registro, porém a estrutura da tabela permanece gravada no banco de dados mesmo após a mudança de sessão. SQL> create global temporary 2 (cod_prod 3 desc_prod 4 dat_cadas date) on commit preserve rows; table TEMP_PROD number(5), varchar2(30), Table created. SQL> insert 2 values (100,'Computador',sysdate); into TEMP_PROD 1 row created. SQL> select * from TEMP_PROD; COD_PROD ---------100 Computador 18-MAR-05 DESC_PROD ------------------------------ SQL> commit; Commit complete. SQL> select * from TEMP_PROD; DAT_CADAS --------- Pedro F. Carvalho Analista de Sistemas [email protected] www.pedrofcarvlho.com.br COD_PROD ---------100 Computador 18-MAR-05 DESC_PROD ------------------------------ SQL> Enter Connected. DAT_CADAS --------- connect password: dados@data1w ***** desc Null? TEMP_PROD; Type ---NUMBER(5) VARCHAR2(30) DATE SQL> select * from TEMP_PROD; no rows selected SQL> Name ------------------------------COD_PROD DESC_PROD DAT_CADAS Listagem 2. -------- Tabela temporária por sessão Neste segundo exemplo, a tabela foi criada com a indicação de que após o término da transação os dados deverão ser mantidos, ou seja, a tabela é temporária, porém seus dados ficam disponíveis por toda a sessão independente de transação. Quando ocorre o fim da sessão (disconnect e connect), os dados são removidos (ou liberados). Note que no exemplo acima, após executar o comando connect, os dados da tabela foram removidos, porém a estrutura da tabela permanece gravada no banco de dados mesmo após a mudança de sessão. CARACTERÍSTICAS Segundo Fernandes, as tabelas temporárias possuem as seguintes características: • Sua definição é visível para todas as sessões, mas seus dados são visíveis e acessíveis somente pela sessão que os inclui. • O comando LOCK não tem efeito em tabelas temporárias uma vez que cada sessão tem acesso exclusivo a seus dados. • Um comando TRUNCATE trunca somente os dados referentes à sessão do usuário. • Os dados são criados na tablespace temporária do usuário. • Operações de Rollback to Savepoint são suportadas, mas os dados não são recuperáveis caso ocorra um “crash” porque as modificações não são logadas (gravadas no REDO LOG). • Podemos criar índices para uma tabela temporária usando o comando CREATE INDEX. Estes índices também são temporários. • Podemos criar triggers para tabelas temporárias assim como views que utilizem simultaneamente tabelas temporárias e permanentes. • Os utilitários IMPORT e EXPORT podem exportar e importar a definição de uma tabela temporária, porém nenhum dado é exportado. • Da mesma forma, podemos replicar a definição de uma tabela temporária, mas não podemos replicar seus dados. Pedro F. Carvalho Analista de Sistemas [email protected] www.pedrofcarvlho.com.br • Só podemos executar operações de DDL (ALTER TABLE, DROP TABLE, CREATE INDEX, etc.) para a tabela temporária se não houver nenhuma tabela fazendo acesso a ela. • Uma tabela temporária associada à transação é acessível por uma determinada transação e suas transações filha. Porém, uma tabela temporária associada à transação não é acessível por duas transações simultâneas na mesma sessão, apesar de poder ser usada por transações em diferentes sessões. • Se uma transação do usuário faz um INSERT em uma tabela temporária, então nenhuma de suas transações filhas pode usar a tabela temporária após isto. • Se uma transação filha faz um INSERT em uma tabela temporária, ao fim da transação filha, o dado associado com a tabela temporária é removido. Após isto, tanto a transação do usuário quanto qualquer outra transação podem fazer acesso à tabela temporária.