Exemplos de consultas SQL

Este documento contém exemplos de consultas sobre entradas de registo armazenadas em contentores de registos atualizados para usar o Log Analytics. Nestes contentores, pode executar consultas SQL a partir da página Log Analytics na Google Cloud consola. Para ver mais exemplos, consulte os repositórios do GitHub logging-analytics-samples e security-analytics.

Este documento não descreve o SQL nem como encaminhar e armazenar entradas de registo. Para informações sobre esses tópicos, consulte a secção O que se segue.

Os exemplos nesta página consultam visualizações de registos. Para consultar uma vista de estatísticas, use o seguinte formato de caminho: `analytics_view.PROJECT_ID.LOCATION.ANALYTICS_VIEW_ID`. Na expressão anterior, PROJECT_ID é o ID do seu projeto e LOCATION e ANALYTICS_VIEW_ID são a localização e o nome da sua vista do Analytics.

Compatibilidade com a linguagem SQL

As consultas usadas na página Log Analytics suportam funções do GoogleSQL com algumas exceções.

Os seguintes comandos SQL não são suportados para consultas SQL emitidas através da página Log Analytics:

  • Comandos DDL e DML
  • Funções definidas pelo utilizador em JavaScript
  • Funções do BigQuery ML
  • Variáveis SQL

O seguinte só é suportado quando consulta um conjunto de dados associado através das páginas do BigQuery Studio e do Looker Studio, ou através da ferramenta de linha de comandos bq:

  • Funções definidas pelo utilizador em JavaScript
  • Funções do BigQuery ML
  • Variáveis SQL

Práticas recomendadas

Para definir o intervalo de tempo da sua consulta, recomendamos que use o seletor de intervalo de tempo. Por exemplo, para ver os dados da semana anterior, selecione Últimos 7 dias no seletor de intervalo de tempo. Também pode usar o seletor de intervalo de tempo para especificar uma hora de início e de fim, especificar uma hora para ver os dados e alterar os fusos horários.

Se incluir um campo timestamp na cláusula WHERE, a definição do seletor de intervalo de tempo não é usada. O exemplo seguinte ilustra como filtrar por data/hora:

-- Matches log entries whose timestamp is within the most recent 1 hour.
WHERE timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)

Para mais informações sobre como filtrar por hora, consulte as funções de tempo e as funções de data/hora.

Antes de começar

Esta secção descreve os passos que tem de concluir antes de poder usar a Log Analytics.

Configure contentores de registos

Certifique-se de que os contentores de registos foram atualizados para usar o Log Analytics:

  1. Na Google Cloud consola, aceda à página Armazenamento de registos:

    Aceda a Armazenamento de registos

    Se usar a barra de pesquisa para encontrar esta página, selecione o resultado cuja legenda é Registo.

  2. Para cada contentor de registos que tenha uma visualização de registos que quer consultar, certifique-se de que a coluna Log Analytics disponível apresenta Abrir. Se for apresentado o botão Atualizar, clique nele e preencha a caixa de diálogo.

Configure funções e autorizações do IAM

Esta secção descreve as funções ou as autorizações da IAM necessárias para usar o Log Analytics:

  • Para receber as autorizações de que precisa para usar o Log Analytics e consultar visualizações de registos, peça ao seu administrador que lhe conceda as seguintes funções de IAM no seu projeto:

    Pode restringir um principal a uma vista de registos específica adicionando uma condição de IAM à concessão da função Logs View Accessor feita ao nível do projeto ou adicionando uma associação de IAM ao ficheiro de política da vista de registos. Para mais informações, consulte o artigo Controle o acesso a uma vista de registo.

    Estas são as mesmas autorizações de que precisa para ver entradas de registo na página do Explorador de registos. Para ver informações sobre funções adicionais necessárias para consultar visualizações em contentores definidos pelo utilizador ou para consultar a visualização _AllLogs do contentor de registos _Default, consulte Funções do Cloud Logging.

  • Para receber as autorizações de que precisa para consultar visualizações de propriedade do Analytics, peça ao seu administrador para lhe conceder a função de IAM Utilizador do Observability Analytics (roles/observability.analyticsUser) no seu projeto.

Como usar as consultas nesta página

  1. Na Google Cloud consola, aceda à página Log Analytics:

    Aceda ao Log Analytics

    Se usar a barra de pesquisa para encontrar esta página, selecione o resultado cuja legenda é Registo.

  2. No painel Consulta, clique em  SQL e, de seguida, copie e cole uma consulta no painel de consultas SQL.

    Antes de copiar uma consulta, na cláusula FROM, substitua os seguintes campos

    • PROJECT_ID: o identificador do projeto.
    • LOCATION: a localização da vista de registo ou da vista de estatísticas.
    • BUCKET_ID: o nome ou o ID do contentor de registos.
    • LOG_VIEW_ID: o identificador da vista de registo, que está limitado a 100 carateres e só pode incluir letras, dígitos, sublinhados e hífenes.

    O exemplo seguinte mostra o formato da cláusula FROM para uma visualização de registo:

    FROM `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
    

    As amostras de registos nesta página consultam uma vista de registos. Para consultar uma vista de estatísticas, use o seguinte formato de caminho: `analytics_view.PROJECT_ID.LOCATION.ANALYTICS_VIEW_ID`. Na expressão anterior, PROJECT_ID é o ID do seu projeto e LOCATION e ANALYTICS_VIEW_ID são a localização e o nome da sua vista do Analytics.

Para usar as consultas apresentadas neste documento na página do BigQuery Studio ou para usar a ferramenta de linha de comandos bq, edite a cláusula FROM e introduza o caminho para o conjunto de dados associado. Por exemplo, para consultar a _AllLogsvisualização de propriedade no conjunto de dados associado denominado mydataset, que está no projeto myproject, o caminho é myproject.mydataset._AllLogs.

Exemplos de utilização comuns

Esta secção apresenta vários exemplos de utilização comuns que podem ajudar a criar as suas consultas personalizadas.

Mostrar entradas do registo no contentor de registos predefinido

Para consultar o contentor _Default, execute a seguinte consulta:

SELECT
  timestamp, severity, resource.type, log_name, text_payload, proto_payload, json_payload
FROM
  `PROJECT_ID.LOCATION._Default._AllLogs`
-- Limit to 1000 entries
LIMIT 1000

Extraia o valor do campo por expressão regular

Para extrair um valor de uma string através de uma expressão regular, use a função REGEXP_EXTRACT:

SELECT
  -- Display the timestamp, and the part of the name that begins with test.
  timestamp, REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") AS name,
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  -- Get the value of jobName, which is a subfield in a JSON structure.
  JSON_VALUE(json_payload.jobName) IS NOT NULL
ORDER BY timestamp DESC
LIMIT 20

Para mais informações, consulte a REGEXP_EXTRACT documentação.

Para correspondências de substring, como na consulta anterior, a utilização da função CONTAINS_SUBSTR resulta numa consulta mais eficiente.

Filtre entradas do registo

Para aplicar um filtro à sua consulta, adicione uma cláusula WHERE. A sintaxe que usa nesta cláusula depende do tipo de dados do campo. Esta secção apresenta vários exemplos de diferentes tipos de dados.

Filtre entradas de registo por tipo de carga útil

As entradas do registo podem ter um de três tipos de carga útil. Para filtrar as entradas do registo pelo tipo de carga útil, use uma das seguintes cláusulas:

  • Payloads de texto

    -- Matches log entries that have a text payload.
    WHERE text_payload IS NOT NULL
    
  • Payloads JSON

    -- Matches log entries that have a JSON payload.
    WHERE json_payload IS NOT NULL
    
  • Payloads de protocolo

    -- Matches log entries that have a proto payload.
    -- Because proto_payload has a data type of RECORD, this statement tests
    -- whether a mandatory subfield exits.
    WHERE proto_payload.type IS NOT NULL
    

Nos resultados da consulta, os campos json_payload e proto_payload são renderizados em JSON, que pode explorar.

Filtre os dados de registo por indicação de tempo

Para filtrar as entradas do registo pela respetiva indicação de tempo, recomendamos que use o seletor de intervalo de tempo. No entanto, também pode especificar o timestamp na cláusula WHERE:

-- Matches log entries whose timestamp is within the most recent hour
WHERE timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)

Para mais informações sobre como filtrar por hora, consulte os artigos Funções de tempo e Funções de data/hora.

Filtre por recurso

Para filtrar os dados de registo por recurso, adicione uma declaração resource.type à cláusula WHERE:

-- Matches log entries whose resource type is gce_instance
WHERE resource.type = "gce_instance"

Filtre por gravidade

Para filtrar os dados do registo por gravidade, adicione uma declaração severity à cláusula WHERE:

-- Matches log entries whose severity is INFO or ERROR
WHERE severity IS NOT NULL AND severity IN ('INFO', 'ERROR')

Também pode filtrar as entradas do registo pelo severity_number, que é um número inteiro. Por exemplo, a seguinte cláusula corresponde a todas as entradas de registo cujo nível de gravidade seja, pelo menos, NOTICE:

-- Matches log entries whose severity level is at least NOTICE
WHERE severity_number IS NOT NULL AND severity_number > 200

Para informações sobre os valores enumerados, consulte LogSeverity.

Filtre por nome do registo

Para filtrar os dados de registo por um nome de registo, adicione uma declaração log_name ou log_id à cláusula WHERE:

  • O nome do registo especifica o caminho do recurso:

    -- Matches log entries that have the following log ID.
    WHERE log_name="projects/cloud-logs-test-project/logs/cloudaudit.googleapis.com%2Factivity"
    
  • O ID do registo omite o caminho do recurso:

    -- Matches log entries that have the following log id.
    WHERE log_id = "cloudaudit.googleapis.com/data_access"
    

Filtre entradas do registo por etiqueta de recurso

As etiquetas de recursos são armazenadas como uma estrutura JSON. Para filtrar pelo valor de um campo numa estrutura JSON, use a função JSON_VALUE:

SELECT
  timestamp, JSON_VALUE(resource.labels.zone) AS zone, json_payload, resource, labels
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  -- Matches log entries whose resource type is gce_instance and whose zone is
  -- us-central1-f. Because resource has data type JSON, you must use JSON_VALUE
  -- to get the value for subfields, like zone.
  resource.type = "gce_instance" AND
  JSON_VALUE(resource.labels.zone) = "us-central1-f"
ORDER BY timestamp ASC

A consulta anterior baseia-se no formato das etiquetas de recursos, uma vez que são armazenadas numa entrada de registo. Segue-se um exemplo do campo de recurso:

{
   type: "gce_instance"
   labels: {
      instance_id: "1234512345123451"
      project_id: "my-project"
      zone: "us-central1-f"
   }
}

Para obter informações sobre todas as funções que podem obter e transformar dados JSON, consulte as funções JSON.

Filtre por pedido HTTP

Para consultar apenas entradas do registo que tenham um campo de pedido HTTP, use a seguinte cláusula:

-- Matches log entries that have a HTTP request_method field.
-- Don't compare http_request to NULL. This field has a data type of RECORD.
WHERE http_request.request_method IS NOT NULL

Também pode usar a declaração IN:

-- Matches log entries whose HTTP request_method is GET or POST.
WHERE http_request.request_method IN ('GET', 'POST')

Filtre por estado de HTTP

Para consultar apenas entradas do registo que tenham um estado HTTP, use a seguinte cláusula:

-- Matches log entries that have an http_request.status field.
WHERE http_request.status IS NOT NULL

Filtre por um campo num tipo de dados JSON

Para consultar apenas entradas de registo quando o subcampo de um campo com um tipo de dados JSON tem um valor específico, extraia o valor através da função JSON_VALUE:

-- Compare the value of the status field to NULL.
WHERE JSON_VALUE(json_payload.status) IS NOT NULL

A cláusula anterior é ligeiramente diferente da seguinte cláusula:

-- Compare the status field to NULL.
WHERE json_payload.status IS NOT NULL

A primeira cláusula testa se o valor do campo de estado é NULL. A segunda cláusula testa se o campo de estado existe. Suponhamos que uma vista de registo contém duas entradas de registo. Para uma entrada de registo, o campo json_payload tem o seguinte formato:

{
    status: {
        measureTime: "1661517845"
    }
}

Para a outra entrada do registo, o campo json_payload tem uma estrutura diferente:

{
    @type: "type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished"
    jobName: "projects/my-project/locations/us-central1/jobs/test1"
    relativeUrl: "/food=cake"
    status: "NOT_FOUND"
    targetType: "APP_ENGINE_HTTP"
}

A cláusula WHERE json_payload.status IS NOT NULL corresponde a ambas as entradas do registo. No entanto, a cláusula WHERE JSON_VALUE(json_payload.status) IS NOT NULL only corresponde apenas à segunda entrada do registo.

Agrupe e agregue entradas de registo

Esta secção baseia-se nos exemplos anteriores e ilustra como pode agrupar e agregar entradas do registo. Se não especificar um agrupamento, mas especificar uma agregação, é impresso um resultado porque o SQL trata todas as linhas que satisfazem a cláusula WHERE como um grupo.

Todas as expressões SELECT têm de ser incluídas nos campos de grupo ou agregadas.

Agrupe as entradas do registo por indicação de tempo

Para agrupar dados por indicação de tempo, use a função TIMESTAMP_TRUNC, que trunca uma indicação de tempo para um nível de detalhe especificado, como HOUR:

SELECT
  -- Truncate the timestamp by hour.
  TIMESTAMP_TRUNC(timestamp, HOUR) AS hour,
  JSON_VALUE(json_payload.status) AS status,
  -- Count the number log entries in each group.
  COUNT(*) AS count
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  -- Matches log entries that have a status field whose value isn't NULL.
  json_payload IS NOT NULL AND JSON_VALUE(json_payload.status) IS NOT NULL
GROUP BY
  -- Group by hour and status
  hour,status
ORDER BY hour ASC

Para mais informações, consulte a documentação e as funções de data/hora.TIMESTAMP_TRUNC

Agrupe as entradas do registo por recurso

A consulta seguinte mostra como agrupar as entradas do registo pelo tipo de recurso e, em seguida, contabilizar o número de entradas do registo em cada grupo:

SELECT
   -- Count the number of log entries for each resource type
   resource.type, COUNT(*) AS count
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
GROUP BY resource.type
LIMIT 100

Agrupe as entradas do registo por gravidade

A consulta seguinte mostra como agrupar as entradas do registo por gravidade e, em seguida, contabilizar o número de entradas do registo em cada grupo:

SELECT
  -- Count the number of log entries for each severity.
  severity, COUNT(*) AS count
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  severity IS NOT NULL
GROUP BY severity
ORDER BY severity
LIMIT 100

Agrupe as entradas de registo pelo respetivo log_id

A consulta seguinte mostra como agrupar as entradas do registo pelo ID do registo e, em seguida, contabilizar o número de entradas do registo em cada grupo:

SELECT
  -- Count the number of log entries for each log ID.
  log_id, COUNT(*) AS count
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
GROUP BY log_id
ORDER BY count DESC
LIMIT 100

Calcular a latência média dos pedidos HTTP por URL

A consulta seguinte ilustra como agrupar as entradas do registo pelo URL do pedido HTTP e pela localização e, em seguida, contabilizar o número de entradas do registo em cada grupo:

SELECT
  -- Compute the average latency for each group. Because the labels field has a
  -- data type of JSON, use JSON_VALUE to get the value of checker_location.
  JSON_VALUE(labels.checker_location) AS location,
  AVG(http_request.latency.seconds) AS secs, http_request.request_url
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  -- Matches log entries when the request_method field is GET.
  http_request IS NOT NULL AND http_request.request_method IN ('GET')
GROUP BY
  -- Group by request URL and location
  http_request.request_url, location
ORDER BY location
LIMIT 100

Calcule a média de bytes enviados para um teste de sub-rede

A consulta seguinte mostra como agrupar as entradas do registo pela localização especificada nas etiquetas de recursos e, em seguida, calcular o número de entradas do registo em cada grupo:

SELECT
  -- Compute the average number of bytes sent per location. Because labels has
  -- a data type of JSON, use JSON_VALUE to get the value of the location field.
  -- bytes_sent is a string. Must cast to a FLOAT64 before computing average.
  JSON_VALUE(resource.labels.location) AS location,
  AVG(CAST(JSON_VALUE(json_payload.bytes_sent) AS FLOAT64)) AS bytes
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  resource.type = "gce_subnetwork" AND json_payload IS NOT NULL
GROUP BY
  -- Group by location
  location
LIMIT 100

Para mais informações, consulte as funções JSON e as funções de conversão.

Contar as entradas de registo com um campo que corresponde a um padrão

Para devolver a substring que corresponde a uma expressão regular, use a função REGEXP_EXTRACT:

SELECT
  -- Extract the value that begins with test.
  -- Count the number of log entries for each name.
  REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") AS name,
  COUNT(*) AS count
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
  json_payload.jobName IS NOT NULL
GROUP BY name
ORDER BY count
LIMIT 20

Para ver exemplos adicionais, consulte a REGEXP_EXTRACT documentação.

Esta secção descreve duas abordagens que pode usar para pesquisar várias colunas da vista que está a consultar:

  • Pesquisas baseadas em tokens: especifica a localização da pesquisa, uma consulta de pesquisa e, em seguida, usa a função SEARCH. Uma vez que a função SEARCH tem regras específicas sobre a forma como os dados são pesquisados, recomendamos que leia a SEARCH documentação.

  • Pesquisas baseadas em subcadeias: fornece a localização da pesquisa, um literal de string e, em seguida, usa a função CONTAINS_SUBSTR. O sistema realiza um teste não sensível a maiúsculas e minúsculas para determinar se o literal de string existe numa expressão. A função CONTAINS_SUBSTR devolve TRUE quando o literal de string existe e FALSE caso contrário. O valor de pesquisa tem de ser um literal STRING, mas não o literal NULL.

A consulta seguinte retém apenas as linhas que têm um campo que corresponde exatamente a "35.193.12.15":

SELECT
  timestamp, log_id, proto_payload, severity, resource.type, resource, labels
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID` AS t
WHERE
  -- Search data access audit logs for the IP address that matches 35.193.12.15.
  -- The use of backticks prevents the string from being tokenized.
  proto_payload IS NOT NULL AND
  log_id = "cloudaudit.googleapis.com/data_access" AND
  SEARCH(t,"`35.193.12.15`")
ORDER BY timestamp ASC
LIMIT 20

Quando os acentos graves são omitidos na string de consulta, a string de consulta é dividida com base nas regras definidas na documentação SEARCH. Por exemplo, quando a seguinte declaração é executada, a string de consulta é dividida em quatro tokens: "35", "193", "12" e "15":

  SEARCH(t,"35.193.12.15")

A declaração SEARCH anterior corresponde a uma linha quando um único campo corresponde a todos os quatro tokens. A ordem dos tokens não é importante.

Pode incluir várias declarações SEARCH numa consulta. Por exemplo, na consulta anterior, pode substituir o filtro no ID do registo por uma declaração como a seguinte:

  SEARCH(t,"`cloudaudit.googleapis.com/data_access`")

A declaração anterior pesquisa todos os campos das entradas do registo na vista de registo, enquanto a declaração original pesquisa apenas o campo log_id das entradas do registo.

Para fazer várias pesquisas em vários campos, separe as strings individuais com um espaço. Por exemplo, a seguinte declaração corresponde a linhas em que um campo contém "Hello World", "happy" e "days":

  SEARCH(t,"`Hello World` happy days")

Por último, pode pesquisar campos específicos em vez de pesquisar uma tabela inteira. Por exemplo, a seguinte declaração só pesquisa nas colunas denominadas text_payload e json_payload:

   SEARCH((text_payload, json_payload) ,"`35.222.132.245`")

Para ver informações sobre como os parâmetros da função SEARCH são processados, consulte a página de referência do BigQuery Funções de pesquisa.

Por exemplo, a seguinte consulta obtém todas as entradas do registo de auditoria de acesso aos dados com um endereço IP específico cujas datas/horas estão num intervalo de tempo específico. Por último, a consulta ordena os resultados e, em seguida, apresenta os 20 resultados mais antigos:

SELECT
  timestamp, log_id, proto_payload, severity, resource.type, resource, labels
FROM
  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID` AS t
WHERE
  -- Search data access audit logs for the IP address that matches 35.193.12.15.
  -- CONTAINS_SUBSTR performs a contains-test.
  proto_payload IS NOT NULL AND
  log_id = "cloudaudit.googleapis.com/data_access" AND
  CONTAINS_SUBSTR(t,"35.193.12.15")
ORDER BY timestamp ASC
LIMIT 20

Consulte várias vistas

As declarações de consulta analisam uma ou mais tabelas ou expressões e devolvem as linhas de resultados calculadas. Por exemplo, pode usar declarações de consulta para unir os resultados de declarações SELECT em diferentes tabelas ou conjuntos de dados de várias formas e, em seguida, selecionar as colunas dos dados combinados.

Quando consulta várias vistas, estas têm de estar na mesma localização. Por exemplo, se duas vistas estiverem localizadas na localização us-east1, uma consulta pode consultar ambas as vistas. Também pode consultar duas vistas localizadas na us multirregião. No entanto, se a localização de uma visualização for global, essa visualização pode estar em qualquer localização física. Por conseguinte, as junções entre duas vistas que tenham a localização de global podem falhar.

Junte duas vistas de registo pelo ID do rastreio

Para combinar informações de duas tabelas, use um dos operadores join:

SELECT
  -- Do an inner join on two tables by using the span ID and trace ID.
  -- Don't join only by span ID, as this field isn't globally unique.
  -- From the first view, show the timestamp, severity, and JSON payload.
  -- From the second view, show the JSON payload.
  a.timestamp, a.severity, a.json_payload, b.json_payload, a.span_id, a.trace
FROM  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_1` a
JOIN  `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_2` b
ON
  a.span_id = b.span_id AND
  a.trace = b.trace
LIMIT 100

Consulte duas vistas de registos com uma declaração de união

Para combinar os resultados de duas ou mais declarações SELECT e rejeitar linhas duplicadas, use o operador UNION. Para reter linhas duplicadas, use o operador UNION ALL:

SELECT
  timestamp, log_name, severity, json_payload, resource, labels
-- Create a union of two log views
FROM(
  SELECT * FROM `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_1`
  UNION ALL
  SELECT * FROM `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_2`
)
-- Sort the union by timestamp.
ORDER BY timestamp ASC
LIMIT 100

Remova entradas de registo duplicadas

O Log Analytics não remove entradas de registo duplicadas antes de uma consulta ser executada. Este comportamento é diferente do que acontece quando consulta entradas de registo através do Explorador de registos, que remove entradas duplicadas comparando os nomes dos registos, as datas/horas e os campos de ID de inserção.

Pode usar a validação ao nível da linha para remover entradas de registo duplicadas.

Para mais informações, consulte o artigo Resolva problemas: existem entradas de registo duplicadas nos meus resultados do Log Analytics.

O que se segue?

Para obter informações sobre como encaminhar e armazenar entradas do registo, consulte os seguintes documentos:

Para ver a documentação de referência de SQL, consulte os seguintes documentos: