O Data Management (DMS) oferece uma linguagem específica de domínio (DSL) para definir regras de segurança em fluxos de trabalho de desenvolvimento de banco de dados. Use regras DSL para controlar quais instruções SQL podem ser enviadas, como as aprovações são roteadas e quando as operações devem ser bloqueadas ou sinalizadas como arriscadas.
Como funciona
Uma regra de segurança é uma instrução IF-THEN ou IF-THEN-ELSE. Quando uma condição é atendida, o DMS executa a ação correspondente.
Estrutura básica:
if <condition>
then <action>
end
Estrutura estendida com múltiplas ramificações:
if <condition 1>
then <action 1>
elseif <condition 2>
then <action 2>
[else <action 3>]
end
Cada regra deve conter exatamente uma condição if. Ela pode ter zero ou mais ramificações elseif e zero ou uma cláusula else. Se nenhuma ramificação corresponder e não houver cláusula else, o DMS não executará nenhuma ação.
Componentes da DSL
Uma regra de segurança consiste em três blocos de construção: cláusulas condicionais, cláusulas de ação e funções predefinidas.
Cláusulas condicionais
Uma cláusula condicional é avaliada como true ou false. Ela é construída a partir de um ou mais dos seguintes elementos:
Fatores: variáveis de sistema predefinidas que representam o contexto no momento da avaliação (por exemplo, tipo de instrução SQL, número de linhas afetadas).
Operadores: símbolos que comparam ou testam valores.
Conectores:
ANDeOR, que combinam múltiplas expressões.
O operador AND tem prioridade maior que o OR. Ambos possuem prioridade inferior à dos operadores. Use parênteses para substituir a ordem de avaliação padrão.
Exemplo: Em 1 <= 0 or 1 == 1, o DMS avalia 1 <= 0 e 1 == 1 separadamente e, em seguida, aplica o OR. Para tornar a prioridade explícita: (1 <= 0) == true.
Operadores
Os operadores conectam fatores e constantes nas expressões condicionais. Há suporte para os seguintes operadores:
|
Operador |
Descrição |
Exemplo |
|
|
Igual a |
|
|
|
Diferente de |
|
|
|
Maior que |
|
|
|
Maior ou igual a |
|
|
|
Menor que |
|
|
|
Menor ou igual a |
|
|
|
Pertence a um array |
|
|
|
Não pertence a um array |
|
|
|
Corresponde a uma expressão regular |
|
|
|
Não corresponde a uma expressão regular |
|
|
|
O valor está vazio |
|
|
|
O valor não está vazio |
|
Escape de barra invertida em expressões regulares: Para incluir uma barra invertida literal (\) em um padrão regex, faça o escape dela com outra barra invertida. Por exemplo, escreva idx_\\w+ para corresponder a idx_\w+.
Fatores
Fatores são variáveis predefinidas que fornecem contexto durante a avaliação da regra de segurança, como o tipo de instrução SQL, o número de linhas afetadas ou se o alvo é um banco de dados lógico. Use-os nas cláusulas condicionais para criar regras baseadas nos metadados reais da operação.
O nome de um fator usa o formato @fac.<display-name>. O DMS fornece fatores diferentes para pontos de verificação distintos em cada módulo.
|
Fator |
Descrição |
|
|
Tipo de ambiente. Valores de exemplo: |
|
|
Tipo de instrução SQL. Valores de exemplo: |
|
|
Tipo de ticket de alteração de dados. Veja os valores válidos abaixo. |
|
|
Indica se o banco de dados alvo é um banco de dados lógico. |
|
|
Outras informações do ticket. Não utilizado atualmente. |
|
|
Indica se a validação de contagem de linhas deve ser ignorada. |
|
|
Número de linhas a serem inseridas. |
|
|
Número de linhas a serem atualizadas ou excluídas. |
|
|
Tamanho do maior tablespace que contém a tabela a ser modificada. |
|
|
Indica se a instrução SQL envolve campos sensíveis. |
|
|
Campos sensíveis envolvidos na instrução SQL. |
|
|
Nível de risco da operação. |
|
|
Motivo do nível de risco atribuído. |
|
|
Lista de nomes de bancos de dados selecionados no ticket. |
Valores válidos para @fac.detail_type:
|
Valor |
Tipo de ticket |
|
|
Normal Data Modify |
|
|
Lockless Change |
|
|
Programmable Object |
|
|
History Data Clean |
|
|
Large Data Import |
Exemplo: Verificar se uma instrução SQL é do tipo DML:
@fac.sql_type == 'DML'
Cláusulas de ação
Uma ação define o que o DMS faz quando uma condição é atendida. Os nomes das ações usam o formato @act.<display-name>. O DMS fornece ações diferentes para pontos de verificação distintos em cada módulo.
| Ação | Descrição |
|---|---|
@act.allow_submit |
Exige que as instruções SQL sejam enviadas para execução em um ticket. |
@act.allow_execute_direct |
Permite executar instruções SQL no SQL Console. |
@act.forbid_execute |
Bloqueia a execução de instruções SQL. |
@act.mark_risk |
Marca a operação com um nível de risco e uma mensagem personalizada. Exemplo: @act.mark_risk 'middle' 'Medium risk: online environment' |
@act.do_not_approve |
Especifica o ID de um modelo de aprovação. Consulte Configurar processos de aprovação. |
@act.choose_approve_template |
|
@act.choose_approve_template_with_reason |
Funções predefinidas
É possível usar funções predefinidas tanto em cláusulas condicionais quanto em cláusulas de ação. Os nomes das funções usam o formato @fun.<display-name>.
|
Função |
Entrada |
Saída |
Descrição |
|
|
Múltiplas strings |
String |
Concatena strings em uma única string. |
|
|
Uma string |
Inteiro |
Retorna o comprimento de uma string. |
|
|
Uma string |
Booleano |
Retorna |
|
|
Uma string |
Booleano |
Retorna |
|
|
Um array |
Inteiro |
Retorna o número de elementos em um array. |
|
|
Múltiplos valores numéricos |
Numérico |
Soma múltiplos valores. |
|
|
Dois valores numéricos |
Numérico |
Subtrai o segundo valor do primeiro. |
|
|
Três valores: alvo, limite inferior, limite superior |
Booleano |
Retorna |
|
|
Nenhuma |
String |
Retorna a data e hora atuais no formato |
|
|
Nenhuma |
String |
Retorna a data atual no formato |
|
|
Nenhuma |
String |
Retorna a hora atual no formato |
|
|
Duas strings |
Booleano |
Retorna |
|
|
Duas listas de strings |
Booleano |
Retorna |
Exemplos selecionados:
Concatenação de strings:
@fun.concat('d', 'm', 's')
// Output: 'dms'
@fun.concat('[Development standards] Enter a comment for the [', @fac.column_name, '] field.')
// Output: a reminder message with the field name inserted
Verificação se um valor numérico está dentro de um intervalo:
@fun.between(@fac.export_rows, 2001, 100000)
// Returns true if the number of exported rows is between 2,001 and 100,000
@fun.between(@fun.current_datetime(), '2019-10-31 00:00:00', '2019-11-04 00:00:00')
// Returns true if the current date and time fall within the specified window
Verificação de igualdade de listas:
@fun.listEqualIgnoreOrder(@fac.perm_type, ['QUERY'])
// Returns true if only the query permission is requested
@fun.listEqualIgnoreOrder(@fac.perm_type, ['CORRECT', 'EXPORT'])
// Returns true if both the change and export permissions are requested
Exemplos
Limitar o número de instruções SQL por ticket
Bloqueie o envio se um ticket contiver mais de 1.000 instruções SQL:
if
@fac.sql_count > 1000
then
@act.reject_execute 'The number of SQL statements in a ticket cannot exceed 1,000.'
end
Se a contagem exceder 1.000, o DMS rejeita o ticket e exibe a mensagem.
Permitir apenas instruções DML
Permita o envio apenas quando todas as instruções SQL forem operações DML:
if
@fac.sql_type in ['UPDATE', 'DELETE', 'INSERT', 'INSERT_SELECT']
then
@act.allow_submit
end