Dados do serviço
Consultar e alterar dados de uma base de dados implantada, a partir do terminal.
eqs db executa uma instrução numa base de dados que instalou pelo marketplace. É a api que guarda as credenciais, verifica a permissão e regista o que correu, portanto nada precisa de ser copiado para a sua máquina primeiro.
Leitura. Quem garante que é só leitura é o motor, não uma leitura nossa da sua instrução.
eqs db query pg-main "select id, email from users order by id desc"Altera linhas: insert, update, delete.
eqs db exec pg-main "delete from sessions where expires_at < now()"Altera a estrutura: create, alter, drop. Tem permissão própria.
eqs db ddl pg-main "alter table users add column nickname text"O que o serviço guarda: tabelas, coleções, ou etiquetas e tipos de relação.
eqs db tables pg-mainAs colunas de uma tabela, os índices de uma coleção ou as propriedades observadas numa etiqueta.
eqs db describe pg-main usersA instrução é a do próprio motor
Não há um dialecto comum para aprender, e é de propósito. Uma linguagem que cobrisse SQL, comandos Redis, documentos Mongo e Cypher ao mesmo tempo seria uma versão pior de cada um deles. Uniforme é tudo o que está à volta da instrução: como endereça o serviço, que permissão precisa, como o resultado volta e o que fica registado.
| Motor | Instrução | Parâmetros |
|---|---|---|
| PostgreSQL | SQL | $1, $2 … |
| MySQL / MariaDB | SQL | ? |
| ClickHouse | SQL | {p1:String} … |
| Redis | uma linha de comando | acrescentados como argumentos |
| MongoDB | um documento de comando JSON | nenhum — os valores estão no documento |
| Neo4j | Cypher | $p1, $p2 … |
eqs db query cache "LRANGE queue 0 -1" eqs db query docs '{"find":"users","filter":{"active":true},"limit":20}' eqs db query graph "MATCH (p:Person) RETURN p.name AS name LIMIT 10"
Quanto é que o "apenas leitura" segura
O eqs db query nunca adivinha se a sua instrução escreve. Ler SQL para decidir
isso é frágil e falha aberto, por isso quem decide é o motor — e a saída diz-lhe
qual das três respostas obteve.
| Motores | O que significa | |
|---|---|---|
enforced | PostgreSQL, MySQL, ClickHouse, Neo4j | O próprio motor recusa a escrita, dentro de uma transacção apenas de leitura. Nada teve de ser detectado |
checked | Redis, MongoDB | O motor classificou o comando e nós recusámos com base na resposta dele. Continua a não ser um palpite sobre a sua instrução, mas pode deixar passar o que uma transacção não deixaria |
declared | — | O verbo foi uma declaração e o registo de auditoria é o que responde por ela |
checked: um aggregate do MongoDB terminado em $out ou $merge escreve, e o MongoDB classifica aggregate como leitura. Apanhá-lo obrigaria a interpretar o pipeline, que é precisamente o palpite que este desenho evita — por isso fica aqui escrito em vez de ser dado como resolvido.Permissões
Cada verbo exige a sua acção, e não se substituem umas às outras.
| Verbo | Exige | Quem tem |
|---|---|---|
query, tables, describe | data.read | Reader, Contributor, Owner |
exec | data.write | Contributor, Owner |
ddl | data.ddl | Owner |
data.ddl está separado de data.write de propósito: editar uma linha e
eliminar uma tabela não são o mesmo risco, e quem pode fazer a primeira não
deveria fazer a segunda sem dar por isso.
Valores, limites e o registo
--param a colar o valor dentro da instrução. É ligado pelo driver em vez de ser inserido no texto, portanto uma aspa ou um ponto e vírgula lá dentro são dados e nunca sintaxe — e ficam fora do registo de auditoria.Todas as instruções são registadas: quem correu, contra que serviço, quanto
tempo demorou e se resultou. As falhas também, porque uma instrução que deu erro
aconteceu na mesma. O que nunca é registado são os seus valores de --param,
que são os que mais provavelmente contêm dados pessoais.
As leituras param nas 100 linhas por omissão, e o limite é aplicado antes de as
linhas chegarem à api — um cursor no PostgreSQL, um resultado transmitido no
MySQL — por isso um select * largo nunca é carregado inteiro só para ser
cortado. Aumente com --limit, até 10000, e --timeout até 120000 ms. Quando o
resultado foi cortado, a saída di-lo, em vez de deixar parecer que era tudo.