IBM i: Administração de Banco de Dados

Propaganda
IBM i
Versão 7.3
Banco de Dados
Administração
IBM
IBM i
Versão 7.3
Banco de Dados
Administração
IBM
Aviso
Antes de utilizar estas informações e o produto suportado por elas, leia as informações em “Avisos” na página 47.
Esta edição se aplica ao IBM i 7.3 (número do produto 5770-SS1) e a todas as liberações e modificações
subsequentes, até que seja indicado de outra forma em novas edições. Esta versão não é executada em todos os
modelos RISC (Reduced Instruction Set Computer), nem nos modelos CISC.
Este documento pode conter referências ao Código Interno Licenciado. O Código Interno Licenciado é um Código
de Máquina e é licenciado a você sob os termos do IBM License Agreement for Machine Code.
© Copyright IBM Corporation 1998, 2015.
Índice
Administração de Banco de Dados . . . 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
O que há de novo para o IBM i 7.3 . . . . . . . 1
Arquivo PDF para Administração de Banco de Dados 1
Administração de Banco de Dados . . . . . . . 2
Acessando Dados Através de Interfaces do Cliente 2
Acessando Dados com Java . . . . . . . 2
Acessando Dados com o Domino . . . . . 2
Acessando Dados com o ODBC . . . . . . 2
Acessando Dados com o IBM i PASE . . . . 2
Acessando Dados com o Provedor IBM i Access
para Windows OLE DB . . . . . . . . . 2
Acessando Dados com o IBM i Access para
Windows .Net Provider . . . . . . . . . 3
Acessando Dados com o Net.Data . . . . . 3
Acessando Dados Através de uma Partição do
Linux . . . . . . . . . . . . . . . 3
Acessando Dados Utilizando o DRDA
(Distributed Relational Database Architecture) . 3
Alterando e Gerenciando Objetos de Banco de
Dados . . . . . . . . . . . . . . . 3
Criando Objetos de Banco de Dados . . . . . 4
Assegurando a Integridade dos Dados. . . . . 4
Importando e Exportando Dados entre Sistemas . 4
Trabalhando com Vários Bancos de Dados . . . 4
Trabalhando com tabelas temporais de período do
sistema . . . . . . . . . . . . . . . 5
Tabelas Temporais de Período do Sistema. . . 5
Coluna de tempo inicial . . . . . . . 5
Coluna de tempo final . . . . . . . . 5
ID de início de transação . . . . . . . 6
Período SYSTEM_TIME. . . . . . . . 6
Tabelas de históricos . . . . . . . . . . 6
Criando uma tabela temporal de período do
sistema . . . . . . . . . . . . . . 7
Exemplos adicionais de CREATE TABLE da
tabela temporal de período do sistema. . . 8
Inserindo dados em uma tabela temporal de
período do sistema . . . . . . . . . . 9
Atualizando dados em uma tabela temporal
de período do sistema . . . . . . . . . 10
Excluindo dados em uma tabela temporal de
período do sistema . . . . . . . . . . 11
Usando uma tabela temporal de período do
sistema para controlar informações de
auditoria . . . . . . . . . . . . . 12
Conflitos de valor de registro de data e hora
da tabela temporal de período do sistema . . 14
Consultando os dados temporais do período
do sistema . . . . . . . . . . . . . 15
Especificando os critérios de tempo em
uma consulta . . . . . . . . . . . 15
Especificando os critérios de tempo usando
o registro especial CURRENT TEMPORAL
SYSTEM_TIME . . . . . . . . . . 17
Especifique os critérios de tempo para uma
visualização . . . . . . . . . . . 19
© Copyright IBM Corp. 1998, 2015
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Restrições ao inserir, atualizar ou excluir
dados em uma tabela temporal de período do
sistema . . . . . . . . . . . . . .
Considerações de E/S nativa com uma tabela
temporal de período do sistema . . . . .
Mantendo a tabela de históricos . . . . .
Particionando uma tabela temporal de período
do sistema . . . . . . . . . . . . .
Controle de acesso de linha e coluna com uma
tabela temporal de período do sistema . . .
Salvando e restaurando as tabelas temporais
de período do sistema . . . . . . . . .
Usando catálogos para localizar informações
sobre a tabela temporal de período do sistema.
Restrições da tabela temporal . . . . . .
Trabalhando com Acionadores e Restrições . . .
Gravando Programas do DB2 . . . . . . .
Backup e Recuperação do Banco de Dados . . . .
Administração de Banco de Dados Distribuída . .
Consultas e Relatórios . . . . . . . . . . .
Segurança . . . . . . . . . . . . . . .
Opções de Autoridade para Análise e Ajuste de
SQL . . . . . . . . . . . . . . . .
Row and Column Access Control (RCAC) . . . .
Visão Geral . . . . . . . . . . . . .
Permissões e Máscaras. . . . . . . . . .
Instruções SQL . . . . . . . . . . . .
Funções Protegidas . . . . . . . . . . .
Proteger Acionadores . . . . . . . . . .
Autoridade administrativa . . . . . . . .
Melhores Práticas ao Usar Permissões e Máscaras
Criando Permissões e Máscaras. . . . . .
Única Permissão com Todos os Usuários .
Única Permissão com um Perfil de Grupo
Única Permissão com uma Tabela
Dependente . . . . . . . . . . .
Única Permissão com um UDF . . . . .
Permissões para Cada Usuário . . . . .
Atributos de Diversas Permissões . . . .
Nomes de Objetos Não Qualificados . . .
Objetos Dependentes . . . . . . . . .
Propriedade . . . . . . . . . . .
Esquema . . . . . . . . . . . .
Autoridade de Esquema . . . . . . .
UDFs Protegidos . . . . . . . . .
ALWCPYDTA e Nível de Isolamento . . .
Restaurando Objetos . . . . . . . .
Operações Adicionais . . . . . . . . .
Incluindo o Perfil do Aplicativo em
Permissões e Máscaras. . . . . . . .
Recuperar o Armazenamento . . . . .
Relatórios de Consulta. . . . . . . .
MQTs . . . . . . . . . . . . .
Tabelas temporais . . . . . . . . .
Perfis de Grupo e QIBM_DB_SECADM . .
Parâmetros Copy File (CPYF) . . . . .
21
22
22
23
23
24
24
25
25
25
26
26
26
27
27
32
33
34
35
36
36
36
36
36
36
37
37
37
38
38
39
39
39
39
40
40
40
40
41
41
41
41
41
42
42
42
iii
OmniFind Text Search Server for DB2 for
Usando o RCAC em Arquivos Lógicos
Multiformatados. . . . . . . . . .
Propagação de Dados Mascarados . . . .
Classic Query Engine (CQE) e SQL Query Engine
(SQE) . . . . . . . . . . . . . . .
Diferenças entre nativo aberto e consulta SQL
envolvendo RCAC . . . . . . . . . .
iv
IBM i: Administração de Banco de Dados
i
43
. 43
. 44
. 46
. 46
Ordenação de Conjunto de Resultados .
.
.
. 46
Avisos . . . . . . . . . . . . . . . 47
Informações sobre a Interface de Programação.
Marcas Registradas . . . . . . . . . .
Terms and conditions . . . . . . . . .
.
.
.
. 49
. 49
. 49
Administração de Banco de Dados
O DB2 para IBM® i fornece funções de administração de banco de dados, de backup e recuperação, de
consulta e de segurança.
Você também pode explorar outras informações do banco de dados utilizando a árvore de navegação
principal ou o Localizador de Informações do Banco de Dados.
|
O que há de novo para o IBM i 7.3
|
|
Leia sobre informações novas ou significativamente alteradas para a coleta de tópicos de administração
de Banco de Dados.
|
Tabela Temporal de Período do Sistema
|
Uma tabela temporal de período do sistema é uma tabela que mantém versões históricas de suas linhas.
|
Como Saber o Que É Novo ou Que Foi Alterado
|
Para ajudar a ver onde as alterações técnicas foram feitas, o centro de informações utiliza:
|
v A imagem
marca onde começam as informações novas ou alteradas.
|
v A imagem
marca onde terminam as informações novas ou alteradas.
|
|
Nos arquivos PDF, você poderá ver barras de revisão (|) na margem esquerda das informações novas ou
alteradas.
|
|
Para localizar outras informações sobre as novidades ou alterações neste release, consulte Memorando
para Usuários.
Arquivo PDF para Administração de Banco de Dados
Você pode visualizar e imprimir um arquivo PDF dessas informações.
Para visualizar ou fazer o download da versão em PDF deste documento, selecione Administração do
banco de dados.
Salvando Arquivos PDF
Para salvar um PDF em sua estação de trabalho para exibição ou impressão:
1. Clique com o botão direito do mouse no link do PDF no seu navegador.
2. Clique na opção que salva o PDF localmente.
3. Navegue para o diretório no qual deseja salvar o PDF.
4. Clique em Salvar.
Fazendo Download do Adobe Reader
É necessário ter o Adobe Reader instalado em seu sistema para visualizar ou imprimir esses PDFs. É
possível fazer download de uma cópia gratuita a partir do website da Adobe
(http://get.adobe.com/reader/)
© Copyright IBM Corp. 1998, 2015
.
1
Administração de Banco de Dados
O DB2 for i fornece vários métodos para configurar e gerenciar bancos de dados.
Conceitos relacionados:
Gerenciamento de Diário
Acessando Dados Através de Interfaces do Cliente
É possível acessar os dados do DB2 for i através de interfaces do cliente no servidor, tais como driver
Java Database Connectivity (JDBC), o driver Open Database Connectivity (ODBC), o IBM i Portable
Application Solutions Environment (IBM i PASE), o OLE DB Provider, o .Net Provider, o Net.Data, ou a
Distributed Relational Database Architecture (DRDA).
Acessando Dados com Java
Você pode acessar dados do DB2 for i em seus programas Java™ utilizando o driver JDBC (Java Database
Connectivity) que está incluído com o programa licenciado IBM Developer Kit para Java.
O driver permite executar as seguintes tarefas:
v Acessar arquivos do banco de dados.
v Acessar funções do banco de dados JDBC com SQL (Linguagem de Consulta Estruturada) incorporada
para Java.
v Executar instruções SQL e processar resultados.
Conceitos relacionados:
Acessando o Banco de Dados do System i5 com o IBM Developer Kit para Driver JDBC do Java
Acessando Dados com o Domino
Você pode utilizar o IBM Lotus Domino para i5/OS para integrar dados dos bancos de dados do DB2 for
i e bancos de dados do Domino em ambas as direções.
Para obter vantagem dessa integração, você precisa entender e gerenciar como as autorizações funcionam
entre os dois tipos de bancos de dados.
Conceitos relacionados:
Lotus Domino para i5/OS
Acessando Dados com o ODBC
Você utiliza o driver ODBC (IBM i Access para Windows Open Database Connectivity) para permitir que
aplicativos clientes ODBC compartilhem efetivamente dados entre si e com o servidor.
Conceitos relacionados:
Administração do ODBC
Acessando Dados com o IBM i PASE
O IBM i Portable Application Solutions Environment (IBM i PASE) é um ambiente de tempo de execução
integrado para AIX, UNIX ou outros aplicativos que estão em execução no sistema operacional do IBM i.
O IBM i PASE suporta a CLI (Interface de Nível de Chamada) do DB2 for i.
Conceitos relacionados:
Banco de Dados
Acessando Dados com o Provedor IBM i Access para Windows OLE DB
O Provedor IBM i Access para Windows OLE DB, junto com o Kit de Ferramentas do Programador,
facilita o desenvolvimento de aplicativos cliente/servidor do IBM i a partir do PC do cliente Microsoft
Windows.
2
IBM i: Administração de Banco de Dados
O Provedor IBM i Access para Windows OLE DB fornece interfaces de acesso no nível de registro dos
programadores para arquivos de banco de dados do DB2 for i. Além disso, ele fornece suporte para SQL,
filas de dados, programas e comandos.
Referências relacionadas:
Provedor OLE DB do System i Access para Windows
Acessando Dados com o IBM i Access para Windows .Net Provider
O acesso ao IBM i Access para Windows .Net Provider.
O IBM i Access para Windows .Net Provider permite o acesso ao DB2 para IBM i através da interface
Microsoft ADO.NET.
Acessando Dados com o Net.Data
O Net.Data é um aplicativo executado em um servidor. Você pode utilizar o Net.Data para criar
facilmente documentos da Web dinâmicos que são chamados de macros da Web. As macros da Web
criadas para o Net.Data têm a simplicidade de HTML com a funcionalidade de aplicativos CGI-BIN.
O Net.Data facilita a inclusão de dados ativos em páginas da Web estáticas. Dados ativos incluem
informações que estão armazenadas em bancos de dados, arquivos, aplicativos e serviços do sistema.
Conceitos relacionados:
Aplicativos Net.Data para o Servidor HTTP
Acessando Dados Através de uma Partição do Linux
A IBM e vários distribuidores Linux cooperaram para integrar o sistema operacional Linux com a
confiabilidade da arquitetura IBM i.
O Linux traz uma nova geração de aplicativos baseados na Web para o produto IBM i. A IBM modificou
o kernel Linux PowerPC para executar em uma partição lógica secundária e contribuiu para a volta do
kernel à comunidade Linux.
Acessando Dados Utilizando o DRDA (Distributed Relational Database
Architecture)
Um banco de dados relacional distribuído consiste em um conjunto de objetos SQL que são espalhados entre
sistemas de computador interconectados. Cada banco de dados relacional tem um gerenciador de banco
de dados relacional para gerenciar as tabelas em seu ambiente.
Os gerenciadores de banco de dados comunicam-se e cooperam entre si de forma que um determinado
gerenciador de banco de dados acesse as instruções SQL em execução em um banco de dados relacional
em outro sistema.
Referências relacionadas:
Função do Banco de Dados Relacional Distribuído e SQL
Alterando e Gerenciando Objetos de Banco de Dados
O DB2 for i fornece métodos SQL (Linguagem de Consulta Estruturada) e de sistema para alterar e
gerenciar os objetos de bancos de dados.
Há vários métodos disponíveis para trabalhar com objetos de banco de dados. É possível usar a interface
IBM Navigator for i, instruções SQL ou comandos do IBM i.
Conceitos relacionados:
Tarefas de Banco de Dados do Navegador do System i
Referências relacionadas:
Terminologia: Acesso de Arquivo SQL versus Tradicional
Administração
3
Criando Objetos de Banco de Dados
A primeira etapa no desenvolvimento do banco de dados é criar objetos que conterão os dados. Você
pode criar tabelas, visualizações e índices com SQL. Também pode criar arquivos físicos e lógicos
utilizando a interface de sistema tradicional.
Você pode criar objetos de banco de dados utilizando o IBM Navigator for i, o SQL ou a interface de
sistema tradicional.
Conceitos relacionados:
Tarefas de Banco de Dados do Navegador do System i
Referências relacionadas:
Terminologia: Acesso de Arquivo SQL versus Tradicional
Assegurando a Integridade dos Dados
O DB2 for i fornece diversas medidas de integridade, incluindo limitações, programas do acionador e
controle de comprometimento.
Restrições, acionadores e controle de comprometimento podem proteger seu banco de dados contra
inserções, exclusões e atualizações inadvertidas. As restrições dizem basicamente como os valores de
dados podem ser alterados, enquanto os acionadores são ações automáticas que iniciam ou acionam um
evento, como uma atualização de uma tabela específica.
Conceitos relacionados:
Controle de Consolidação
“Trabalhando com Acionadores e Restrições” na página 25
Você pode utilizar acionadores ou restrições para gerenciar dados nas tabelas de bancos de dados.
Importando e Exportando Dados entre Sistemas
Importar dados é o processo de recuperação de dados de origens externas, enquanto exportar dados é o
processo de extrair dados de DB2 for i e copiá-los para outro sistema.
Importar dados para o DB2 for i pode ser um evento único ou pode ser uma tarefa contínua, como
atualizações semanais com o objetivo de fazer relatórios comerciais. Esses tipos de operações de
movimentação de dados são normalmente realizados por meio das funções importar, exportar ou
carregar.
Conceitos relacionados:
Copiando um Arquivo
Copiando Arquivos
Copiando Dados do Arquivo de Origem
Movendo um Arquivo
Tarefas relacionadas:
Importando e Exportando Dados
Carregando e Descarregando Dados de Sistemas Diferentes do System i
Trabalhando com Vários Bancos de Dados
O sistema fornece um banco de dados do sistema (identificado como SYSBAS) e a habilidade para
trabalhar com um ou mais bancos de dados de usuários.
Os bancos de dados do usuário são implementados através do uso de conjuntos de discos independentes,
que são configurados na função de gerenciamento de disco doSystem i Navigator. Depois que um
conjunto de discos independente é configurado, ele é exibido como outro banco de dados na pasta Banco
de dados do System i Navigator.
4
IBM i: Administração de Banco de Dados
Quando você expande um sistema no System i Navigator e, em seguida, expande os Bancos de Dados, é
exibida uma lista de bancos de dados com os quais você pode trabalhar. Para estabelecer uma conexão
com um banco de dados, expanda o banco de dados com o qual deseja trabalhar.
Conceitos relacionados:
Gerenciamento de Disco
|
Trabalhando com tabelas temporais de período do sistema
|
|
|
|
Definir uma tabela temporal de período do sistema permite manter versões históricas de linhas da tabela.
Uma tabela temporal de período do sistema armazena as versões atuais de seus dados e utiliza sua sua
tabela de históricos associada para armazenar versões anteriores de linhas que foram atualizadas ou
excluídas.
|
|
|
|
|
|
|
|
|
|
Uma tabela temporal de período do sistema é uma tabela SQL que pode ser criada utilizando as
instruções SQL CREATE TABLE ou ALTER TABLE. O gerenciamento de histórico para a tabela funciona
para as duas instruções SQL de Data Manipulation Language (DML) e também para operações de E/S do
DB nativo. O gerenciador do banco de dados utiliza o período SYSTEM_TIME para preservar as versões
históricas de cada linha que é afetada por uma operação de atualização ou de exclusão. O gerenciador do
banco de dados armazena as versões históricas das linhas em uma tabela de históricos, que está associada
à tabela temporal de período do sistema. Uma tabela de alteração para incluir a versão estabelece o link
entre a tabela temporal de período do sistema e sua tabela de históricos. Ao fazer referência a apenas
uma tabela temporal de período do sistema, suas consultas têm acesso a seus dados no momento atual e
nos momentos passados.
|
|
|
Tabelas Temporais de Período do Sistema
|
|
|
As colunas de tempo inicial, tempo final e ID de início da transação devem ser criadas usando a cláusula
GENERATED ALWAYS AS. Quando esta cláusula é usada, o DB2 for i mantém os valores de registro de
data e hora nessas colunas.
|
Coluna de tempo inicial:
|
|
A coluna de tempo inicial representa a hora em que os dados na linha se tornaram atuais. Ela é definida
como um TIMESTAMP(12).
|
|
|
|
|
O gerenciador de banco de dados gera um valor para esta coluna utilizando uma leitura do relógio do
sistema. Se várias linhas forem inseridas ou atualizadas em uma única transação SQL, o valor para a
coluna de tempo inicial é gerado apenas uma vez, no momento da primeira instrução de mudança de
dados, e é utilizado como o valor de tempo inicial para todas as operações de mudança de dados nessa
transação.
|
|
|
Quando uma tabela existente é alterada para incluir uma coluna de tempo inicial, a coluna de tempo
inicial é preenchida com o valor padrão 0001-01-01-00.00.00.000000000000 para todas as linhas
existentes.
|
Coluna de tempo final:
|
A coluna de tempo final representa a hora em que os dados na linha não eram mais atuais.
|
|
|
As linhas na tabela temporal de período do sistema são, por definição, atuais, portanto, a coluna de
tempo final é preenchida com um valor padrão, o 9999-12-30-00.00.00.000000000000. Para linhas em
uma tabela de históricos, o valor na coluna de tempo final representa quando a linha foi incluída na
Uma tabela temporal de período do sistema deve ter uma coluna de tempo inicial, uma coluna de tempo
final, uma coluna de ID de início da transação e um período SYSTEM_TIME.
Administração
5
| tabela de históricos. Para obter mais informações sobre como este valor é definido para as linhas do
| tempo, consulte Atualizando os dados em uma tabela temporal de período do sistema e Excluindo dados
| em uma tabela temporal de período do sistema.
| Quando uma tabela existente é alterada para incluir uma coluna de tempo final, a coluna de tempo final
| é preenchida com o valor padrão 9999-12-30-00.00.00.000000000000 para todas as linhas existentes.
| ID de início de transação:
| A coluna de ID de início de transação captura o horário da primeira operação de mudança de dados na
| transação.
|
|
|
|
|
|
|
|
Se várias linhas forem inseridas ou atualizadas em uma única transação SQL, então, os valores para a
coluna de ID de início de transação serão os mesmos para todas as linhas e serão exclusivos dos valores
gerados para esta coluna por outras transações. Quando a coluna de ID de início da transação não for
nula, é possível usá-la para identificar todas as linhas nas tabelas que foram gravadas pela mesma
transação. Se o ID de início da transação for definido para permitir o valor NULL, ele é definido para um
valor apenas quando o ID de início da transação não corresponder ao valor da coluna de tempo inicial. A
diferença entre a o ID de início da transação e a coluna de tempo inicial tem mais explicações no tópico
Conflitos de valores de registro de data e hora da tabela temporal de período do sistema.
| Período SYSTEM_TIME:
| O período SYSTEM_TIME indica o período de tempo quando a versão de uma linha é atual.
| O período SYSTEM_TIME é definido por uma coluna de tempo inicial e uma coluna de tempo final.
|
|
|
|
|
|
Tabelas de históricos
|
|
|
|
|
As colunas na tabela de históricos e tabela temporal de período do sistema devem ter os mesmos exatos
nomes, ordem e tipos de dados. É possível criar uma tabela de históricos com os mesmos nomes e
definições como as colunas da tabela temporal de período do sistema, usando a cláusula LIKE da
instrução CREATE TABLE. Exemplo:
Cada tabela temporal de período do sistema está ligada a uma tabela de históricos. Quando uma linha é
atualizada ou excluída de uma tabela temporal de período do sistema, o gerenciador de banco do dados
insere uma cópia da linha antiga em sua tabela de históricos associada, com um registro de data e hora
do tempo final atualizado. Este armazenamento de dados anteriores da tabela temporal de período do
sistema fornece a capacidade de recuperar dados de momentos passados.
CREATE TABLE hist_policy_info LIKE policy_info;
| Uma tabela de históricos será sujeita às seguintes regras e restrições quando o versionamento estiver
| ativado:
| v Uma tabela de históricos não pode ser explicitamente eliminada. Ela só pode ser implicitamente
|
eliminada quando a tabela temporal do período do sistema associada for eliminada.
| v As colunas da tabela de históricos não podem ser explicitamente incluídas, eliminadas ou mudadas.
| v Uma tabela de históricos não pode ser definida como pai, filho ou de autorreferência em uma restrição
|
de referência.
|
|
|
|
Quando o versionamento é estabelecido, uma mudança para uma tabela temporal de período do sistema
causa uma mudança correspondente implícita na tabela de históricos. Por exemplo, se uma tabela
temporal de período do sistema é alterada para incluir uma coluna, a mesma coluna é incluída na tabela
de históricos.
6
IBM i: Administração de Banco de Dados
|
|
|
|
Como excluir dados em uma tabela de históricos pode prejudicar sua habilidade de auditar o histórico de
dados da tabela temporal de período do sistema, deve-se restringir o acesso a uma tabela de históricos
para proteger seus dados.
Referências relacionadas:
|
|
CREATE TABLE
ALTER TABLE
|
|
|
|
Criando uma tabela temporal de período do sistema
|
Ao criar uma tabela temporal de período do sistema, deve-se:
|
|
v Definir sua tabela nova ou existente para que ela possa ser usada como uma tabela temporal de
período do sistema:
Criar uma tabela temporal de período do sistema e uma tabela de históricos correspondente que estejam
em um relacionamento de versionamento resulta em duas tabelas que controlam quando as mudanças de
dados ocorrerão e preserva versões históricas desses dados.
|
|
– Definindo as colunas de tempo inicial, tempo final e ID de início da transação para o gerenciador do
banco de dados usar para manter os horários histórios para cada linha.
|
– Definindo um período SYSTEM_TIME para controlar quando uma linha é atual.
|
v Criar uma tabela de históricos para receber linhas antigas da tabela temporal de período do sistema.
|
|
v Incluir o versionamento para estabelecer o link entre a tabela temporal de período do sistema e a
tabela de históricos.
|
|
O exemplo na seção a seguir mostra a criação de uma tabela que armazena informações de política para
os clientes de uma empresa de seguros
|
Para criar uma tabela temporal de período do sistema
|
|
1. Crie uma tabela com as colunas de tempo inicial, tempo final e ID de início da transação e um
período SYSTEM_TIME.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
No exemplo a seguir, a tabela POLICY_INFO armazena informações sobre a cobertura de seguro de um
cliente. As colunas do período SYSTEM_TIME, SYS_START e SYS_END, mostram quando uma linha é
atual. A coluna TS_ID mostra o horário da primeira operação de mudança de dados na transação que
afetou a linha.
CREATE TABLE policy_info
( policy_id CHAR(4) NOT NULL,
coverage
INT NOT NULL,
sys_start TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN,
sys_end
TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END,
ts_id
TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS TRANSACTION START ID,
PERIOD SYSTEM_TIME (sys_start, sys_end) );
2. Crie uma tabela de históricos correspondente. É possível criar uma tabela de históricos com os
mesmos nomes de coluna e descrições que as colunas da tabela temporal de período do sistema,
usando a cláusula LIKE da instrução CREATE TABLE. Exemplo:
CREATE TABLE hist_policy_info LIKE policy_info;
3. Inclua o versionamento na tabela temporal de período do sistema para estabelecer um link com a
tabela de históricos. Exemplo:
ALTER TABLE policy_info ADD VERSIONING USE HISTORY TABLE hist_policy_info;
|
|
Quando todas as três etapas estiverem concluídas, a tabela de históricos HIST_POLICY_INFO recebe as
linhas antigas da tabela POLICY_INFO.
|
|
|
|
|
A cláusula ON DELETE ADD EXTRA ROW pode ser opcionalmente especificada na instrução ALTER
TABLE ADD VERSIONING. Se a cláusula for especificada, uma linha extra será inserida na tabela de
históricos quando uma linha é excluída da tabela temporal de período do sistema. Quando a linha
adicional é gravada na tabela de históricos, os valores das colunas de expressão geradas, incluindo a
coluna de tempo inicial e de tempo final, são gerados. Para obter mais informações sobre como ON
Administração
7
|
|
|
|
|
DELETE ADD EXTRA ROW pode ser usado para controlar informações de auditoria, consulte Usando
uma tabela temporal de período do sistema para controlar informações de auditoria.
Referências relacionadas:
CREATE TABLE
ALTER TABLE
| Exemplos adicionais de CREATE TABLE da tabela temporal de período do sistema:
| Exemplos adicionais incluem ocultar colunas e mudar uma tabela existente para uma tabela temporal de
| período do sistema.
| Ocultando colunas
|
|
|
|
|
As colunas tempo inicial, tempo final e ID de início da transação podem ser definidas como IMPLICITLY
HIDDEN. As colunas definidas como IMPLICITLY HIDDEN não aparecem na lista de seleção, a menos
que explicitamente referenciadas. Como os valores das colunas tempo inicial, tempo final e ID de início
da transação são gerados pelo gerenciador do banco de dados, ocultá-las pode minimizar qualquer
impacto em seus aplicativos existentes.
| Exemplo:
| v Uma consulta SELECT * executada com relação a uma tabela não retorna quaisquer colunas
|
implicitamente ocultas na tabela de resultados.
| v Uma instrução INSERT sem uma lista de coluna não espera que o valor padrão seja especificado para
|
quaisquer colunas ocultas implicitamente.
| O exemplo a seguir cria a tabela POLICY_INFO com as colunas TIMESTAMP(12) SYS_START, SYS_END e
| TS_ID definidas como ocultas implicitamente.
| CREATE TABLE policy_info
|
( policy_id CHAR(4) NOT NULL,
|
coverage
INT NOT NULL,
|
sys_start TIMESTAMP(12) NOT NULL
|
GENERATED ALWAYS AS ROW BEGIN
|
IMPLICITLY HIDDEN,
|
sys_end
TIMESTAMP(12) NOT NULL
|
GENERATED ALWAYS AS ROW END
|
IMPLICITLY HIDDEN,
|
ts_id
TIMESTAMP(12) NOT NULL
|
GENERATED ALWAYS AS TRANSACTION START ID
|
IMPLICITLY HIDDEN,
|
PERIOD SYSTEM_TIME (sys_start, sys_end) );
|
|
|
|
|
|
Criar a tabela de históricos HIST_POLICY_INFO usando a cláusula LIKE da instrução CREATE TABLE
resulta na tabela de históricos herdando o atributo oculto implicitamente da tabela POLICY_INFO. Se você
não usar a cláusula LIKE ao criar a tabela de históricos, então, quaisquer colunas definidas como ocultas
na tabela temporal de período do sistema também deverá ser definida como oculta na tabela de históricos
associada. Se as definições de coluna não corresponderem, você não será capaz de incluir o
versionamento.
| Mudando uma tabela existente para uma tabela temporal de período do sistema
| No exemplo a seguir, as três colunas de registro de data e hora e um período SYSTEM_TIME são
| incluídas na tabela existente, EMPLOYEES, preparando-a para ser usada como uma tabela temporal de
| período do sistema.
| ALTER TABLE employees
|
ADD COLUMN sys_start TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN
|
ADD COLUMN sys_end TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END
|
ADD COLUMN ts_id TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS TRANSACTION START ID
|
ADD PERIOD SYSTEM_TIME(sys_start, sys_end);
8
IBM i: Administração de Banco de Dados
|
|
Uma tabela de históricos deve ser criada e o versionamento incluído para terminar de ativar o rastreio de
linhas do tempo.
|
|
|
Inserindo dados em uma tabela temporal de período do sistema
|
|
|
|
O gerenciador do banco de dados gera automaticamente os valores das colunas de registro de data e hora
de tempo inicial e tempo final quandos os dados são inseridos em uma tabela temporal de período do
sistema. O gerenciador do banco de dados também gera o valor de ID de início da transação que
identifica exclusivamente a transação que está inserindo a linha.
|
|
Neste exemplo, os seguintes dados foram inseridos em 31 de janeiro de 2015 (31-01-2015) na tabela criada
no exemplo em Criando uma tabela temporal de período do sistema.
|
|
|
|
|
|
|
|
|
Insira três linhas na tabela POLICY_INFO.
|
|
A tabela POLICY_INFO agora contém os dados de cobertura de seguro na tabela a seguir. As entradas de
colunas SYS_START, SYS_END e TS_ID foram geradas pelo gerenciador do banco de dados.
|
Tabela 1. Dados na tabela temporal de período do sistema, POLICY_INFO, depois das instruções INSERT
|
POLICY_ID
COVERAGE
SYS_START
SYS_END
TS_ID
|
|
A123
12000
2015-01-3122.31.33.495925000000
9999-12-3000.00.00.000000000000
2015-01-3122.31.33.495925000000
|
|
B345
18000
2015-01-3122.31.33.495925000000
9999-12-3000.00.00.000000000000
2015-01-3122.31.33.495925000000
|
|
|
C567
20000
2015-01-3122.31.33.495925000000
9999-12-3000.00.00.000000000000
2015-01-3122.31.33.495925000000
|
|
Os valores de registro de data e hora SYS_START são os mesmos para todas as três linhas inseridas
recentemente porque, neste exemplo, as linhas foram inseridas como parte da mesma transação.
|
|
A tabela de históricos HIST_POLICY_INFO permanecerá vazia porque nenhuma linha do tempo é gerada
por uma inserção.
|
|
|
|
|
|
|
|
A coluna de tempo inicial, SYS_START, representa o horário em que a linha se tornou atual. O gerenciador
do banco de dados gera esse valor usando uma leitura do relógio do sistema no momento em que ele
executa a primeira instrução de mudança de dados na transação que gera a linha. O gerenciador do
banco de dados também gera a coluna de ID de início da transação TS_ID, que captura o horário quando
a execução iniciou para uma transação que afeta a linha. Na maioria dos casos, os valores de registro de
data e hora para essas duas colunas são os mesmos, porque eles são resultados da execução da mesma
transação. Se a coluna de ID de início da transação for definida para permitir o valor NULL, ele será
NULL quando o valor da coluna de ID de início da transação for idêntico à coluna de tempo inicial.
|
|
|
|
|
Quando várias transações estão atualizando a mesma linha, podem ocorrer conflitos de registro de data e
hora. O gerenciador do banco de dados pode resolver esses conflitos, ajustando os valores de registro de
data e hora da coluna de tempo inicial. Em tais casos, os valores na coluna de tempo inicial e na coluna
de ID de início da transação diferem. O tópico Conflitos de valor de registro de data e hora da tabela
temporal de período do sistema fornece mais detalhes sobre ajustes de registro de data e hora.
Inserir dados em uma tabela temporal de período do sistema é semelhante a inserir dados em uma tabela
comum.
INSERT INTO policy_info (policy_id, coverage)
VALUES(’A123’,12000);
INSERT INTO policy_info (policy_id, coverage)
VALUES(’B345’,18000);
INSERT INTO policy_info (policy_id, coverage)
VALUES(’C567’,20000);
Administração
9
| Referências relacionadas:
| INSERT
| Atualizando dados em uma tabela temporal de período do sistema
| A atualização de dados em uma tabela temporal de período do sistema resulta em linhas incluídas na
| tabela de históricos associada da tabela temporal de período do sistema.
|
|
|
|
|
Além disso, para atualizar os valores em linhas da tabela temporal de período do sistema, a instrução
UPDATE faz com que o gerenciador do banco de dados insira uma cópia da linha existente na tabela de
históricos associada. A linha do tempo é gerada como parte da mesma transação que atualiza a linha. Se
uma única transação atualiza a mesma linha várias vezes, apenas uma linha do tempo será gerada, e essa
linha reflete o estado do registro antes de quaisquer mudanças feitas pela transação.
| No exemplo a seguir, a cobertura de seguro de um cliente é aumentada em 28 de fevereiro de 2016
| (28-02-2016). Este exemplo usa a tabela criada em Criando uma tabela temporal de período do sistema
| com linhas que foram incluídas em Inserindo dados em uma tabela temporal de período do sistema.
| A tabela a seguir contém os dados da tabela POLICY_INFO antes da atualização.
|
Tabela 2. Dados na tabela temporal de período do sistema POLICY_INFO, antes da instrução UPDATE
|
POLICY_ID
COVERAGE
SYS_START
SYS_END
TS_ID
|
|
A123
12000
2015-01-3122.31.33.495925000000
9999-12-3000.00.00.000000000000
2015-01-3122.31.33.495925000000
|
|
B345
18000
2015-01-3122.31.33.495925000000
9999-12-3000.00.00.000000000000
2015-01-3122.31.33.495925000000
|
|
|
C567
20000
2015-01-3122.31.33.495925000000
9999-12-3000.00.00.000000000000
2015-01-3122.31.33.495925000000
| Atualize a cobertura para a política C567 para 25000.
| UPDATE policy_info
|
SET coverage = 25000
|
WHERE policy_id = ’C567’;
| A atualização para a política C567 afeta a tabela temporal de período do sistema e sua tabela de
| históricos, fazendo com que o seguinte ocorra:
| 1. O valor de cobertura para a linha com a política C567 é atualizado para 25000.
| 2. Na tabela temporal de período do sistema, o gerenciador do banco de dados atualiza os valores
|
SYS_START e TS_ID para o registro de data e hora da atualização, e o valor SYS_END fica inalterado.
| 3. A linha original é inserida na tabela de históricos. O gerenciador do banco de dados atualiza o valor
|
SYS_END para o registro de data e hora da atualização. Esta linha pode ser interpretada como a
|
cobertura válida para a política C567 de 2015-01-31-22.31.33.495925000000 para 2016-02-28|
09.10.12.649592000000.
|
Tabela 3. Dados na tabela temporal de período do sistema, POLICY_INFO, após a instrução UPDATE
|
POLICY_ID
COVERAGE
SYS_START
SYS_END
TS_ID
|
|
A123
12000
2015-01-3122.31.33.495925000000
9999-12-3000.00.00.000000000000
2015-01-3122.31.33.495925000000
|
|
B345
18000
2015-01-3122.31.33.495925000000
9999-12-3000.00.00.000000000000
2015-01-3122.31.33.495925000000
|
|
|
C567
25000
2016-02-2809.10.12.649592000000
9999-12-3000.00.00.000000000000
2016-02-2809.10.12.649592000000
10
IBM i: Administração de Banco de Dados
|
Tabela 4. Dados na tabela de históricos, HIST_POLICY_INFO, após a instrução UPDATE
|
POLICY_ID
COVERAGE
SYS_START
SYS_END
TS_ID
|
|
|
C567
20000
2015-01-3122.31.33.495925000000
2016-02-2809.10.12.649592000000
2015-01-3122.31.33.495925000000
|
|
|
Se uma ou mais atualizações ocorrerem durante a execução sob o controle de compromisso, e o usuário
recuperar a transação, então, as atualizações para a tabela temporal de período do sistema e as inserções
na tabela de históricos são recuperadas.
|
|
|
|
|
|
|
Quando várias transações estão atualizando a mesma linha, podem ocorrer conflitos de registro de data e
hora. Quando esses conflitos ocorrerem, a configuração para a opção SYSTIME_PERIOD_ADJ QAQQINI
determina se os ajustes registro de data e hora são feitos ou se a transação falha. O tópico Conflitos de
valor de registro de data e hora da tabela temporal de período do sistema fornece mais detalhes sobre
ajustes de registro de data e hora. Os programadores de aplicativos podem considerar o uso dos valores
SQLCODE ou SQLSTATE para manipular os códigos de retorno relacionados ao ajuste do valor de
registro de data e hora a partir das instruções de atualização SQL.
|
Referências relacionadas:
|
ATUALIZAR
|
|
|
|
|
Excluindo dados em uma tabela temporal de período do sistema
|
|
|
|
No exemplo a seguir, o proprietário da política B345 decide cancelar a cobertura de seguro. Os dados
para o cliente foram excluídos no dia 1 de setembro de 2016 (01-09-2016) da tabela de exemplo criada no
tópico Criando uma tabela temporal de período do sistema e atualizados no tópicoAtualizando os dados
em uma tabela temporal de período do sistema.
|
A tabela a seguir contém os dados da tabela POLICY_INFO antes da exclusão.
|
Tabela 5. Dados na tabela temporal de período do sistema, POLICY_INFO, antes da instrução DELETE
|
POLICY_ID
COVERAGE
SYS_START
SYS_END
TS_ID
|
|
A123
12000
2015-01-3122.31.33.495925000000
9999-12-3000.00.00.000000000000
2015-01-3122.31.33.495925000000
|
|
B345
18000
2015-01-3122.31.33.495925000000
9999-12-3000.00.00.000000000000
2015-01-3122.31.33.495925000000
|
|
|
C567
25000
2016-02-2809.10.12.649592000000
9999-12-3000.00.00.000000000000
2016-02-2809.10.12.649592000000
|
|
A instrução a seguir exclui as informações de política para o ID de política B345.
|
|
A exclusão da política B345 afeta a tabela temporal de período do sistema e sua tabela de históricos,
fazendo com que o seguinte ocorra:
|
|
|
1. A linha original é copiada para a tabela de históricos. O gerenciador do banco de dados atualiza o
valor da coluna SYS_END para o registro de data e hora da primeira operação de mudança de dados na
transação.
|
|
2. A linha na qual o valor da coluna policy_id é B345 é excluída da tabela temporal de período do
sistema.
A exclusão de uma linha de uma tabela temporal de período do sistema remove a linha da tabela e inclui
uma ou duas linhas na tabela de históricos associada. A instrução DELETE copia a linha existente na
tabela de históricos associada antes que a linha seja excluída da tabela temporal de período do sistema.
As linhas na tabela de históricos são incluídas com os registros de data e hora do sistema apropriados.
DELETE FROM policy_info WHERE policy_id = ’B345’;
Administração
11
|
Tabela 6. Dados na tabela temporal de período do sistema, POLICY_INFO, após a instrução DELETE
|
POLICY_ID
COVERAGE
SYS_START
SYS_END
TS_ID
|
|
A123
12000
2015-01-3122.31.33.495925000000
9999-12-3000.00.00.000000000000
2015-01-3122.31.33.495925000000
|
|
|
C567
25000
2016-02-2809.10.12.649592000000
9999-12-3000.00.00.000000000000
2016-02-2809.10.12.649592000000
|
Tabela 7. Dados na tabela de históricos HIST_POLICY_INFO após a instrução DELETE
|
POLICY_ID
COVERAGE
SYS_START
SYS_END
TS_ID
|
|
C567
20000
2015-01-3122.31.33.495925000000
2016-02-2809.10.12.649592000000
2015-01-3122.31.33.495925000000
2015-01-3122.31.33.495925000000
2016-09-0112.18.22.959254000000
2015-01-3122.31.33.495925000000
| B345
18000
|
|
| Referências relacionadas:
| EXCLUIR
|
|
|
|
Usando uma tabela temporal de período do sistema para controlar informações de
auditoria
Uma trilha de auditoria das mudanças que foram feitas para a tabela temporal de período do sistema
pode se tornar mais informativa com a adição de um ou mais colunas de expressão geradas.
| Alguns exemplos de informações de auditoria que podem ser controladas são
| v quando os dados foram modificados
| v quem modificou os dados
| v qual operação SQL modificou os dados.
|
|
|
|
Para controlar quando os dados foram modificados, defina a tabela como uma tabela temporal de
período do sistema. Para controlar quem e qual instrução SQL modificou os dados, use uma coluna de
expressão gerada. Para obter mais informações sobre colunas de expressão geradas disponíveis, consulte
CREATE TABLE.
| No exemplo a seguir, a tabela POLICY_INFO contém duas colunas extras. AUDIT_USER controla quem
| modificou os dados usando o registro especial SESSION USER. AUDIT_OP controla a operação SQL que
| modificou os dados usando a DATA CHANGE OPERATION.
|
CREATE TABLE policy_info
|
(policy_id CHAR(4) NOT NULL,
|
coverage
INT NOT NULL,
|
audit_user VARCHAR(128) GENERATED ALWAYS AS (SESSION USER),
|
audit_op
CHAR(1) GENERATED ALWAYS AS (DATA CHANGE OPERATION),
|
sys_start TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN,
|
sys_end
TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END,
|
ts_id
TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS TRANSACTION START ID,
|
PERIOD SYSTEM_TIME (sys_start, sys_end) );
|
| CREATE TABLE hist_policy_info LIKE policy_info;
|
| ALTER TABLE policy_info ADD VERSIONING USE HISTORY TABLE hist_policy_info
|
ON DELETE ADD EXTRA ROW;
| Cada linha na tabela temporal do sistema e sua tabela de históricos correspondente rastreia se a linha foi
| mudada por uma operação de inserção, atualização ou exclusão, e o nome do usuário que modificou a
| linha pela última vez.
12
IBM i: Administração de Banco de Dados
|
ON DELETE ADD EXTRA ROW
|
|
|
|
Se a clásula ON DELETE ADD EXTRA ROW for especificada na instrução ALTER TABLE ADD
VERSIONING, uma linha extra será inserida na tabela de históricos quando uma linha é excluída de uma
tabela temporal de período do sistema. Esta linha adicional contém informações sobre a própria operação
de exclusão.
|
|
|
|
|
|
|
|
|
|
|
|
O exemplo a seguir ilustra o valor de ON DELETE ADD EXTRA ROW. Este exemplo mostra uma série de três
transações. Em junho de 2014, USER1 insere uma linha na tabela do POLICY_INFO. Então, em janeiro de
2015, USER2 atualiza a linha. Finalmente, em agosto de 2015, USER3 exclui a linha:
|
|
|
|
|
Sem a cláusula ON DELETE ADD EXTRA ROW, essa série de transações gravaria somente as seguintes
duas entradas na tabela de históricos. A primeira entrada registra a linha como era antes de o USER2 ter
feito sua atualização, e a segunda entrada registra a linha como ela era antes de o USER3 ter feito a
exclusão. A operação de exclusão de registra a linha como existia na tabela temporal na última vez. Sem a
cláusula ON DELETE ADD EXTRA ROW, não há registro de auditoria da própria operação de exclusão.
|
|
Tabela 8. Dados na tabela de históricos, HIST_POLICY_INFO, após a instrução DELETE quando ON DELETE ADD EXTRA
ROW não for especificado
|
POLICY_ID
COVERAGE
AUDIT_USER
AUDIT_OP
SYS_START
SYS_END
TS_ID
|
|
A123
12000
USER1
T
2014-06-3122.31.33.495925
2015-01-3122.31.33.857632
2014-06-3122.31.33.495925
|
|
|
A123
25000
USER2
i
2015-01-3122.31.33.857632
2015-08-3122.31.33.634521
2015-01-3122.31.33.857632
|
|
|
|
|
Com a cláusula DELETE ADD EXTRA ROW incluída na instrução ADD VERSIONING, uma linha extra
gravada na tabela de históricos. Como os valores de tempo inicial e tempo final são gerados para a linha
extra, eles são o mesmo valor de registro de data e hora. Este registro de data e hora também
corresponde ao valor de tempo final da primeira linha inserida para a exclusão. Na tabela a seguir, essa
linha adicional é mostrada:
|
|
Tabela 9. Os dados na tabela de históricos, HIST_POLICY_INFO, após a instrução DELETE, quando ON DELETE ADD
EXTRA ROW é especificado
|
POLICY_ID
COVERAGE
AUDIT_USER
AUDIT_OP
SYS_START
SYS_END
TS_ID
|
|
A123
12000
USER1
T
2014-06-3122.31.33.495925
2015-01-3122.31.33.857632
2014-06-3122.31.33.495925
|
|
A123
25000
USER2
i
2015-01-3122.31.33.857632
2015-08-3122.31.33.634521
2015-01-3122.31.33.857632
|
|
|
|
A123
25000
USER3
d
2015-08-3122.31.33.634521
2015-08-3122.31.33.634521
2015-08-3122.31.33.634521
Referências relacionadas:
|
Criando colunas de auditoria
INSERT INTO policy_info (policy_id, coverage)
VALUES (’A123’,12000);
UPDATE policy_info
SET coverage = 25000
WHERE policy_id = ’A123’
DELETE FROM policy_info
WHERE policy_id = 'A123'
Administração
13
|
|
|
|
|
|
Conflitos de valor de registro de data e hora da tabela temporal de período do
sistema
O gerenciador do banco de dados irá impedir que uma linha do tempo de uma tabela temporal de
período do sistema seja gerada com um registro de data e hora de tempo final menor do que o registro
de data e hora de tempo inicial. Esse tipo de conflito pode ocorrer quando várias transações atualizaram
a mesma linha de uma tabela temporal de período do sistema.
| Um cenário de exemplo é mostrado na tabela abaixo. Os registros de data e hora para este exemplo
| foram simplificados como um item temporário, em vez de uma leitura do relógio do sistema de amostra.
|
Tabela 10. Transações simultâneas em uma tabela temporal de período do sistema
|
|
|
Data e Hora
Atuais
Transação A
Transação
A, valor
SYS_START
Transação B
Transação
B, valor
SYS_START
|
|
|
|
T1
|
|
|
|
T2
INSERT INTO
policy_info (policy_id,
coverage)
VALUES (’T888’,8000)
T2
|
T3
COMMIT
T2
|
|
|
T4
UPDATE policy_info
SET policy_id = ’X999’
WHERE policy_id = ’T888’
T1
|
|
T5
COMMIT
T1
|
|
|
|
|
|
Quando várias linhas são inseridas ou atualizadas na mesma transação, a coluna de tempo inicial é a
mesma para todas as linhas afetadas. O valor para o início da linha vem de uma leitura do relógio do
sistema no momento da primeira mudança de dados na transação. Na tabela acima, todas as linhas
inseridas ou atualizadas pela transação A possuem um registro de data e hora de tempo inicial de T1, e a
linha inserida pela transação B possui um registro de data e hora de tempo inicial de T2. No tempo T3, a
inserção da linha dois é confirmada com um registro de data e hora de tempo inicial de T2.
|
|
|
|
|
|
|
Quando a transação A atualiza a linha em que o POLICY_ID é igual a 'T888' no tempo T4, o registro
atualizado de data e hora de tempo inicial da linha é mudado para T1 porque a atualização ocorreu na
transação A. A linha original é inserida na tabela de históricos e o valor do registro de data e hora de
tempo final para a linha do tempo é atualizado para corresponder ao valor de registro de data e hora de
tempo inicial da linha atualizada, T1. O valor de tempo inicial da linha do tempo é T2. Isso resultaria em
uma linha do tempo com um valor de registro de data e hora de tempo final, T1, que é anterior ao seu
valor de registro de data e hora de tempo inicial, T2. Isso não é permitido.
|
|
|
|
|
|
|
|
|
|
A opção SYSTIME_PERIOD_ADJ QAQQINI determina qual ação o sistema executa quando uma linha do
tempo possui um registro de data e hora de tempo final que é menor que o registro de data e hora de
tempo inicial. O valor QAQQINI pode ser configurado para *ERROR ou *ADJUST, com *ERROR sendo o
valor padrão. Quando *ERROR é utilizado, um erro com SQLCODE -20528 e SQLSTATE 57062 será
retornado quando o valor de registro de data e hora de tempo final for menor que o valor de registro de
data e hora de tempo inicial. Quando *ADJUST é utilizado, um ajuste é feito para o valor de registro de
data e hora de tempo inicial e o registro de data e hora de tempo final, em vez de retornar um erro. Em
tais casos, os valores na coluna inicial da linha e a coluna de ID de início da transação serão diferentes.
Para obter mais informações sobre a opção SYSTIME_PERIOD_ADJ QAQQINI, consulte Desempenho e
otimização de consulta.
14
INSERT INTO
policy_info (policy_id,
coverage)
VALUES (’S777’,7000)
IBM i: Administração de Banco de Dados
T1
|
|
|
|
Outro exemplo de quando esta situação pode ocorrer é quando o relógio do sistema é ajustado. Isso pode
acontecer ao mudar o horário da conta para o horário de verão. Como no caso anterior, o valor da opção
QAQQINI deve determinar se um erro é retornado ou se os valores de registro de data e hora são
ajustados.
|
|
|
Consultando os dados temporais do período do sistema
|
Para consultar uma tabela temporal, é possível especificar os critérios de tempo de várias maneiras:
|
v em uma consulta usando explicitamente uma especificação de período SYSTEM_TIME,
|
|
v em uma consulta usando implicitamente o registro do sistema CURRENT TEMPORAL SYSTEM_TIME,
ou
|
v em uma definição de visualização.
|
Especificando os critérios de tempo em uma consulta:
|
|
Ao consultar uma tabela temporal de período do sistema, é possível incluir FOR SYSTEM_TIME na
cláusula FROM para consultar o estado atual e passado de seus dados.
|
|
Os períodos de tempo podem ser especificados de três maneiras:
v valorAS OF
|
|
|
|
|
|
|
|
|
|
|
|
Consultar uma tabela temporal de período do sistema pode retornar resultados para um determinado
ponto ou período no tempo. Os resultados podem incluir valores atuais e valores históricos anteriores.
Inclui cada linha para a qual o valor de tempo inicial é menor ou igual ao valor e o valor de tempo
final é maior que valor. Zero linhas são retornadas se o valor for o valor nulo.
v FROM value1 TO value2
Inclui linhas que existem completamente dentro do período que é especificado de value1 a value2. Uma
linha é incluída se o valor de tempo inicial for menor que value2 e o valor de tempo final for maior
que value1. Zero linhas são retornadas se value1 for maior ou igual a value2, ou se value1 ou value2
forem o valor nulo.
v BETWEEN value1 AND value2
Inclui linhas que se sobrepõem em qualquer momento entre value1 e value2. Uma linha é incluída se
seu valor de tempo inicial for menor ou igual a value2 e se o valor de tempo final for maior que value1.
Zero linhas são retornadas se value1 for maior que value2, ou se value1 ou value2 forem o valor nulo. Se
value1 = value2, a expressão será equivalente a AS OF value1.
|
Para obter informações detalhadas sobre períodos de tempo, consulte referência de tabela e Consultas.
|
Referências relacionadas:
|
SELECT
|
Exemplo: critérios de tempo na consulta:
|
|
Essas consultas de amostra solicitam informações de política a partir de uma tabela temporal de período
do sistema. Cada consulta usa uma variação da especificação FOR SYSTEM_TIME.
|
|
A tabela temporal POLICY_INFO e sua tabela de históricos associada que é usada nos exemplos contêm
estas linhas:
|
Tabela 11. Tabela temporal de período do sistema POLICY_INFO
|
POLICY_ID
COVERAGE
SYS_START
SYS_END
TS_ID
|
|
A123
12000
2015-01-3122.31.33.495925000000
9999-12-3000.00.00.000000000000
2015-01-3122.31.33.495925000000
|
|
C567
25000
2016-02-2809.10.12.649592000000
9999-12-3000.00.00.000000000000
2016-02-2809.10.12.649592000000
Administração
15
|
|
Tabela 12. Tabela de históricos HIST_POLICY_INFO
|
POLICY_ID
COVERAGE
SYS_START
SYS_END
TS_ID
|
|
C567
20000
2015-01-3122.31.33.495925000000
2016-02-2809.10.12.649592000000
2015-01-3122.31.33.495925000000
| B345
18000
2015-01-312016-09-012015-01-31|
22.31.33.495925000000
12.18.22.959254000000
22.31.33.495925000000
|
| v
|
Consulta sem período especificado
|
SELECT policy_id, coverage, sys_start, sys_end
|
FROM policy_info
|
WHERE policy_id = ’C567’
|
Esta consulta retorna uma linha. A instrução SELECT consulta apenas a tabela POLICY_INFO. A tabela de
|
históricos não é consultada porque FOR SYSTEM_TIME não foi especificado.
|
Tabela 13. Resultado da consulta sem período especificado
|
POLICY_ID
| C567
|
|
| v
|
|
|
|
|
|
|
|
COVERAGE
SYS_START
SYS_END
25000
2016-02-2809.10.12.649592000000
9999-12-3000.00.00.000000000000
Consulta com a cláusula FOR SYSTEM_TIME AS OF especificada
SELECT policy_id, coverage, sys_start, sys_end
FROM policy_info
FOR SYSTEM_TIME AS OF ’2016-02-28-09.10.12.649592000000’
Essa consulta retorna três linhas. A instrução SELECT consulta as tabelas POLICY_INFO e
HIST_POLICY_INFO. A coluna de tempo inicial do período é inclusiva, enquanto a coluna de tempo final
é exclusiva. A linha da tabela de históricos com um valor de coluna SYS_END de 2016-02-2809.10.12.649592000000 é igual ao valor AS OF, mas deve ser menor do que o valor a ser retornado
|
Tabela 14. Resultado da consulta com um período FOR SYSTEM_TIME AS OF especificado
|
POLICY_ID
COVERAGE
SYS_START
SYS_END
|
|
A123
12000
2015-01-3122.31.334959250000
9999-12-3000.00.00.000000000000
|
|
C567
25000
2016-02-2809.10.12.649592000000
9999-12-3000.00.00.000000000000
| B345
|
|
| v
18000
2015-01-3122.31.33.495925000000
2016-09-0112.18.22.959254000000
|
|
|
|
|
|
|
|
Consulta com FOR SYSTEM_TIME FROM...TO especificado.
SELECT policy_id, coverage, sys_start, sys_end
FROM policy_info
FOR SYSTEM_TIME FROM ’0001-01-01-00.00.00.000000000000’
TO ’9999-12-30-00.00.00.000000000000’
WHERE policy_id = ’C567’
Essa consulta retorna duas linhas. A instrução SELECT consulta as tabelas POLICY_INFO e
HIST_POLICY_INFO.
|
Tabela 15. Resultado da consulta com FOR SYSTEM_TIME FROM...TO especificado.
|
POLICY_ID
COVERAGE
SYS_START
SYS_END
|
|
C567
25000
2016-02-2809.10.12.649592000000
9999-12-3000.00.00.000000000000
16
IBM i: Administração de Banco de Dados
|
Tabela 15. Resultado da consulta com FOR SYSTEM_TIME FROM...TO especificado. (continuação)
|
POLICY_ID
COVERAGE
SYS_START
SYS_END
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C567
20000
2015-01-3122.31.33.495925000000
2016-02-2809.10.12.649592000000
v
Consulta com FOR SYSTEM_TIME BETWEEN...AND especificado.
SELECT policy_id, coverage
FROM policy_info
FOR SYSTEM_TIME BETWEEN ’2016-02-28-09.10.12.649592000000’
AND ’9999-12-30-00.00.00.000000000000’
Essa consulta retorna três linhas. A instrução SELECT consulta as tabelas POLICY_INFO e
HIST_POLICY_INFO. As linhas com um valor de coluna SYS_START de 2016-02-28-09.10.12.649592000000
são iguais ao value1 e são retornadas porque o horário de início de um período é incluído. As linhas
com um valor de coluna SYS_END de 2016-02-28-09.10.12.649592000000 são iguais a value1 e não são
retornadas porque o horário de encerramento de um período não é incluído.
|
Tabela 16. Resultado da consulta com FOR SYSTEM_TIME BETWEEN...AND especificado.
|
POLICY_ID
COVERAGE
|
A123
12000
|
C567
25000
|
|
B345
18000
|
|
Especificando os critérios de tempo usando o registro especial CURRENT TEMPORAL
SYSTEM_TIME:
|
|
|
Usar o registro especial CURRENT TEMPORAL SYSTEM_TIME para especificar o tempo AS OF para
uma consulta pode reduzir ou eliminar as mudanças que são necessárias para executar um aplicativo em
momentos diferentes.
|
|
|
|
|
|
|
Quando você tem um aplicativo que deseja executar em uma tabela temporal de período do sistema para
consultar o estado de seus dados para várias datas diferentes, é possível configurar a data em um registro
especial. Se você precisar consultar os dados a partir de hoje, desde o final do último trimestre ou a partir
da mesma data do ano passado, poderá não ser possível mudar o aplicativo para incluir especificações
AS OF para cada instrução SQL. Esta restrição é provavelmente o caso em que você está usando
aplicativos empacotados. Para abordar tais cenários, é possível usar o registro especial SYSTEM_TIME
TEMPORALCURRENT para configurar o registro de data e hora no nível da tarefa.
|
|
|
Configurar o registro especial SYSTEM_TIME TEMPORAL CURRENT não afeta as tabelas não temporais.
Apenas consultas em tabelas temporais com versionamento ativado usam o tempo definido no registro
especial. Não há impacto também nas instruções DDL.
|
|
|
Quando o registro especial CURRENT TEMPORAL SYSTEM_TIME é configurado como um valor não
nulo, os aplicativos que emitem uma consulta em qualquer tabela temporal de período do sistema retorna
dados a partir dessa data ou registro de data e hora.
|
|
|
|
|
|
Quando o registro especial CURRENT TEMPORAL SYSTEM_TIME é configurado como um valor não
nulo, as instruções de modificação de dados, como INSERT, UPDATE e DELETE na tabela temporal de
período do sistema são bloqueadas, porque, se o registro especial for configurado para algum momento
no passado, por exemplo, há cinco anos, então, permitir as operações de modificação de dados pode
resultar em mudanças em seus registros de dados históricos. Modificar a tabela de históricos não é
permitido.
Administração
17
|
|
|
|
|
|
|
|
Os comandos do pré-compilador CRTSQLxxx possuem uma opção sensível à hora do sistema, que indica
se as referências às tabelas temporais de período do sistema em instruções SQL estáticas e dinâmicas são
afetadas pelo valor do registro especial CURRENT TEMPORAL SYSTEM_TIME. Esse comportamento
pode também ser especificado para os programas SQL, procedimentos ou funções pela opção SYSTIME
na instrução SET OPTION. O padrão é *SYSTIME. Todos os programas SQL e programas de serviço que
foram criados antes do 7.3 são considerados *NOSYSTIME. Quando o valor for *SYSTIME, o registro
especial será aplicado às instruções que fazem referência às tabelas temporais de período do sistema.
Quando o valor for *NOSYSTIME, o registro especial será ignorado.
| Referências relacionadas:
| CURRENT TEMPORAL SYSTEM_TIME
| Exemplo: critérios de tempo especificados usando o registro especial CURRENT TEMPORAL SYSTEM_TIME:
| Essas consultas de amostra solicitam informações de política de uma tabela temporal de período do
| sistema para um momento específico, usando o registro especial CURRENT TEMPORAL SYSTEM_TIME.
| A tabela temporal POLICY_INFO e sua tabela de históricos associada que é usada nos exemplos são:
|
Tabela 17. Tabela temporal de período do sistema POLICY_INFO
|
POLICY_ID
COVERAGE
SYS_START
SYS_END
TS_ID
|
|
A123
12000
2015-01-3122.31.33.495925000000
9999-12-3000.00.00.000000000000
2015-01-3122.31.33.495925000000
|
|
|
C567
25000
2016-02-2809.10.12.649592000000
9999-12-3000.00.00.000000000000
2016-02-2809.10.12.649592000000
|
Tabela 18. Tabela de históricos HIST_POLICY_INFO
|
POLICY_ID
COVERAGE
SYS_START
SYS_END
TS_ID
|
|
C567
20000
2015-01-3122.31.33.495925000000
2016-02-2809.10.12.649592000000
2015-01-3122.31.33.495925000000
| B345
|
|
| v
18000
2015-01-3122.31.33.495925000000
2016-09-0112.18.22.959254000000
2015-01-3122.31.33.495925000000
|
|
|
|
|
|
|
|
|
|
|
|
Exemplo 1: Configure o registro especial CURRENT, TEMPORAL SYSTEM_TIME para um ano anterior
ao registro de data e hora. Suponha um registro de data e hora atual de 2016-05-1714.45.31.434235000000.
SET CURRENT TEMPORAL SYSTEM_TIME = CURRENT TIMESTAMP – 1 YEAR;
A consulta a seguir da tabela temporal de período do sistema retorna resultados a partir de um ano
atrás.
SELECT policy_id, coverage FROM policy_info;
Como POLICY_INFO é uma tabela temporal de período do sistema e o registro especial CURRENT
TEMPORAL SYSTEM_TIME não é nulo, a consulta é executada como:
SELECT policy_id, coverage FROM policy_info
FOR SYSTEM_TIME AS OF CURRENT TEMPORAL SYSTEM_TIME;
A instrução SELECT consulta as tabelas POLICY_INFO e HIST_POLICY_INFO, e retorna:
|
Tabela 19. Resultado de consulta com um registro especial configurado.
|
POLICY_ID
COVERAGE
|
A123
12000
|
C567
20000
|
|
B345
18000
18
IBM i: Administração de Banco de Dados
|
|
|
|
|
|
|
|
|
|
|
|
v
|
Tabela 20. Resultado de consulta com um registro especial configurado.
|
POLICY_ID
COVERAGE
|
A123
12000
|
C567
25000
|
|
|
|
|
|
|
|
|
|
|
|
B345
18000
|
|
|
|
Exemplo 2: Configure o registro especial CURRENT, TEMPORAL SYSTEM_TIME para um registro de
data e hora, e referencie uma tabela temporal de período do sistema nas definições de visualização.
CREATE VIEW coverage AS SELECT policy_id, coverage FROM policy_info;
SET CURRENT TEMPORAL SYSTEM_TIME = TIMESTAMP(’2016-02-28-09.10.12.649592000000’);
SELECT * FROM coverage;
Como a visualização faz referência a POLICY_INFO, que é uma tabela temporal de período do sistema, e
o CURRENT TEMPORAL SYSTEM_TIME está configurado, a referência de tabela na visualização
possui FOR SYSTEM_TIME AS OF CURRENT TEMPORAL SYSTEM_TIME implicitamente incluído nele. A
instrução SELECT consulta as tabelas POLICY_INFO e HIST_POLICY_INFO, e retorna:
v Exemplo 3: Configure o registro especial CURRENT TEMPORAL SYSTEM_TIME e faça referência a
uma tabela temporal de período do sistema em uma subseleção.
CREATE VIEW customer_policy AS SELECT * FROM customer_info
WHERE cust_policy_id IN (SELECT policy_id FROM policy_info);
SET CURRENT TEMPORAL SYSTEM_TIME = TIMESTAMP(’2016-02-28-09.10.12.649592000000’);
SELECT * FROM customer_policy;
A consulta neste exemplo envolve uma visualização em uma tabela não temporal de período do
sistema que faz referência a uma tabela temporal de período do sistema.
O registro especial CURRENT TEMPORAL SYSTEM TIME é aplicado a todas as tabelas temporais de
período do sistema em uma visualização. Ele é ignorado para qualquer outra referência de tabela. Para
esta consulta de uma visualização, FOR SYSTEM_TIME AS OF CURRENT TEMPORAL SYSTEM TIME é
implicitamente incluído na referência de tabela POLICY_INFO.
|
|
|
|
|
|
|
|
|
v Exemplo 4: Configure o registro especial e execute uma consulta que contém uma especificação de
período. Esta é uma consulta inválida.
|
Especifique os critérios de tempo para uma visualização:
|
|
|
|
Uma especificação de período A FOR SYSTEM_TIME que segue o nome de uma visualização em uma
referência de tabela se aplica a todas as referências de tabela temporal de período do sistema na definição
dessa visualização. Se a visualização não acessa nenhuma tabela temporal, a especificação do período não
entra em vigor na tabela de resultados da visualização.
|
|
Uma referência de visualização seguida por uma especificação de período não deve incluir uma função
externa que não seja NO SQL, ou uma função SQL que não seja capaz sequencialmente.
|
|
Para consultar uma visualização que faz referência a uma tabela temporal, use um dos seguintes
métodos:
|
|
v Especifique uma especificação de período SYSTEM_TIME seguindo o nome de uma visualização na
cláusula FROM de uma consulta.
SET CURRENT TEMPORAL SYSTEM_TIME = CURRENT TIMESTAMP - 1 YEAR;
SELECT * FROM policy_info FOR SYSTEM_TIME AS OF TIMESTAMP(’2016-02-28-09.10.12.649592000000’);
Um erro é retornado porque há várias especificações de período. O registro especial foi definido para
um valor não nulo e a consulta também especificou um horário. Quando a consulta usa uma cláusula
FOR SYSTEM_TIME, o registro especial CURRENT TEMPORAL SYSTEM_TIME deve ser o valor
NULL.
Administração
19
| v Use o registro especial CURRENT TEMPORAL SYSTEM_TIME. Neste caso, não se deve incluir uma
|
especificação de período na consulta.
| Exemple: critérios de tempo na visualização:
| Essas consultas de amostra solicitam informações de política a partir de uma visualização criada em uma
| tabela temporal de período do sistema.
| A tabela temporal POLICY_INFO e sua tabela de históricos associada que é usada nos exemplos são:
|
Tabela 21. Tabela temporal de período do sistema POLICY_INFO
|
POLICY_ID
COVERAGE
SYS_START
SYS_END
TS_ID
|
|
A123
12000
2015-01-3122.31.33.495925000000
9999-12-3000.00.00.000000000000
2015-01-3122.31.33.495925000000
|
|
|
C567
25000
2016-02-2809.10.12.649592000000
9999-12-3000.00.00.000000000000
2016-02-2809.10.12.649592000000
|
Tabela 22. Tabela de históricos HIST_POLICY_INFO
|
POLICY_ID
COVERAGE
SYS_START
SYS_END
TS_ID
|
|
C567
20000
2015-01-3122.31.33.495925000000
2016-02-2809.10.12.649592000000
2015-01-3122.31.33.495925000000
|
|
|
B345
18000
2015-01-3122.31.33.495925000000
2016-09-0112.18.22.959254000000
2015-01-3122.31.33.495925000000
|
|
|
|
|
|
|
|
|
|
Exemplo 1: crie uma visualização COVERAGE que faz referência à tabela temporal de período do sistema
POLICY_INFO. Em seguida, consulte a visualização e identifique uma especificação de período FOR
SYSTEM_TIME para retornar linhas que eram atuais a partir de um ano atrás. Suponha um registro de
data e hora atual de 2016-05-17-14.45.31.434235000000.
CREATE VIEW coverage AS
SELECT policy_id, coverage
FROM policy_info;
SELECT * FROM coverage
FOR SYSTEM_TIME AS OF CURRENT TIMESTAMP - 1 YEAR;
| A instrução SELECT consulta as tabelas POLICY_INFO e HIST_POLICY_INFO, e retorna:
|
Tabela 23. Resultado da consulta de uma visualização que tem uma especificação de período.
|
POLICY_ID
COVERAGE
|
A123
12000
|
C567
20000
|
|
B345
18000
| Exemplo 2: crie uma visualização COVERAGE que faz referência a uma tabela temporal de período do
| sistema POLICY_INFO e retorna linhas que eram atuais a partir de um ano atrás.
| CREATE VIEW coverage AS
|
SELECT policy_id, coverage
|
FROM policy_info
|
FOR SYSTEM_TIME AS CURRENT TIMESTAMP - 1 YEAR;
|
| SELECT * FROM coverage;
| A consulta dessa visualização sempre retorna linhas que eram atuais A PARTIR DE um ano atrás.
| Assumindo um registro de data e hora atual de 2016-05-17-14.45.31.434235000000, a consulta retorna os
| mesmos resultados que os resultados que foram retornados no exemplo um.
20
IBM i: Administração de Banco de Dados
|
|
|
|
Restrições ao inserir, atualizar ou excluir dados em uma tabela temporal de
período do sistema
|
Restrições para cursores e UPDATE/DELETE WHERE CURRENT OF
|
|
|
|
|
|
Um cursor FOR UPDATE não pode ser definido se inclui uma especificação de período na tabela
identificada na cláusula FROM. O exemplo a seguir retorna um erro:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Se a cláusula FOR UPDATE for removida da instrução DECLARE CURSOR e uma especificação de
período for definida, o cursor se tornará somente leitura. Se uma instrução UPDATE WHERE CURRENT
OF ou DELETE WHERE CURRENT OF for usada para tentar atualizar ou excluir linhas na tabela
temporal de período do sistema e sua tabela de históricos associada, um erro será retornado. O exemplo a
seguir retorna um erro:
|
|
|
|
A atualização retorna um erro porque ela implicitamente tenta atualizar linhas do tempo. A instrução
SELECT consulta explicitamente a tabela POLICY_INFO e consulta implicitamente sua tabela de históricos
associada, HIST_POLICY_INFO. As linhas em uma tabela de históricos que são acessadas implicitamente não
podem ser atualizadas.
|
Restrições para inserir, atualizar e excluir dados em uma visualização
|
|
|
|
|
|
|
Inserções, atualizações e exclusões não são permitidas em relação a uma visualização que tem uma
especificação de período definida. Por exemplo, a instrução UPDATE a seguir retornaria um erro:
|
|
|
|
|
|
|
|
|
|
|
|
|
A atualização retorna um erro porque ela implicitamente tenta atualizar linhas do tempo. No entanto, é
possível criar, em vez disso, um acionador de atualização para atualizar a tabela temporal de período do
sistema. Exemplo:
|
|
Um erro não será retornado porque o acionador direciona a atualização para a tabela temporal de
período do sistema, em vez de direcionar para a visualização.
Uma inserção, atualização ou exclusão não pode ser feita quando a inserção, atualização ou exclusão
tentar mudar implicitamente as linhas do tempo.
DECLARE updateCursor CURSOR FOR
SELECT coverage
FROM policy_info FOR SYSTEM_TIME AS OF ’2015-01-31-22.31.33.495925000000’
FOR UPDATE;
CREATE OR REPLACE PROCEDURE updateProc
LANGUAGE SQL
BEGIN
DECLARE val1 INTEGER;
DECLARE updateCursor CURSOR FOR
SELECT coverage
FROM policy_info FOR SYSTEM_TIME AS OF ’2015-01-31-22.31.33.495925000000’;
OPEN updateCursor;
FETCH updateCursor INTO val1;
UPDATE policy_info SET coverage = coverage + 1000
WHERE CURRENT OF updateCursor;
CLOSE updateCursor;
END;
CREATE VIEW coverage AS
SELECT policy_id, coverage
FROM policy_info FOR SYSTEM_TIME AS OF TIMESTAMP(’2016-02-28-09.10.12.649592000000’);
UPDATE coverage SET coverage = coverage + 1000 WHERE policy_id = ’C567’;
CREATE TRIGGER coverage_update_iot INSTEAD OF UPDATE ON coverage
REFERENCING NEW AS N OLD AS O
FOR EACH ROW MODE DB2SQL
BEGIN
UPDATE policy_info
SET policy_id = n.policy_id, coverage = n.coverage
WHERE policy_id = o.policy_id AND coverage = o.coverage;
END;
UPDATE coverage SET coverage = coverage + 1000 WHERE policy_id = ’C567’;
Administração
21
| Considerações de E/S nativa com uma tabela temporal de período do sistema
| O processamento de E/S nativo de operações de leitura, gravação e atualização é, em geral, semelhante
| às operações SQL correspondentes. No entanto, há algumas considerações para se ter em mente.
|
|
|
|
|
|
|
|
|
|
|
As operações de atualização e exclusão nativas e de SQL relacionadas a uma tabela temporal de período
do sistema fazem com que as linhas do tempo sejam incluídas em uma tabela de históricos. Além disso,
se a cláusula ON DELETE ADD EXTRA ROW for especificada no comando ALTER TABLE, as operações
de exclusão de SQL e nativa incluirão uma linha extra quando um registro for excluído da tabela. Da
mesma forma, o valor QAQQINI para SYSTIME_PERIOD_ADJ tem o mesmo efeito sobre atualizações
simultâneas nativas, pois ele tem operações SQL de atualização simultâneas. Para nativo e SQL, o valor
QAQQINI faz com que o banco de dados crie um erro ou ajuste aos registros de data e hora de tempo
inicial e tempo final. Um aplicativo do DB nativo recebe uma exceção CPF503B, código de razão 3,
quando o valor SYSTIME_PERIOD_ADJ está definido como *DEFAULT ou *ERROR, e um UPDATE
nativo fará com que o valor do horário de encerramento da linha do tempo seja definido para um valor
que é menor que o horário inicial da linha do tempo.
| Dito isso, várias diferenças entre o processamento nativo e de SQL merecem atenção.
|
|
|
|
|
|
Enquanto as solicitações de leitura nativas trabalham em relação à tabela temporal e de históricos, elas
não mesclam os resultados. Apenas os registros do arquivo lido são retornados. Por exemplo, quando o
registro especial CURRENT TEMPORAL SYSTEM_TIME é configurado como um valor não nulo, uma
leitura de SQL da tabela temporal pode retornar as linhas que são desenhadas a partir da tabela temporal
e sua tabela de históricos correspondente. No entanto, para uma leitura nativa da tabela temporal, o
banco de dados ignora o registro especial e retorna valores apenas da tabela temporal.
|
|
|
|
|
Quando o registro especial CURRENT TEMPORAL SYSTEM_TIME é configurado como um valor não
nulo, a instruções SQL Data Manipulation (DML) falham com SQLCODE/SQLSTATE configurado como
-20535/51046. Um usuário SQL é incapaz de modificar os dados da tabela temporal. No entanto,
nenhuma restrição semelhante existe para um usuário nativo. As operações de gravação, atualização e
exclusão nativas modificam a tabela temporal se o registro especial estiver configurado ou não.
|
|
|
|
Finalmente, uma gravação ou atualização nativa pode especificar valores no buffer de E/S das colunas
geradas do período SYSTEM_TIME e outras colunas geradas, se existirem. No entanto,
independentemente de quais valores são fornecidos no buffer de E/S, o DB2 for i substitui os valores
corretos para quaisquer colunas geradas.
|
|
|
|
Mantendo a tabela de históricos
|
|
|
|
|
É necessário compreender o valor de suas linhas individuais. Algum conteúdo, como contratos do cliente,
pode ser intocável, nunca podendo ser excluído. Outros registros, como informações do visitante do
website, podem ser removidos sem preocupação. Muitas vezes não é a idade de uma linha que determina
quando ela pode ser removida e arquivada, em vez disso, uma lógica de negócios que é o fator decisivo.
A lista a seguir contém algumas regras possíveis para remoção:
Como as tabelas de históricos passam por mais inserções que exclusões, suas tabelas de históricoss
podem se tornar grandes. Decidir como remover suas tabelas de históricos para livrar-se das linhas que
não são mais necessárias pode ser uma tarefa complexa.
| v Remover linhas que são selecionadas por uma consulta fornecida pelo usuário, que reflete as regras de
|
negócios.
| v Remover linhas mais antigas do que uma certa idade.
| v Remover linhas do tempo quando mais de N versões existirem para esse registro (reter apenas as N
|
versões mais recentes).
| v Remover linhas do tempo quando o registro é excluído da tabela temporal do período de sistema
|
associada (quando versões atuais não existirem).
22
IBM i: Administração de Banco de Dados
|
|
|
|
Existem várias maneiras de remover dados antigos periodicamente a partir de uma tabela de históricos.
Uma maneira de remover dados é o particionamento de intervalo na tabela de históricos. Partições
antigas podem, então, ser removidas da tabela de históricos e arquivadas ou excluídas. Para obter mais
informações, consulte Particionando uma tabela temporal de período do sistema.
|
|
|
|
Particionando uma tabela temporal de período do sistema
|
|
Quando o versionamento está ativado, os seguintes comportamentos são aplicados ao conectar ou
desconectar uma partição a uma tabela temporal de período do sistema:
|
Conectando partições
|
|
v Em uma partição única, a tabela particionada pode ser conectada a uma tabela temporal de período do
sistema como uma partição enquanto o versionamento está ativado.
|
|
|
v A tabela conectada deve ter as mesmas definições de coluna que a tabela temporal de período do
sistema, incluindo as três colunas de registro de data e hora definidas como ROW BEGIN, ROW END
e START TRANSACTION ID.
|
v A tabela conectada não requer uma definição de período SYSTEM_TIME.
|
Desconectando partições
|
|
|
|
|
v Uma partição não pode ser desconectada de uma tabela temporal de período do sistema enquanto o
versionamento estiver ativado. É possível eliminar o versionamento e, em seguida, desconectar uma
partição da tabela base. A partição desconectada se torna uma partição única independente, tabela
particionada. Desconectar uma partição de uma tabela de históricos não requer que você elimine o
versionamento.
|
|
v Uma partição desconectada retém todas as três colunas de registro de data e hora (ROW BEGIN, ROW
END e START TRANSACTION ID), mas não a definição do período SYSTEM_TIME.
|
Referências relacionadas:
|
tabelas particionadas
|
|
|
|
Controle de acesso de linha e coluna com uma tabela temporal de período do
sistema
|
|
|
|
|
|
|
|
O controle de acesso de linha e coluna (RCAC) é uma camada de segurança de dados que controla o
acesso a uma tabela no nível de linha, nível de coluna, ou ambos. O RCAC pode ser aplicado às tabelas
temporais de período do sistema e às tabelas de históricos. Quando o RCAC é ativado para uma tabela
temporal de período do sistema, o gerenciador do banco de dados ativa automaticamente o controle de
acesso de linha na tabela de históricos e cria uma permissão de linha padrão para a tabela de históricos.
Esta permissão de linha padrão impede qualquer acesso direto à tabela de históricos. Quando a tabela de
históricos é protegida pela permissão de linha padrão, as atualizações e exclusões ainda geram linhas do
tempo na tabela de históricos.
|
|
|
|
|
|
Quando uma consulta temporal é executada com relação a uma tabela temporal de período do sistema, as
permissões de linha e as máscaras de coluna da tabela temporal de período do sistema também são
aplicadas às linhas retornadas da tabela de históricos. Por exemplo, se uma permissão de linha é definida
para uma tabela temporal de período do sistema e uma consulta com uma cláusula FOR SYSTEM_TIME AS
OF é executada, ambas as linhas atuais e do tempo são retornadas quando a linha atual ou do tempo
satisfaz a regra RCAC da tabela temporal e era atual desde o horário especificado.
Uma tabela temporal de período do sistema pode ter seus dados da tabela divididos em várias partições.
Uma tabela de históricos que está associada a uma tabela temporal de período do sistema também pode
ser particionada.
O controle de acesso de linha e coluna pode ser definido em uma tabela temporal de período do sistema
e sua tabela de históricos associada.
Administração
23
|
|
|
|
|
|
|
|
Se a tabela de históricos possui apenas uma permissão padrão, não será possível consultá-la diretamente.
No entanto, se uma regra de linha ou coluna diferente da permissão padrão também estiver definida na
tabela de históricos, essa regra será aplicada quando a tabela de históricos for acessada diretamente.
Portanto, se você precisar consultar a tabela de históricos diretamente, será possível criar uma permissão
de linha ou máscara de coluna na tabela de históricos que corresponde à permissão de linha ou máscara
que foi criada na tabela temporal de período do sistema. Quando a permissão de linha ou máscara de
coluna é criada, é possível consultar a tabela de históricos diretamente enquanto também controla o
acesso aos dados.
| Para obter mais informações sobre o RCAC, consulte Controle de acesso de linha e coluna (RCAC).
| Salvando e restaurando as tabelas temporais de período do sistema
| A tabela temporal de período do sistema e sua tabela de históricos devem ser explicitamente salvas. O
| gerenciador do banco de dados não salva os dois arquivos quando apenas um dos arquivos está salvo.
|
|
|
|
|
|
|
|
|
Quando uma tabela temporal de período do sistema é restaurada sem a sua tabela de históricos
correspondente, ou uma tabela de históricos é restaurada sem sua tabela temporal de período do sistema
correspondente, o relacionamento de versionamento da tabela restaurada permanece definido, mas não
está estabelecido. Quando isso acontece, o status do versionamento da tabela é mudado para o estado
definido. Uma mensagem informativa CPI3231 é emitida quando um status do versionamento da tabela
temporal de período do sistema é mudado para o estado definido. Há restrições para as ações que podem
ser executadas em uma tabela temporal de período do sistema ou uma tabela de históricos quando a
tabela está no estado definido. Inserções, atualizações e exclusões são evitadas. A maioria das mudanças
de DDL também são evitadas. As únicas operações que são permitidas são:
| v ALTER TABLE ADD VERSIONING
| v ALTER TABLE DROP VERSIONING
| v DROP TABLE
|
|
|
|
|
|
|
Para determinar se uma tabela temporal de período do sistema está no estado definido, é possível
consultar a visualização de catálogo QSYS2/SYSPERIODS. Para determinar se uma tabela de históricos
está no estado definido, é possível consultar a visualização de catálogo QSYS2/SYSHISTORYTABLES.
Ambas as visualizações possuem a coluna VERSIONING_STATUS, que contém um 'E' se um
relacionamento de versionamento entre a tabela temporal de período do sistema e a tabela de históricos
foi estabelecido, ou um 'D' se um relacionamento de versionamento entre a tabela temporal de período
do sistema e a tabela de históricos foi definido, mas não estabelecido.
| Para obter mais informações, consulte Salvando arquivos físicos que são temporais e Restaurando
| arquivos físicos que são temporais.
|
|
|
|
Usando catálogos para localizar informações sobre a tabela temporal de período
do sistema
Há várias visualizações de catálogo que contêm informações sobre a tabela temporal de período do
sistema.
| v QSYS2/SYSTABLES
|
|
|
Contém uma coluna denominada TEMPORAL_TYPE. Quando o valor é configurado como “S”, a tabela é
uma tabela temporal de período do sistema. Quando ele for configurado como “H”, a tabela é uma
tabela de históricos. O valor “N” é usado para todas as outras tabelas.
| v QSYS2/SYSCOLUMNS
|
Contém uma coluna chamada HAS_DEFAULT. Esta coluna indica o tipo de coluna gerada.
| v QSYS2/SYSPERIODS
|
|
Contém uma linha para cada tabela com um período do sistema e identifica as informações
temporárias e de versão.
| v QSYS2/SYSHISTORYTABLES
24
IBM i: Administração de Banco de Dados
|
Contém uma linha para cada tabela de históricos.
|
|
Restrições da tabela temporal
|
A seguir estão as restrições para tabelas temporais de período do sistema:
|
|
|
v A tabela temporal de período do sistema e sua tabela de históricos devem estar no mesmo esquema.
v Para atualizar ou excluir dados de uma tabela temporal de período do sistema com versionamento,
tanto a tabela temporal como seu arquivo histórico devem ser registrados.
|
|
v As instruções SQL ALTER ou CREATE OR REPLACE TABLE que causam uma perda potencial de
dados não são suportadas em tabelas temporais de período do sistema.
|
v As operações a seguir não são permitidas para tabelas temporais de período do sistema:
As tabelas temporais de período do sistema estão sujeitas a várias restrições.
|
– ALTER TABLE DROP COLUMN
|
– ALTER TABLE ADD GENERATED COLUMN
|
v A instrução TRUNCATE não é suportada em relação a uma tabela temporal de período do sistema.
|
|
|
v Uma tabela distribuída também não pode ser uma tabela temporal de período do sistema.
v As seguintes operações de consulta não são permitidas em relação a uma tabela temporal de período
do sistema:
|
|
|
– Uma especificação de período não pode ser feita dentro de uma consulta que faz referência a uma
tabela distribuída, uma tabela com um acionador de leitura, que usa a sequência de classificação do
ICU 2.6.1, ou se tiver mais de 1000 referências de tabela.
|
– Uma especificação de período não pode ser feita para um arquivo lógico nativo.
|
|
– Uma especificação de período não pode ser feita para uma tabela ou visualização que faz referência
a uma coluna em uma função CONTAINS ou SCORE.
|
|
|
– Uma especificação de período não pode ser feita para uma visualização em que a definição da
visualização inclui uma função externa que não seja NO SQL ou uma função SQL que não seja
capaz sequencialmente.
Trabalhando com Acionadores e Restrições
Você pode utilizar acionadores ou restrições para gerenciar dados nas tabelas de bancos de dados.
Um acionador é um tipo de programa que é chamado automaticamente sempre que uma ação especificada
é executada em uma tabela específica. Os acionadores são úteis para manter as trilhas de auditoria,
detectar condições excepcionais, manter relacionamentos no banco de dados e executar aplicativos e
operações que coincidem com a operação de alteração.
|
|
|
|
Como alternativa, as colunas geradas podem ser utilizadas em vez de um acionador manter informações
de auditoria. Para obter mais informações sobre como utilizar as colunas geradas para auditoria, consulte
“Usando uma tabela temporal de período do sistema para controlar informações de auditoria” na página
12.
Uma restrição é uma restrição ou limitação colocada no banco de dados. As restrições são implementadas
no nível da tabela. Você pode utilizar as restrições para criar integridade de referência no banco de dados.
Você pode trabalhar com acionadores e restrições utilizando o IBM Navigator for i, o SQL ou a interface
de sistema tradicional.
Conceitos relacionados:
Tarefas de Banco de Dados do Navegador do System i
Gravando Programas do DB2
O DB2 for i fornece vários métodos para gravação de aplicativos que acessam ou atualizam dados.
Administração
25
Você pode gravar programas de SQL incorporados, funções externas, procedimentos externos, aplicativos
CLI do DB2 for i e programas do acionador.
Conceitos relacionados:
Programação de SQL Integrada
Gravando um DB2 para Aplicativo CLI do i5/OS
Tarefas relacionadas:
Criando Programas do Acionador
Referências relacionadas:
Definindo um Procedimento Externo
Gravando UDFs como Funções Externas
Backup e Recuperação do Banco de Dados
Salvar os dados podem exigir tempo e requer disciplina. Entretanto, é crucial fazer o backup dos dados,
pois nunca se sabe quando será necessário fazer uma recuperação deles.
Conceitos relacionados:
Backup e Recuperação
Gerenciamento de Diário
Recuperando e Restaurando seu Banco de Dados
Administração de Banco de Dados Distribuída
Com o DB2 for i, você pode trabalhar com bancos de dados que são distribuídos entre vários sistemas.
Conceitos relacionados:
Programação do Banco de Dados Distribuído
Consultas e Relatórios
Você pode utilizar o SQL, o comando Abrir Arquivo de Consulta (OPNQRYF), a API de Consulta
(QQQQRY), o Open Database Connectivity (ODBC) ou o programa licenciado IBM Query for i para criar
e executar consultas.
Uma das tarefas mais comuns executadas com o banco de dados é a recuperação de informações. O
sistema fornece vários métodos para criar e executar consultas e relatórios.
Você pode utilizar uma instrução SQL para recuperar informações. Essa instrução SQL é chamada query.
A consulta faz procuras nas tabelas armazenadas no banco de dados para localizar a resposta à pergunta
enviada com a instrução SQL. A resposta é expressa como um conjunto de linhas, conhecido como
conjunto de resultados. Após a execução de uma consulta, você também pode criar um relatório para
exibir os dados fornecidos no conjunto de resultados.
Além disso, para utilizar o SQL, você pode utilizar outras funções e produtos para criar e executar
consultas e relatórios. Consulte as seguintes informações para obter detalhes.
v Visão Geral do IBM DB2 Web Query para IBM i
v Consulta para IBM i
v Query Management Programming
v Query Manager Use
26
IBM i: Administração de Banco de Dados
Além disso, você pode construir as instruções SQL SELECT, INSERT, UPDATE e DELETE na janela
Assistente de SQL do System i Navigator.
Conceitos relacionados:
Programação de SQL
Tarefas relacionadas:
Construindo Instruções SQL com o Assistente de SQL
Referências relacionadas:
comando Abrir Arquivo de Consulta (OPNQRYF)
API de Consulta (QQQQRY)
Segurança
Autorizar os usuários a dados no sistema e a níveis de dados permite controlar o acesso ao banco de
dados.
A proteção de banco de dados requer que você estabeleça o direito à propriedade e a autoridade pública
aos objetos e à autoridade específica para os aplicativos.
Conceitos relacionados:
Programas de Saída do Controle de Acesso do Servidor DRDA
Concedendo Autoridade de Arquivo e dos Dados
Limitando Acesso a Campos Específicos em um Arquivo de Banco de Dados
Segurança
Especificando Autoridade Pública
Utilizando Recursos de Arquivo de Banco de Dados para Controlar as Operações de E/S
Utilizando Arquivos Lógicos para Proteger os Dados
Opções de Autoridade para Análise e Ajuste de SQL
Este tópico descreve as opções de autoridade para análise e ajuste de SQL.
O DB2 for i possui um rico conjunto de comandos, procedimentos armazenados, APIs e ferramentas para
análise e ajuste dos aspectos de desempenho dos aplicativos de banco de dados. Anteriormente, um
responsável pela segurança do sistema precisaria conceder autoridade especial de usuário *JOBCTL para
possibilitar que analistas e administradores de banco de dados utilizassem as ferramentas de banco de
dados. Como a autoridade *JOBCTL permite que um usuário altere muitas configurações críticas do
sistema que não estão relacionadas à atividade do banco de dados, não era uma decisão fácil para os
responsáveis pela segurança conceder esta autoridade. Em alguns casos, esta era uma decisão fácil e
*JOBCTL não era concedido aos analistas de banco de dados, proibindo assim o uso do conjunto integral
das ferramentas de banco de dados.
Nota: Para obter mais informações sobre substituições de configuração para o arquivo QAQQINI,
consulte o link a seguir: Suporte para Substituição do Arquivo QAQQINI.
Agora, o responsável pela segurança possui a capacidade adicional de autorizar o acesso às ferramentas
de análise de banco de dados e ao Cache de Planos SQL. O DB2 for i que aproveita a vantagem da
capacidade de uso da função disponível no sistema operacional. Um novo grupo de uso da função
chamado QIBM_DB foi criado com os IDs de função no grupo QIBM_DB:
1. QIBM_DB_SQLADM (tarefas do Administrador de Banco de Dados)
2. QIBM_DB_SYSMON (tarefas de Informações do Banco de Dados)
3. QIBM_DB_DDMDRDA (Acesso de Servidor de Aplicativos DDM & DRDA)
4. QIBM_DB_ZDA (Acesso de Servidor de Aplicativos da Caixa de Ferramentas)
Administração
27
5. QIBM_DB_SECADM (Administrador de Segurança de Banco de Dados)
O responsável pela segurança agora tem a flexibilidade para conceder autoridades: conceder a autoridade
especial *JOBCTL ou autorizar um usuário ou grupo para a Função de Administrador de Banco de Dados
do IBM i através de Administração de Aplicativos no System i Navigator do IBM Navigator for i. O
comando Change Function Usage (CHGFCNUSG), com um ID de função de QIBM_DB_SQLADM,
também pode ser utilizado para alterar a lista de usuários que têm permissão para executar operações de
Administração de Banco de Dados. Os controles de uso de função permitem que grupos ou usuários
específicos tenham a autoridade permitida ou negada. O comando CHGFCNUSG também fornece um
parâmetro que pode ser utilizado para conceder autoridade de uso de função para qualquer usuário que
possua a autoridade especial de usuário *ALLOBJ. (por exemplo, ALLOBJAUT(*USED))
A função Administrador de Banco de Dados é necessária sempre que um usuário está analisando e
visualizando dados de desempenho de SQL. Algumas das funções mais comuns são a exibição de
instruções do Cache de Planos SQL, a análise dos Monitores de Desempenho de SQL e de Capturas
Instantâneas do Cache de Planos SQL e a exibição dos detalhes de SQL de uma tarefa que não a sua
própria.
O uso da função de administrador de banco de dados é uma alternativa para a concessão de *JOBCTL,
mas ela não substitui o requisito de possuir a autoridade de objeto correta. Para ativar tarefas do
administrador de banco de dados que não estão relacionadas à análise de desempenho, consulte a tarefa
específica para obter detalhes sobre os requisitos de autorização. Por exemplo, para permitir que um
administrador reorganize uma tabela, é necessário que ele tenha autoridades de objeto concedidas, que
não são cobertas pelo QIBM_DB_SQLADM.
Além do QIBM_DB_SQLADM, o comando Change Function Usage (CHGFCNUSG), com um ID de
função de QIBM_DB_SYSMON, também pode ser utilizado para alterar a lista de usuários que têm
permissão para executar operações de Informações do Banco de Dados.
A função Informações do Banco de Dados fornece muito menos autoridade do que a de Administrador
de Banco de Dados. O uso principal é permitir que um usuário examine propriedades de banco de dados
de alto nível. Por exemplo, um usuário que não possui *JOBCTL ou QIBM_DB_SQLADM, poderia ter
permissão para visualizar as propriedades do Cache de Planos SQL se recebesse a concessão de
autoridade para QIBM_DB_SYSMON.
Para trabalhar com o uso da função de grupo de bancos de dados QIBM_DB do System i Navigator, siga
estas etapas:
1. Ative Application Administration, conforme mostrado na figura 1.
2. Expanda as pastas ‘IBM i' e ‘Database' sob a guia Host Applications, conforme mostrado na figura 2.
3. Customize o uso da função Database Administrator (QIBM_DB_SQLADM), conforme mostrado na
figura 3.
Neste exemplo, o responsável pela segurança determinou que desejava configurar um grupo denominado
Dbagroup que conteria todos os usuários para os quais desejava fornecer este nível de autoridade. E ele
desejou explicitamente negar o acesso para Slfuser. Agora, o responsável pela segurança possui um local
conveniente e facilmente monitorado para visualizar e autorizar usuários a estas funções.
Figura 1. Ative Application Administration.
28
IBM i: Administração de Banco de Dados
Figura 2. Expanda o grupo Database
Administração
29
Figura 3. Altere as configurações de uso da função QIBM_DB_SQLADM
30
IBM i: Administração de Banco de Dados
A Tabela 1 descreve algumas das mudanças de autorização relacionadas aos comandos, Procedimentos
Armazenados e APIs do DB2.
Tabela 24. Requisitos de Autorização para Desempenho e Análise do Banco de Dados
Ação do Usuário
*JOBCTL
Sem
QIBM_DB_SQLADM QIBM_DB_SYSMON Autoridade
SET CURRENT DEGREE (instrução
SQL)
Permitido
Permitido
Não Permitido
Não Permitido
Comando CHGQRYA objetivando uma Permitido
tarefa de um usuário diferente
Permitido
Não Permitido
Não Permitido
Comandos STRDBMON ou
ENDDBMON objetivando uma tarefa
de um usuário diferente
Permitido
Permitido
Não Permitido
Não Permitido
Comandos STRDBMON ou
ENDDBMON objetivando uma tarefa
que corresponde ao usuário atual
Permitido
Permitido
Permitido
Permitido
API QUSRJOBI() formato 900 ou
Detalhes SQL do System i Navigator
para a Tarefa
Permitido
Permitido
Permitido
Não Permitido
Administração
31
Tabela 24. Requisitos de Autorização para Desempenho e Análise do Banco de Dados (continuação)
Ação do Usuário
*JOBCTL
Sem
QIBM_DB_SQLADM QIBM_DB_SYSMON Autoridade
Procedimento DUMP PLAN CACHE
PROPERTIES
Permitido
Permitido
Permitido
Não Permitido
Visual Explain dentro de Executar
Scripts SQL
Permitido
Permitido
Permitido
Permitido
Visual Explain fora de Executar Scripts Permitido
SQL
Permitido
Não Permitido
Não Permitido
Procedimento ANALYZE PLAN
CACHE
Permitido
Permitido
Não Permitido
Não Permitido
Procedimento DUMP PLAN CACHE
Permitido
Permitido
Não Permitido
Não Permitido
Procedimento MODIFY PLAN CACHE Permitido
Permitido
Não Permitido
Não Permitido
Procedimento MODIFY PLAN CACHE Permitido
PROPERTIES (atualmente não verifica
a autoridade)
Permitido
Não Permitido
Não Permitido
Procedimento CHANGE PLAN
CACHE SIZE (atualmente não verifica
a autoridade)
Permitido
Permitido
Não Permitido
Não Permitido
Procedimento START PLAN CACHE
EVENT MONITOR
Permitido
Permitido
Não Permitido
Não Permitido
Procedimento END PLAN CACHE
EVENT MONITOR
Permitido
Permitido
Não Permitido
Não Permitido
Procedimento END ALL PLAN
CACHE EVENT MONITORS
Permitido
Permitido
Não Permitido
Não Permitido
Row and Column Access Control (RCAC)
O Row and column access control (RCAC) fornece uma alternativa centralizada em dados para atingir a
segurança de dados.
O RCAC coloca o controle de acesso no nível da tabela em torno de si mesmo. As regras SQL criadas em
linhas e colunas são a base da implementação deste recurso.
Termos do RCAC
v Tabela base - A tabela (arquivo físico), a permissão ou máscara é incluída.
v Objeto dependente - Qualquer referência a objeto (arquivo, esquema, função ou outro objeto),
permissão ou máscara.
v QIBM_DB_SECADM – O uso da função identifica o usuário que deve estar autorizado para manipular
todas as ações relacionadas a permissões e máscaras.
v Row and Column Access Control (RCAC) – O controle de acesso é o recurso para controlar o acesso
aos dados usando permissões e máscaras.
v Permissão - Uma permissão de linha define uma regra de controle de acesso de linha para linhas de
uma tabela.
v Máscara - Uma máscara de coluna define uma regra de controle de acesso da coluna para uma coluna
específica em uma tabela.
v RULETEXT – A expressão a ser usada pela permissão ou máscara.
v 5770-SS1 IBM Advanced Data Security for i (Opção 47) – O produto que precisa ser solicitado e
instalado para poder:
– criar permissões de linha.
32
IBM i: Administração de Banco de Dados
– criar máscaras de coluna.
– executar acesso ao banco de dados por meio de objetos que têm RCAC ativo.
Visão Geral
IBM Advanced Data Security for i apresenta RCAC como uma camada extra de segurança de dados.
O RCAC fornece controle de acesso a uma tabela no nível baixo, nível da coluna ou ambos. O RCAC
pode ser usado para complementar o modelo de privilégios da tabela. Para estar em conformidade com
vários regulamentos do governo, é possível implementar procedimentos e métodos para assegurar que as
informações estejam protegidas adequadamente. Os indivíduos em sua organização têm acesso permitido
a somente o subconjunto de dados que é necessário para executar suas atividades de trabalho. Por
exemplo, os regulamentos do governo em sua área podem declarar que um médico está autorizado a
visualizar os registros médicos de seus próprios pacientes, mas não de outros pacientes. Os mesmos
regulamentos também podem declarar que, a menos que um paciente dê seu consentimento, um
provedor de assistência médica não terá acesso permitido a informações pessoais do paciente, como o
número do telefone residencial dos pacientes. É possível usar o RCAC para assegurar que seus usuários
só tenham acesso aos dados necessários para seu trabalho. Por exemplo, o RCAC pode filtrar informações
e dados do paciente para incluir somente esses dados, que um determinado médico está autorizado a
visualizar.
Outros pacientes não existem até onde sabe o médico. Da mesma forma, quando um representante de
serviço do paciente consulta a tabela do paciente no mesmo hospital, ele pode visualizar as colunas nome
do paciente e número de telefone, mas a coluna histórico médico é mascarada para eles. Se os dados
forem mascarados, um valor NULL ou alternativo será exibido em vez de o histórico médico real. O
RCAC possui as vantagens a seguir:
1. Nenhum usuário do banco de dados está isento inerentemente das regras do RCAC. Mesmo
autoridades de alto nível, como usuários com toda a autoridade de objeto (autoridade especial (como
*ALLOBJ)) não estão isentos dessas regras. Somente usuários com a autoridade QIBM_DB_SECADM
podem gerenciar o RCAC em um banco de dados. Portanto, é possível usar o RCAC para impedir
que os usuários com autoridade de objeto total acessem todos os dados em um banco de dados.
2. Os dados da tabela são protegidos independentemente de como uma tabela é acessada. Aplicativos,
ferramentas de consulta e de geração de relatórios improvisadas estão todas sujeitas às regras de
controle de acesso. A execução é centralizada nos dados.
3. Nenhuma mudança de aplicativo é necessária para aproveitar esta camada adicional de segurança de
dados. O RCAC é estabelecido e definido de modo que não fica aparente aos aplicativos existentes.
Entretanto, o RCAC representa uma mudança importante no paradigma no sentido de que não é mais
o que está sendo perguntado, mas sim quem perguntou. Mesmo que dois usuários possam executar o
que parece serem consultas idênticas, quando predicados de permissão de linha são incluídos na
consulta, esses dois usuários podem observar um conjunto de resultados diferente. Este
comportamento é o intento exato da solução. Significa que os editores de telas e DBAs devem estar
cientes de que as consultas não veem toda a imagem em termos de dados na tabela a menos que a
autorização ao RCAC seja concedida.
4. Antes dos controles do RCAC para a proteção de dados centralizada em dados, os usuários do DB2
for i protegeriam os dados por meio da criação de várias visualizações SQL ou arquivos lógicos
Select-omit. Embora esta técnica de confiar em uma visualização/arquivo lógico para limitar dados
atinja o objetivo, ela cria vários problemas:
a. Os aplicativos tinham de ser copiados para funcionar com visualizações especializadas, em vez de
um objeto comum.
b. Em grandes instalações, o número de visualizações que existem para este propósito cresce
rapidamente para um número grande, resultando em considerações de gerenciamento de objetos
adicional como Salvar/Restaurar.
c. O responsável pela segurança tem de passar um tempo ajustando autorizações para muitos
objetos.
Administração
33
d. Para arquivos lógicos select-omit, o DB2 for i tem de gastar ciclos de processamento para manter
cada arquivo lógico select-omit atualizado conforme o(s) objeto(s) subjacente(s) muda(m).
Além de atingir os benefícios dos dados naturalmente protegidos ao implementar o RCAC, os clientes do
DB2 for i podem aposentar as muitas visualizações que existem unicamente para proteger dados.
IBM Advanced Data Security for i
IBM Advanced Data Security for i é uma opção instalável que é usada para gerenciar políticas de
segurança reforçando o RCAC com permissões e máscaras.
Se o IBM Advanced Data Security for i não estiver instalado, consulte Instalando, Fazendo Upgrade ou
Excluindo o IBM i/OS® e Software Relacionado para obter informações sobre instalar programas
licenciados extra. Para instalar o IBM Advanced Data Security for i, use a opção 47 na lista de opções
instaláveis para o sistema operacional.
Tabelas que contêm permissões ou máscaras ativadas do RCAC podem ser restauradas
independentemente se o IBM Advanced Data Security for i está instalado ou não. Entretanto, se a opção
não estiver instalada, as permissões e máscaras não poderão ser criadas e as tabelas, visualizações ou
índices que contêm permissões ou máscaras ativas não poderão ser acessados.
Separação de Obrigações
A separação de obrigações ajuda as empresas a estarem em conformidade com os regulamentos do
mercado ou requisitos organizacionais e simplifica o gerenciamento de autoridades. A separação de
obrigações geralmente é usada para impedir atividades fraudulentas ou erros por uma única pessoa. Ela
fornece a capacidade para que funções administrativas sejam divididas entre indivíduos sem sobrepor as
responsabilidades, para que um usuário não possua autoridade ilimitada, como com a autoridade
*ALLOBJ.
Por exemplo, suponha que um negócio tenha designado a responsabilidade de gerenciar a segurança no
IBM i para Theresa. Antes da liberação do IBM i 7.2, para conceder privilégios, Theresa tinha de ter os
mesmos privilégios que estava concedendo. Assim, para conceder privilégios *USE à tabela PAYROLL,
Theresa tinha de ter as autoridades *OBJMGT e *USE (ou um nível superior de autoridade, como
*ALLOBJ). Este requisito permitiu que Theresa acessasse os dados na tabela PAYROLL mesmo que a
descrição do cargo dela fosse somente gerenciar a segurança.
No IBM i 7.2, o uso da função, QIBM_DB_SECADM, fornece a um usuário a capacidade de conceder a
autoridade, revogar a autoridade, alterar a propriedade ou alterar o grupo primário. Isso é feito sem dar
acesso ao objeto ou, no caso de uma tabela de banco de dados, aos dados que estão na tabela ou
permitindo outras operações na tabela. O uso da função QIBM_DB_SECADM só pode ser concedido por
um usuário com autoridade especial *SECADM e pode ser atribuído a um usuário ou grupo.
QIBM_DB_SECADM também é responsável por administrar o RCAC. O RCAC restringe quais linhas um
usuário tem permissão de acesso em uma tabela e se um usuário tem permissão de ver informações em
certas colunas de uma tabela.
A melhor prática é que o administrador do RCAC tenha o uso da função QIBM_DB_SECADM e
absolutamente nenhum privilégio de dados. O administrador do RCAC pode implementar e manter os
construtos do RCAC e seria incapaz de conceder a si mesmo o acesso não autorizado aos dados.
Permissões e Máscaras
O RCAC é um modelo no qual um administrador de segurança gerencia políticas de privacidade e
segurança.
34
IBM i: Administração de Banco de Dados
O RCAC permite que todos os usuários acessem a mesma tabela, ao contrário de visualizações
alternativas de uma tabela. RCAC, no entanto, restringe o acesso aos dados na tabela, baseada nas
permissões de usuário individual ou regras, conforme especificado por uma política que está associada à
tabela. Há dois conjuntos de regras. Um conjunto de regras opera em linhas (permissões) e o outro em
colunas (máscaras). Para criar permissões e máscaras, o IBM Advanced Data Security for i deve ser
instalado.
Permissão de linha
v Uma permissão de linha define uma regra de controle de acesso de linha para uma tabela específica.
v Uma regra de controle de acesso de acesso de linha é uma condição de procura SQL que descreve qual
conjunto de linhas um usuário pode acessar.
v A definição de cada permissão de linha pode referenciar o usuário ou grupo na condição de procura.
Se diversas permissões de linha forem definidas para uma tabela e o controle de acesso de linha estiver
ativado, a condição de procura em cada permissão de linha será conectada pelo operador OR lógico
para formar a condição de procura do controle de acesso de linha. Essa condição de procura de
controle de acesso de linha é aplicada sempre que a tabela é acessada. Ela atua como um filtro na
tabela antes de quaisquer outras operações especificadas pelo usuário, como predicados e ordenação
são processados. Ela atua como a cláusula WITH CHECK OPTION de uma visualização para assegurar
que uma linha seja inserida ou atualizada conforme as definições das permissões de linha em uma
instrução INSERT, UPDATE ou MERGE.
Máscara de coluna
v Uma máscara de coluna define uma regra de controle de acesso da coluna para uma coluna específica
em uma tabela.
v Uma regra de controle de acesso de coluna é uma expressão CASE SQL que descreve quais valores de
coluna um usuário tem permissão de ver e sob quais condições.
v A definição de cada máscara de coluna pode referenciar o usuário ou grupo nas condições de procura
na cláusula CASE WHEN. Embora diversas colunas em uma tabela possam ter máscaras de coluna,
somente uma máscara de coluna pode ser criada para uma única coluna. Quando o controle de acesso
de coluna é ativado para a tabela, a expressão CASE na definição de máscara de coluna é aplicada na
coluna de saída para determinar os valores mascarados retornados para um aplicativo. O aplicativo de
máscaras de coluna afeta o resultado final somente. Isso não impacta as operações, como predicados e
ordenação em uma instrução SQL.
O RCAC pode ser ativado para uma tabela antes ou após as permissões de linha ou máscaras de coluna
serem criadas para a tabela. Se as permissões de linha ou máscaras de coluna existirem, ativar o controle
de acesso de linha e coluna simplesmente torna as permissões ou máscaras efetivas. Se as permissões de
linha ainda não existirem, ativar o controle de acesso de linha para uma tabela significa que o DB2 for i
gera uma permissão de linha padrão que impede qualquer acesso aos dados na tabela.
Instruções SQL
As instruções criar, alterar e eliminar SQL suportam a implementação de RCAC com permissões e
máscaras.
v Criar Permissão
v Alterar Permissão
v Eliminar Permissão
v Criar Máscara
v Alterar Máscara
v Eliminar Máscara
v Alterar Função
v Alterar Acionador
v Alterar Tabela
Administração
35
Autorização
O ID de autorização da instrução SQL deve estar autorizado à função de Administrador de Segurança do
Banco de Dados do IBM i. Consulte Autoridade administrativa.
Funções Protegidas
As funções devem ser definidas como protegidas antes de poderem ser chamadas nas definições do
RCAC.
O atributo SECURED é necessário se o UDF for referenciado na definição de uma permissão de linha ou
máscara de coluna, porque o UDF terá acesso aos dados antes do aplicativo do RCAC. O atributo
SECURED também é necessário para um UDF que é chamado em uma instrução SQL quando os
argumentos da função referenciam colunas que estão ativadas com o controle de acesso da coluna.
Proteger Acionadores
Os acionadores definidos em uma tabela com o RCAC ativado devem estar protegidos.
O atributo SECURED é necessário para um acionador quando a tabela associada possui o RCAC ativado
ou a visualização associada cuja tabela subjacente está ativada com o RCAC. Se um acionador existir, mas
não estiver protegido, o RCAC não poderá ser ativado para a tabela associada.
Autoridade administrativa
A autorização para a função de Administrador de Segurança de Banco de Dados do IBM i pode ser
designado por meio de um Administração do Aplicativo em IBM Navigator for i.
O comando Change Function Usage Information (CHGFCNUSG), com um ID da função de
QIBM_DB_SECADM, pode ser usado para alterar a lista de usuários autorizados.
Melhores Práticas ao Usar Permissões e Máscaras
As permissões e máscaras podem ser criadas para uma tabela em um número de implementações
diferentes. Esta seção explicará algumas das implementações que podem ser usadas para criar permissões
e máscaras.
Criando Permissões e Máscaras
Um número de considerações precisa ser determinado para decidir a melhor forma de criar permissões
ou máscaras.
Criar permissões ou máscaras quando o row or column access control está ativo
A tarefa que está criando a permissão ou máscara obtém um bloqueio restrito na tabela base. Se o row or
column access control estiver ativo, a tabela base não terá permissão de leitura até a criação da permissão
ou máscara estar concluída. Os aplicativos que leem a tabela base precisam ser encerrados até que as
permissões ou máscaras sejam incluídas.
Criando permissões ou máscaras quando o row or column access control não está ativo
A tarefa que está criando a permissão ou máscara obtém um bloqueio restrito na tabela base. Entretanto,
a tabela base tem permissão de ser lida até que o row or column access control seja ativado. Os
aplicativos que leem a tabela base não têm de ser encerrados.
Única Permissão com Todos os Usuários:
Exemplo 1: Usando uma única permissão com todos os usuários definidos na permissão.
36
IBM i: Administração de Banco de Dados
CREATE SCHEMA MY_LIB
CREATE TABLE MY_LIB.PERMISSION_TABLE (COLUMN1 INT)
CREATE PERMISSION MY_LIB.PERM1 ON MY_LIB.PERMISSION_TABLE FOR ROWS WHERE
VERIFY_GROUP_FOR_USER(CURRENT_USER,’USER1’,’USER2’,’USER3’) = 1
ENFORCED FOR ALL ACCESS ENABLE
ALTER TABLE MY_LIB.PERMISSION_TABLE ACTIVATE ROW ACCESS CONTROL
/***************************************************************/
/*
Conecte-se como USER1
*/
/***************************************************************/
INSERT INTO MY_LIB.PERMISSION_TABLE VALUES(1) /* Permitido.
*/
A vantagem de uma única permissão é o melhor desempenho da consulta para aplicativos. A
desvantagem é incluir outro usuário, a permissão tem de ser eliminada e criada para incluir o novo
usuário.
Única Permissão com um Perfil de Grupo:
Exemplo 2: usando uma única permissão com todos os usuários definidos em um perfil de grupo na
permissão.
CREATE SCHEMA MY_LIB
CREATE TABLE MY_LIB.PERMISSION_TABLE (COLUMN1 INT)
CREATE PERMISSION MY_LIB.PERM1 ON MY_LIB.PERMISSION_TABLE
AS P_GROUP FOR ROWS WHERE
VERIFY_GROUP_FOR_USER(SESSION_USER,’PERM_GROUP’) = 1
ENFORCED FOR ALL ACCESS ENABLE
ALTER TABLE MY_LIB.PERMISSION_TABLE ACTIVATE ROW ACCESS CONTROL
/********************************************************************/
/* Conecte-se como USER1 que é um membro do grupo de usuários PERM_GROUP
/********************************************************************/
INSERT INTO MY_LIB.PERMISSION_TABLE VALUES(1) /* Permitido.
*/
*/
A vantagem de uma única permissão verificando um perfil do grupo significa que a permissão não tem
de alterar a inclusão de outro usuário. A desvantagem de cada consulta da tabela base, a função
VERIFY_GROUP_FOR_USER é verificada.
Única Permissão com uma Tabela Dependente:
Exemplo 3: Usando uma única permissão que os usuários definiram em uma tabela dependente.
CREATE SCHEMA MY_LIB
CREATE SCHEMA RCAC_DEPENDENT
CREATE TABLE MY_LIB.PERMISSION_TABLE (COLUMN1 INT)
CREATE TABLE RCAC_DEPENDENT.USERS (USERNAME CHAR (10))
INSERT INTO RCAC_DEPENDENT.USERS
VALUES(’USER1
’),(’USER2
’),(’USER3
’)
CREATE TABLE MY_LIB.PERMISSION_TABLE (FIELD1 INT)
CREATE PERMISSION MY_LIB.PERM1 ON MY_LIB.PERMISSION_TABLE
FOR ROWS WHERE
CURRENT_USER IN (SELECT USERNAME FROM RCAC_DEPENDENT.USERS)
ENFORCED FOR ALL ACCESS ENABLE
ALTER TABLE MY_LIB.PERMISSION_TABLE ACTIVATE ROW ACCESS CONTROL
/***********************************************************************/
/* Conecte-se como USER1
*/
/***********************************************************************/
INSERT INTO MY_LIB.PERMISSION_TABLE VALUES(1) /* Permitido.
*/
A vantagem de uma única permissão verificar uma tabela dependente é que, ao incluir outro usuário, a
permissão não precisa ser mudada. A desvantagem é a consideração de desempenho de consultar a tabela
dependente.
Única Permissão com um UDF:
Exemplo 4: Usando uma única permissão com um User Defined Function (UDF).
CREATE SCHEMA RCAC_DEPENDENT
CREATE SCHEMA MY_LIB
CREATE TABLE MY_LIB.PERMISSION_TABLE (COLUMN1 INT)
CREATE OR REPLACE FUNCTION RCAC_DEPENDENT.UDF_PERMISSION
()
RETURNS CHAR(10)
LANGUAGE SQL
Administração
37
MODIFIES SQL DATA
NO EXTERNAL ACTION
DETERMINISTIC
NOT FENCED
SECURED
BEGIN
DECLARE ALLOWS CHAR(10);
IF (CURRENT_USER = ’USER1’) THEN
SET ALLOWS = ’ALLOWED
’;
ELSE
SET ALLOWS = ’DISALLOWED’;
END IF;
RETURN ALLOWS;
END
CREATE PERMISSION MY_LIB.PERMISSION_USER
ON MY_LIB.PERMISSION_TABLE
FOR ROWS WHERE
RCAC_DEPENDENT.UDF_PERMISSION() = ’ALLOWED
ENFORCED FOR ALL ACCESS ENABLE
’
ALTER TABLE MY_LIB.PERMISSION_TABLE ACTIVATE ROW ACCESS CONTROL
A vantagem de uma única permissão que verifica um UDF é incluir outro usuário, a permissão não tem
de se alterar. A desvantagem aparece quando o UDF é alterado. Durante a próxima abertura da tabela
com a permissão, a verificação deve ser feita para permitir que o novo UDF seja usado com a permissão.
A verificação faz com que a permissão ou máscara seja gerada novamente uma vez para a tabela.
Permissões para Cada Usuário:
Exemplo 5: Usando diversas permissões, uma permissão para cada usuário.
CREATE SCHEMA MY_LIB
CREATE TABLE MY_LIB.PERMISSION_TABLE (COLUMN1 INT)
CREATE PERMISSION MY_LIB.P1 ON MYLIB.PERMISSION_TABLE
FOR ROWS WHERE
CURRENT_USER = ’USER1
’
ENFORCED FOR ALL ACCESS ENABLE
CREATE PERMISSION MY_LIB.P2 ON MY_LIB.PERMISSION_TABLE
FOR ROWS WHERE
CURRENT_USER = ’USER2
’
ENFORCED FOR ALL ACCESS ENABLE
CREATE PERMISSION MY_LIB.P3 ON MY_LIB.PERMISSION_TABLE
FOR ROWS WHERE
CURRENT_USER = ’USER3
’
ENFORCED FOR ALL ACCESS ENABLE
ALTER TABLE MY_LIB.PERMISSION_TABLE ACTIVATE ROW ACCESS CONTROL
A vantagem de diversas permissões é a facilidade de uso de ter permissões individuais. A desvantagem é
ter de incluir outro usuário, uma nova permissão tem de ser incluída. A nova permissão causa uma
regeneração da permissão composta usada para a tabela.
Atributos de Diversas Permissões:
Os atributos para cada permissão da tabela base precisam ser os mesmos.
Os atributos precisam ser os mesmos, porque quando a permissão é executada, os dados (linhas da tabela
base) são verificados para cada permissão. Por exemplo, o caso em que uma permissão está usando um
*PERIOD como o ponto decimal e outra permissão está usando uma*COMMA. As permissões são
diferentes, porque o tipo de ponto decimal esperado por cada permissão não é o mesmo. Os atributos a
seguir podem alterar a execução da permissão:
v DATFMT, TIMFMT, DATSEP, TIMSEP DECMPT
v SRTSEQ e LANGID
v DECFLTRND
v Ponto decimal e DECRESULT
38
IBM i: Administração de Banco de Dados
Se os atributos listados não forem os mesmos para cada permissão, um resultado inesperado poderá ser
retornado.
Nomes de Objetos Não Qualificados:
Os nomes de objetos não qualificados no RULETEXT se tornam qualificados para esquema durante a
criação das permissões ou máscaras.
Por exemplo, criar permissões ou máscaras em um ambiente de teste faz com que os nomes de objetos se
tornem qualificados com o nome do esquema de teste. Portanto, é melhor qualificar o nome do esquema
para evitar confusão do nome do esquema.
CREATE SCHEMA MY_LIB
CREATE SCHEMA RCAC_LIB
CREATE TABLE MY_LIB.PERMISSION_TABLE (COLUMN1 INT)
CREATE TABLE RCAC_LIB.DEPENDENT_TABLE (COLUMN1 INT)
SET SCHEMA RCAC_LIB
CREATE PERMISSION MY_LIB.PERMISSION_USE
ON MY_LIB.PERMISSION_TABLE FOR ROWS
WHERE
COLUMN1 IN (SELECT COLUMN1 FROM DEPENDENT_TABLE)
ENFORCED FOR ALL ACCESS ENABLE
/*******************************************************************/
/* A instrução selecionar mostrará RULETEXT como sendo qualificado. */
/*******************************************************************/
SELECT CHAR(RULETEXT,200) FROM QSYS2.SYSCONTROL
WHERE SCHEMA = ’MY_LIB’
/*******************************************************************/
/* O RULETEXT agora está qualificado.
*/
/*******************************************************************/
PERMISSION_TABLE.COLUMN1 IN
(SELECT RCAC_LIB.DEPENDENT_TABLE.COLUMN1 FROM RCAC_LIB.DEPENDENT_TABLE)
Objetos Dependentes
Um número de considerações deve ser determinado para decidir como manipular objetos dependentes
das permissões e máscaras.
Propriedade:
Objetos dependentes de uma permissão ou máscara devem ser possuídos pelo perfil do usuário com a
autoridade funcional QIBM_DB_SECADM e nenhuma autoridade de gerenciamento de objetos deve ser
concedida a outros usuários.
Isso restringe a possibilidade de o objeto dependente ser manipulado por um usuário autorizado para
alterar uma permissão ou máscara para permitir acesso indesejado a dados.
Esquema:
Todas as tabelas dependentes ou visualizações de uma permissão ou máscara devem ser criadas em um
esquema diferente do esquema da tabela base.
Se o usuário executar um Create Duplicate Object (CRTDUPOBJ) ou Restore (RSTOBJ) da tabela base para
um novo esquema, os nomes do esquema dos objetos dependentes não são alterados. Ao manter as
tabelas dependentes e visualizações em um esquema diferente após CRTDUPOBJ ou RSTOBJ da tabela
base, a tabela base recém-criada referencia os mesmos objetos dependentes que a tabela base original.
Se os objetos dependentes das permissões e máscaras estiverem no mesmo esquema, se o usuário
duplicar o esquema, as permissões e máscaras duplicadas referenciarão os objetos do esquema original.
Portanto, ao clonar um esquema e os objetos nele, a melhor prática é usar o recurso Gerar SQL em um
IBM i Navigator. Ao cancelar a seleção da opção "Objetos de Qualificação de Esquema", o script SQL
Administração
39
resultante não conterá mais referências qualificadas do esquema nas permissões e máscaras. O usuário
pode preceder a execução do script SQL com uma instrução SET SCHEMA especificando o esquema de
destino.
Autoridade de Esquema:
O esquema que contém os objetos dependentes não deve permitir a autoridade de gerenciamento de
objetos para usuários.
Ao não conceder a autoridade de gerenciamento de objetos aos usuários, os objetos dependentes não
terão permissão de serem manipulados por usuários.
UDFs Protegidos:
Uma função definida pelo usuário (UDF) SQL usada no RULETEXT de uma permissão ou máscara deve
ser marcada como SECURE.
Esta mesma regra se aplica a qualquer função que possa ser chamada com uma coluna mascarada
especificada como um argumento. O atributo SECURE está armazenado no executável *PGM ou
*SRVPGM que é chamado quando o UDF é chamado. Quando o *PGM/*SRVPGM para uma função SQL
SECURED é restaurado, o atributo SECURE associado à função pode ser perdido a menos que um dos
seguintes seja true:
v O usuário que está fazendo a restauração está autorizado à função QIBM_DB_SECADM.
v O usuário que está fazendo a restauração possui a autoridade especial *SAVSYS.
v O usuário chamado QSECOFR está fazendo a restauração.
Os programas Old Program Model (OPM) não podem ser usados para funções (UDFs) definidas em
permissões ou máscaras. Isso ocorre porque o sistema não pode verificar o programa durante outras
operações do banco de dados, como a restauração ou renomeação.
Ao criar um UDTF ou UDF, o padrão é FENCED, significando que UDTF ou UDF é executado em um
encadeamento secundário. Certos registros especiais SQL como CURRENT USER não podem se
comportar conforme o esperado quando referenciados em um UDF FENCED. Portanto, quando UDTFs
ou UDFs forem usados no texto do RCAC, use NOT FENCED.
ALWCPYDTA e Nível de Isolamento:
As expressões no RULETEXT da permissão ou máscara são executadas com o mesmo ALWCPYDTA e
atributos de nível de isolamento ao abrir uma tabela base, índice ou visualização com uma permissão ou
máscara ativa.
Para aberturas nativas o atributo ALWCPYDTA é *NO. Isso impede que as cópias temporárias dos dados
sejam usadas para executar as expressões de permissão ou máscara. Se a permissão ou máscara requerer
uma cópia temporária dos dados, é recomendável que as expressões correspondentes sejam movidas para
um UDF seguro que é executado com um atributo ALWCPYDTA de *YES ou *OPTIMIZE. O RULETEXT
da permissão ou máscara poderia ser alterado para referenciar o UDF em vez da expressão que precisava
de uma cópia temporária dos dados.
Restaurando Objetos:
Restaurar uma versão diferente de um objeto dependente da tabela base pode impactar as permissões e
máscaras existentes.
O processo de verificar os objetos dependentes para permissões e máscaras é feito pela primeira vez que
a tabela base é aberta e não durante o processo de restauração.
40
IBM i: Administração de Banco de Dados
Portanto, após restaurar os objetos dependentes para as permissões ou máscaras,o administrador do
sistema deve incluir no processo uma operação aberta simples da tabela base. Isso permite que a
verificação seja concluída e evita a verificação no tempo de execução do aplicativo.
É importante se assegurar de que os objetos dependentes adequados das permissões e máscaras são
restaurados ao restaurar as tabelas base com as permissões e máscaras.
Operações Adicionais
Um número de considerações deve ser revisto criando permissões ou máscaras para uma tabela.
Incluindo o Perfil do Aplicativo em Permissões e Máscaras:
Alguns aplicativos existentes podem precisar incluir o perfil da tarefa que executa o aplicativo nas
permissões e máscaras da tabela base.
Alguns exemplos desses aplicativos seriam Data Propagator, software High Availability (HA) e aplicativos
semelhantes. Se o perfil do aplicativo não for incluído nas permissões e máscaras, as permissões e
máscaras serão reforçadas e o aplicativo poderá usar linhas parciais e dados mascarados.
Recuperar o Armazenamento:
Após concluir um Reclaim Storage (RCLSTG), quaisquer espaços de dados que sejam órfãos e localizados
pela operação de recuperação de armazenamento serão incluídos na biblioteca QRCL como uma tabela.
Como esses espaços para dados poderiam ser o resultado de uma tabela base que tinha o RCAC, os
espaços para dados que agora são tabelas no QRCL não têm nenhum RCAC. Após o RCLSTG ser
concluído, o administrador do sistema precisará consultar as tabelas em QRCL e manipular (copiar os
dados e excluir a tabela) as tabelas que precisam ser protegidas com o RCAC.
Relatórios de Consulta:
Esta recomendação se aplica a funções de relator de consulta, como Query for i ou DB2 for i Query
Manager.
Ao usar uma função de relator de consulta da web, é recomendado, para resultados consistentes, que
uma classificação também seja aplicada a qualquer coluna usada para processamento de quebra de
relatório. Com o aplicativo de máscaras de coluna, a classificação é feita em uma coluna antes de as
máscaras serem aplicadas, mas o processamento da quebra que é feito pela função de relator pode ser
feito usando valores mascarados. Como resultado, os agrupamentos de quebra inconsistente e valores de
resumo diferentes podem ser vistos ao executar um relatório de consulta após as máscaras serem
definidas na tabela baseada.
MQTs:
Ao preencher ou atualizar um MQT, ele não considera predicados ou expressões de máscaras ou
permissões em tabelas dependentes.
Quando o MQT é usado para otimização em uma consulta, as permissões de linha subjacentes e máscaras
de coluna são construídas na consulta que usa o MQT. Para que o MQT seja usado para otimização, o
MQT deve incluir quaisquer colunas que sejam usadas pelas máscaras ou permissões.
No exemplo a seguir, o MQT TOTALSALES não pode ser usado por nenhuma consulta que inclua
CreditCardNum porque CustID é usado pela máscara para CreditCardNum, mas não está na lista de
seleção do MQT.
CREATE SCHEMA MY_LIB
CREATE TABLE MY_LIB.SALES(CustID INT,
CreditCardNum VARCHAR(12),
Administração
41
Amount DEC(6,2))
CREATE MASK MY_LIB.CCN_MASK ON SALES FOR COLUMN CreditCardNum
RETURN
CASE
WHEN (CustID < 10) THEN CreditCardNum
ELSE 'b*******' || SUBSTR(CreditCardNum, 9, 4)
END
ENABLE;
CREATE TABLE MY_LIB.TOTALSALES
AS (SELECT CreditCardNum AS SCCN, SUM(Amount) AS SSUM
FROM SALES
GROUP BY CreditCardNum)
DATA INITIALLY DEFERRED
REFRESH DEFERRED
MAINTAINED BY USER
SELECT CreditCardNum, Sum(Amount)
FROM MY_LIB.SALES
GROUP BY CreditCardNum
| Tabelas temporais:
| Uma tabela temporal de período do sistema pode ter uma permissão de linha ou uma máscara de coluna.
| Para obter mais informações sobre tabelas temporaise RCAC, consulte “Controle de acesso de linha e
| coluna com uma tabela temporal de período do sistema” na página 23.
Perfis de Grupo e QIBM_DB_SECADM:
IDs de autorização que estão autorizados à função QIBM_DB_SECADM não devem ser incluídos em um
perfil do grupo.
Esse ID de autorização pode transferir a propriedade ou conceder privilégios para um objeto a qualquer
ID de autorização que não ele mesmo. Entretanto, o ID autorizado ainda pode transferir ou conceder ao
grupo do qual o ID autorizado é um membro.
Os usuários que têm autoridades necessárias para excluir, mover, copiar, renomear ou substituir os
objetos *PGM/*SRVPGM não podem fazer essas operações quando o objeto *PGM/*SRVPGM
corresponde a um SECURE FUNCTION e o usuário está autorizado à função QIBM_DB_SECADM. Um
usuário que tem permissão de usar a função QIBM_DB_SECADM pode usar os comandos Create SQL
ILE CL (CRTSQLCBLI, CRTSQLCI, CRTSQLCCPPI ou CRTSQLRPGI) ou qualquer um dos comandos
Create Bound Program CL (CRTBNDC, CRTBNDCBL, CRTBNDCL, CRTBNDCPP, CRTBNDRPG) para
substituir um *PGM/*SRVPGM associado à SECURE FUNCTION.
Após o objeto ser criado, ele pode ser copiado para a biblioteca QRPLOBJ. A cópia QRPLOBJ da SECURE
FUNCTION pode ser copiada ou movida para outra biblioteca, mas não terá permissão para ser usada
como uma SECURE FUNCTION, a menos que o programa seja renomeado, movido, copiado ou
salvo/restaurado por um usuário com a autoridade QIBM_DB_SECADM. Lembre-se, um usuário sem a
autoridade QIBM_DB_SECADM tem permissão de excluir, mover ou copiar o objeto em QRPLOBJ, mas
não tem permissão de excluí-lo da biblioteca à qual foi movida ou copiada.
Parâmetros Copy File (CPYF):
O comando Copy File (CPYF) pode comparar valores retornados dos parâmetros FROMFILE TOKEY,
INCCHAR e INCREL.
Se uma máscara for definida para a coluna que é usada por qualquer um desses parâmetros, o valor da
máscara será retornado de FROMFILE e usado pelo parâmetro que pode resultar em resultados
inesperados.
42
IBM i: Administração de Banco de Dados
OmniFind Text Search Server for DB2 for i:
O OmniFind Text Search Server for DB2 for i (5733-OMF) versão 1.3 ou superior permite que os clientes
criem um índice de procura de texto por meio de uma coluna de uma tabela que está protegida pelo
RCAC.
Após um índice de procura de texto ser criado, as funções SQL integradas CONTAINS e SCORE podem
ser usadas para executar procuras de texto completo por meio da coluna indexada. Os clientes devem
estar cientes das considerações a seguir ao criar um índice de procura de texto por meio de uma coluna
que está protegida por um RCAC.
v Um servidor de procura de texto executa a tarefa de indexação e procura de documentos; os dados
indexados são armazenados fora do DB2 como arquivos de fluxos no sistema de arquivo integrado.
Como os dados indexados são armazenados fora do DB2, os usuários que têm acesso ao servidor de
procura de texto poderia possivelmente reconstruir documentos confidenciais a partir do índice.
v Os dados são trocados com o servidor de procura de texto usando protocolos de rede que não são
criptografados, os certificados digitais não serão verificados.
v Um índice de procura de texto requer que a tabela base contenha uma ou mais colunas de identificação
que são uma chave primária, índice exclusivo ou ROWID. A coluna de identificação é usada para
identificar uma linha específica ao interagir com o servidor de procura de texto ou um administrador;
os valores serão armazenados na tabela de migração de dados e poderão ser retornados dos
procedimentos administrativos. Quando um índice de procura de texto for criado por meio de uma
tabela que é protegida por RCAC, a coluna de identificação deve conter um valor gerado, como um
ROWID ou uma coluna de identidade. Isso permite que linhas individuais sejam identificadas usando
informações não confidenciais. Para obter mais informações, consulte o OmniFind Text Search Server
for DB2 for i .
Usando o RCAC em Arquivos Lógicos Multiformatados
Um arquivo lógico de multiformato contém mais um formato de registro ou mais de um arquivo
especificado na palavra-chave PFILE (DDS) de um arquivo lógico.
Para abrir um arquivo lógico que tem mais de um arquivo especificado na palavra-chave PFILE, os
critérios a seguir devem ser atendidos:
1. Cada permissão ou máscara no mesmo arquivo físico baseado deve ter um nome de correlação
exclusivo.
2. Como os nomes de permissões e máscaras na mesma biblioteca devem ser exclusivos e não podem
usar o nome da máscara ou permissão para determinar uma correspondência entre duas tabelas. Em
vez disso, a correspondência está usando o nome de correlação. O nome de correlação que é usado
para a "mesma" permissão ou máscara que é aplicado a diversos arquivos físicos baseados deve ser o
mesmo para cada arquivo.
3. O RULETEXT para uma permissão ou máscara correspondente deve ser o mesmo. Em casos em que
nenhum nome de correlação está especificado na permissão ou máscara, o RULETEXT é normalizado
para usar o nome da tabela como o nome de correlação. Portanto, a única forma de forçar RULETEXT
a ser o mesmo entre duas permissões e máscaras é usar o mesmo nome de correlação explícito.
4. Cada máscara ou permissão correspondente entre as tabelas deve ser definida com as mesmas opções
de analisador:
v Formato de data/hora e separador
v SRTSEQ e LANGID
v DECFLTRND
v Ponto decimal e DECRESULT
v CCSID de RULETEXT
5. O RCAC para cada arquivo físico baseado deve estar no mesmo estado ativo ou inativo.
6. Cada máscara ou permissão deve estar no mesmo estado ENABLED/DISABLED como sua
correspondência nos outros arquivos físicos baseados.
Administração
43
Neste exemplo, LF1 está baseado em PF1, PF2 e PF3 e cada definição usa o nome de correlação PERM1
para que o código de verificação SQL possa identificá-los como sendo equivalente.
CREATE SCHEMA MY_LIB
SET
SCHEMA MY_LIB
CREATE TABLE MY_LIB.PF1
CREATE TABLE MY_LIB.PF2
CREATE TABLE MY_LIB.PF3
(COLUMN1 INT)
(COLUMN1 INT)
(COLUMN1 INT)
DDS for LF1
FMT LF .....A..........T.Name++++++.Len++TDp......Functions++++++++++++++
R RECORD1
PFILE(PF1 PF2 PF3)
COLUMN1
K COLUMN1
ADDLIBLE MY_LIB
CRTLF FILE(MY_LIB/LF1) SRCFILE(MY_LIB/QDDSSRC)
CREATE PERMISSION PF1_P1 ON MY_LIB.PF1 AS PERM1 FOR ROWS WHERE
CURRENT_USER = ’USER3’ ENFORCED FOR ALL ACCESS
CREATE PERMISSION PF2_P2 ON MY_LIB.PF2 AS PERM1 FOR ROWS WHERE
CURRENT_USER = ’USER3’ ENFORCED FOR ALL ACCESS
CREATE PERMISSION PF3_P3 ON MY_LIB.PF3 AS PERM1 FOR ROWS WHERE
CURRENT_USER = ’USER3’ ENFORCED FOR ALL ACCESS
CREATE MASK PF1_M1 ON MY_LIB.PF1 AS MASK1
FOR COLUMN COLUMN1 RETURN
CASE WHEN COLUMN1 > 55000 THEN
0 END
CREATE MASK PF2_M2 ON MY_LIB.PF2 AS MASK1
FOR COLUMN COLUMN1 RETURN
CASE WHEN COLUMN1 > 55000 THEN
0 END
CREATE MASK PF3_M3 ON MY_LIB.PF3 AS MASK1
FOR COLUMN COLUMN1 RETURN
CASE WHEN COLUMN1 > 55000 THEN
0 END
ALTER TABLE PF1 ACTIVATE ROW ACCESS CONTROL
ALTER TABLE PF2 ACTIVATE ROW ACCESS CONTROL
ALTER TABLE PF3 ACTIVATE ROW ACCESS CONTROL
ALTER TABLE PF1 ACTIVATE COLUMN ACCESS CONTROL
ALTER TABLE PF2 ACTIVATE COLUMN ACCESS CONTROL
ALTER TABLE PF3 ACTIVATE COLUMN ACCESS CONTROL
Propagação de Dados Mascarados
Executar uma operação de inserção ou atualização em uma tabela base com o controle de acesso de
coluna ativo, a operação pode falhar, porque os dados são os dados mascarados.
Isso pode acontecer quando os dados a serem inseridos ou atualizados contêm o valor mascarado e os
dados mascarados foram selecionados em uma tabela com o controle de acesso da coluna ativa e a
seleção foi feita na mesma instrução SQL. Como um exemplo, presuma que TABLE1 e TABLE2 tenham o
controle de acesso da coluna ativa e para a inserção, selecionar na TABLE2 retornaria os dados
mascarados. A instrução a seguir retornaria um erro:
INSERT INTO TABLE1 SELECT * FROM TABLE2
A instrução falharia com SQ20478 – O controle de acesso de linha ou coluna não é válido.
Entretanto, suponha que para este exemplo, TABLE1 e TABLE2 contenham duas colunas, NAME e SSN.
Para o usuário que está fazendo o INSERT, a máscara é definida para retornar a sequência
‘XXX-XX-nnnn’ ao consultar TABLE2.
SELECT NAME, SSN INTO :name, :ssn FROM TABLE2;
INSERT INTO TABLE1 VALUES(:name, :ssn);
Este mesmo tipo de problema também pode ocorrer se o usuário estiver executando um aplicativo de
banco de dados nativo. Um READ da TABLE2 seguido de um WRITE na TABLE1 poderia resultar nos
dados mascarados gravados no arquivo. Ou no caso de uma atualização, mesmo se a coluna SSN não se
destinar a alterar na UPDATE, o registro que está sendo atualizado contém o valor mascarado para a
coluna SSN e ela é alterada.
44
IBM i: Administração de Banco de Dados
Duas soluções para evitar que os dados mascarados sejam fornecidos:
1. Acionador BEFORE.
2. Restrição CHECK.
Solução de Acionador Before
A solução do acionador verifica os novos dados gravados em uma coluna e configura condicionalmente a
coluna para o valor atual ou o configura como DEFAULT.
Este é um exemplo de um acionador before de inserção/atualização para evitar dados mascarados:
CREATE SCHEMA MY_LIB
CREATE TABLE MY_LIB.EMP_INFO
(COL1_name CHAR(10) WITH DEFAULT ’DEFAULT’,
COL2_ssn CHAR(11) WITH DEFAULT ’DEFAULT’)
/********************************************************************/
/* Crie uma máscara para dar COL2_ssn para DBMGR, mas para qualquer outro usuário */
/* mascare a coluna. Esta tabela conterá um acionador para assegurar que */
/* a coluna possa nunca conter um valor mascarado.
*/
/********************************************************************/
CREATE MASK MASK_SSN ON MY_LIB.EMP_INFO
FOR COLUMN COL2_ssn
RETURN
CASE
WHEN VERIFY_GROUP_FOR_USER(SESSION_USER, ’DBMGR’) = 1
THEN COL2_ssn
ELSE ’XXX-XX-’||SUBSTR(COL2_ssn,8,4)
END
ENABLE
ALTER TABLE MY_LIB.EMP_INFO ACTIVATE COLUMN ACCESS CONTROL
CREATE TRIGGER PREVENT_MASK_SSN BEFORE INSERT OR UPDATE ON MY_LIB.EMP_INFO
REFERENCING NEW ROW AS N OLD ROW AS O
FOR EACH ROW MODE DB2ROW
SECURED
WHEN(SUBSTR(N.COL2_ssn,1,7) = ’XXX-XX-’)
BEGIN
IF INSERTING THEN SET N.COL2_ssn = DEFAULT;
ELSEIF UPDATING THEN SET N.COL2_ssn = O.COL2_ssn;
END IF;
END
Tentar uma operação de inserção ou atualização faz com que o acionador BEFORE seja executado e
assegure-se dos dados corretos na coluna COL2_ssn.
Solução de Restrição de Verificação
A solução baseada na restrição de verificação fornece uma nova sintaxe SQL para permitir que a
especificação de uma ação seja executada quando uma violação da condição de verificação de restrição de
verificação ocorrer em vez de retornar um erro irrecuperável. Entretanto, se a condição de verificação
continuar falhando após a ação ser tomada, um erro irrecuperável será retornado e a instrução SQL
falhará com a falha de restrição existente, (SQLSTATE=23513, SQLCODE=-545).
Uma restrição de verificação com a cláusula sobre violação está permitida em ambas as instruções
CREATE TABLE e ALTER TABLE.
No exemplo a seguir, a máscara está definida para retornar um valor de ‘XXX-XX-nnnn’ para qualquer
consulta que não seja feita por um perfil do usuário no grupo ‘DBMGR’. A restrição verifica que a coluna
SSN não tem o valor mascarado.
CREATE SCHEMA MY_LIB
SET
SCHEMA MY_LIB
CREATE TABLE MY_LIB.EMP_INFO
(COL1_name CHAR(10) WITH DEFAULT ’DEFAULT’,
COL2_ssn CHAR(11) WITH DEFAULT ’DEFAULT’)
Administração
45
CREATE MASK MASK_ssn ON MY_LIB.EMP_INFO
FOR COLUMN COL2_ssn RETURN
CASE
WHEN VERIFY_GROUP_FOR_USER ( SESSION_USER , ’DBMGR’ ) = 1
THEN COL2_ssn
ELSE ’XXX-XX-’||SUBSTR(COL2_ssn,8,4)
END
ENABLE
/* Restrição de verificação para a atualização e inserção.*/
ALTER TABLE MY_LIB.EMP_INFO
ADD CONSTRAINT MASK_ssn_preserve
CHECK(SUBSTR(COL2_ssn,1,7)<>'XXX-XX-')
ON UPDATE VIOLATION PRESERVE COL2_ssn
ON INSERT VIOLATION SET COL2_ssn = DEFAULT
Classic Query Engine (CQE) e SQL Query Engine (SQE)
A seção explica as diferenças de processamento de consulta nativas e abertas entre CQE e SQE.
| Para obter mais informações sobre as diferenças gerais entre CQE e SQE, consulte o artigo do IBM
| developerWorks Diferenças entre o Mecanismo de Consulta Clássico (CQE) e o Mecanismo de Consulta
| SQL (SQE)
.
Diferenças entre nativo aberto e consulta SQL envolvendo RCAC
Alguns arquivos com RCAC não têm permissão de serem acessados.
Uma tentativa de usar o ambiente nativo para abrir um arquivo com RCAC ativo que envolve qualquer
um dos seguintes não é permitida:
v Um arquivo lógico com diversos formatos se a tentativa de abrir for para mais de um formato.
v Um arquivo distribuído.
v Um arquivo com acionadores de leitura.
v Um arquivo descrito no programa.
v Um arquivo ou consulta que especifica uma sequência de classificação ICU 2.6.1.
Uma tentativa de usar o SQL para consultar uma tabela com o RCAC ativo que envolve qualquer um dos
seguintes não está permitida:
v Um arquivo distribuído.
v Um arquivo com acionadores de leitura.
v Um arquivo ou consulta que especifica uma sequência de classificação ICU 2.6.1.
Ordenação de Conjunto de Resultados
A implementação de SQE pode resultar em uma ordenação do conjunto de resultados diferente para
WRKQRY, RUNQRY ou OPNQRYF.
Quando uma consulta é executada sem especificar explicitamente que os resultados sejam retornados em
uma ordem específica, ambos os otimizadores SQE e CQE escolherão qualquer plano que melhor se
executar. Isso significa que ambos SQE e CQE podem ou não retornar os resultados em uma ordem de
arquivo-chave. Como o CQE tem muito menos recurso avançado que o SQE, é mais provável que retorne
resultados em uma ordem em chave e que o SQE tem menos probabilidade de retornar os resultados em
uma ordem em chave. Assim, se uma consulta for especificada com WRKQRY, RUNQRY ou OPNQRYF e
a ordenação da linha for importante, especifique explicitamente o(s) campo(s) chave e a ordenação do
campo de chave.
46
IBM i: Administração de Banco de Dados
Avisos
Estas informações foram desenvolvidas para produtos e serviços oferecidos nos Estados Unidos.
É possível que a IBM não ofereça os produtos, serviços ou recursos discutidos nesta publicação em outros
países. Consulte um representante IBM local para obter informações sobre produtos e serviços disponíveis
atualmente em sua área. Qualquer referência a produtos, programas ou serviços IBM não significa que
apenas produtos, programas ou serviços IBM possam ser utilizados. Qualquer produto, programa ou
serviço funcionalmente equivalente, que não infrinja nenhum direito de propriedade intelectual da IBM
(ou quaisquer outros direitos da IBM) poderá ser utilizado em substituição a este produto, programa ou
serviço. Entretanto, a avaliação e verificação da operação de qualquer produto, programa ou serviço não
IBM são de responsabilidade do Cliente.
A IBM pode ter patentes ou solicitações de patentes pendentes relativas a assuntos tratados nesta
publicação. O fornecimento desta publicação não lhe garante direito algum sobre tais patentes. Pedidos
de licença devem ser enviados, por escrito, para:
Gerência de Relações Comerciais e Industriais da IBM Brasil
Av. Pasteur, 138-146
Botafogo
Rio de Janeiro, RJ
CEP 22290-240
Para pedidos de licença relacionados a informações de DBCS (Conjunto de Caracteres de Byte Duplo),
entre em contato com o Departamento de Propriedade Intelectual da IBM em seu país ou envie pedidos
de licença, por escrito, para:
IBM World Trade Asia Corporation
2-31 Roppongi 3-chome,
Minato-ku
Tokyo 106,
Japan
O parágrafo a seguir não se aplica a nenhum país em que tais disposições não estejam de acordo com a
legislação local: A INTERNATIONAL BUSINESS MACHINES CORPORATION FORNECE ESTA
PUBLICAÇÃO “NO ESTADO EM QUE SE ENCONTRA”, SEM GARANTIA DE NENHUM TIPO, SEJA
EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS A ELAS NÃO SE LIMITANDO, AS GARANTIAS
IMPLÍCITAS (OU CONDIÇÕES) DE NÃO INFRAÇÃO, COMERCIALIZAÇÃO OU ADEQUAÇÃO A UM
DETERMINADO PROPÓSITO. Alguns países não permitem a exclusão de garantias expressas ou
implícitas em certas transações, portanto, esta disposição pode não se aplicar ao Cliente.
Estas informações podem incluir imprecisões técnicas ou erros tipográficos. Periodicamente, são feitas
alterações nas informações aqui contidas; tais alterações serão incorporadas em futuras edições desta
publicação. A IBMpode, a qualquer momento, aperfeiçoar e/ou alterar os produtos e/ou programas
descritos nesta publicação, sem aviso prévio.
Referências nestas informações a Web sites não IBM são fornecidas apenas por conveniência e não
representam de forma alguma um endosso a esses Web sites. Os materiais contidos nesses Web sites não
fazem parte dos materiais desse produto IBM e a utilização desses Web sites é de inteira responsabilidade
do Cliente.
A IBM pode utilizar ou distribuir as informações fornecidas da forma que julgar apropriada sem incorrer
em qualquer obrigação para com o Cliente.
© Copyright IBM Corp. 1998, 2015
47
Licenciados deste programa que desejam obter informações sobre este assunto com objetivo de permitir:
(i) a troca de informações entre programas criados independentemente e outros programas (incluindo
este) e (ii) a utilização mútua das informações trocadas, devem entrar em contato com:
IBM Corporation
Av. Pasteur, 138-146
Botafogo,
Rio de Janeiro, RJ
CEP 22290-240
Tais informações podem estar disponíveis, sujeitas a termos e condições apropriadas, incluindo em alguns
casos o pagamento de uma taxa.
O programa licenciado descrito nesta publicação e todo o material licenciado disponível são fornecidos
pela IBM sob os termos do Contrato com o Cliente IBM, do Contrato Internacional de Licença do
Programa IBM ou de qualquer outro contrato equivalente.
Todos os dados de desempenho aqui contidos foram determinados em um ambiente controlado. Portanto,
os resultados obtidos em outros ambientes operacionais poderão variar significativamente. Algumas
medidas podem ter sido tomadas em sistemas de nível de desenvolvimento e não há garantia de que
estas medidas serão iguais em sistemas geralmente disponíveis. Além disso, algumas medidas podem ter
sido estimadas por extrapolação. Os resultados reais podem variar. Os usuários deste documento devem
verificar os dados aplicáveis para o ambiente específico.
As informações relativas a produtos não IBM foram obtidas junto aos fornecedores dos respectivos
produtos, de seus anúncios publicados ou de outras fontes disponíveis publicamente. A IBM não testou
estes produtos e não pode confirmar a precisão de seu desempenho, compatibilidade nem qualquer outra
reivindicação relacionada a produtos não IBM. Dúvidas sobre os recursos de produtos não IBM devem
ser encaminhadas diretamente a seus fornecedores.
Todas as declarações relacionadas aos objetivos e intenções futuras da IBM estão sujeitas a alterações ou
cancelamento sem aviso prévio e representam apenas metas e objetivos.
Estas informações foram projetadas apenas com o propósito de planejamento. As informações aqui
contidas estão sujeitas a alterações antes que os produtos descritos estejam disponíveis.
Estas informações contêm exemplos de dados e relatórios utilizados em operações comerciais diárias.
Para ilustrá-los da forma mais completa possível, os exemplos incluem nomes de pessoas, empresas,
marcas e produtos. Todos esses nomes são fictícios e qualquer semelhança com os nomes e endereços
utilizados por uma empresa real é mera coincidência.
LICENÇA DE COPYRIGHT:
Estas informações contêm programas de aplicativos de amostra na linguagem fonte, ilustrando as técnicas
de programação em diversas plataformas operacionais. O Cliente pode copiar, modificar e distribuir estes
programas de amostra sem a necessidade de pagar à IBM, com objetivos de desenvolvimento, utilização,
marketing ou distribuição de programas aplicativos em conformidade com a interface de programação de
aplicativo para a plataforma operacional para a qual os programas de amostra são criados. Esses
exemplos não foram testados completamente em todas as condições. Portanto, a IBM, não pode garantir
ou implicar a confiabilidade, manutenção ou função destes programas. Os programas de amostra são
fornecidos "NO ESTADO EM QUE SE ENCONTRAM", sem garantia de nenhum tipo. A IBM não deve
ser responsabilizada por nenhum dano causado pelo uso dos programas de amostra.
Cada cópia ou parte destes programas de amostra ou qualquer trabalho derivado deve incluir um aviso
de copyright com os dizeres:
48
IBM i: Administração de Banco de Dados
© (nome da empresa) (ano). Partes deste código são derivadas dos IBM Corp. Sample Programs.
© Copyright IBM Corp. _insira o ano ou anos_.
Informações sobre a Interface de Programação
Esta publicação de Administração do banco de dados documenta Interfaces de Programação desejadas
que permitem que o cliente grave programas para obter os serviços do IBM i.
Marcas Registradas
IBM, o logotipo IBM e ibm.com são marcas ou marcas registradas da International Business Machines
Corp., registradas em vários países no mundo todo. Outros nomes de produto e serviço podem ser
marcas registradas da IBM ou de outras empresas. Uma lista atual de marcas registradas da IBM está
disponível na Web em “Copyright and trademark information” at www.ibm.com/legal/copytrade.shtml.
Adobe, o logotipo Adobe, PostScript e o logotipo PostScript são marcas ou marcas registradas da Adobe
Systems Incorporated nos Estados Unidos e/ou outros países.
Linux é uma marca registrada da Linus Torvalds nos Estados Unidos e/ou em outros países.
Microsoft, Windows, Windows NT e o logotipo Windows são marcas registradas da Microsoft
Corporation nos Estados Unidos e/ou em outros países.
UNIX é uma marca registrada da The Open Group nos Estados Unidos e em outros países.
Java e todas as marcas registradas e logotipos baseados em Java são marcas registradas da Oracle, Inc.
nos Estados Unidos e/ou em outros países.
Outros nomes de produtos e serviços podem ser marcas registradas da IBM ou de outras empresas.
Terms and conditions
Permissions for the use of these publications is granted subject to the following terms and conditions.
Personal Use: You may reproduce these publications for your personal, noncommercial use provided that
all proprietary notices are preserved. You may not distribute, display or make derivative works of these
publications, or any portion thereof, without the express consent of IBM.
Commercial Use: You may reproduce, distribute and display these publications solely within your
enterprise provided that all proprietary notices are preserved. You may not make derivative works of
these publications, or reproduce, distribute or display these publications or any portion thereof outside
your enterprise, without the express consent of IBM.
Except as expressly granted in this permission, no other permissions, licenses or rights are granted, either
express or implied, to the publications or any information, data, software or other intellectual property
contained therein.
IBM reserves the right to withdraw the permissions granted herein whenever, in its discretion, the use of
the publications is detrimental to its interest or, as determined by IBM, the above instructions are not
being properly followed.
You may not download, export or re-export this information except in full compliance with all applicable
laws and regulations, including all United States export laws and regulations.
Avisos
49
IBM MAKES NO GUARANTEE ABOUT THE CONTENT OF THESE PUBLICATIONS. THE
PUBLICATIONS ARE PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EITHER
EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES OF
MERCHANTABILITY, NON-INFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE.
50
IBM i: Administração de Banco de Dados
Avisos
51
IBM®
Número do Programa: 5770-SS1
Impresso no Brasil
Download