SlideShare a Scribd company logo
1 of 50
Download to read offline
Ganhe tempo automatizando com SQL
por Dickson S. Guedes
Ganhe tempo automatizando com SQL?
por Dickson S. Guedes
Objetivo e regras
SQL como uma linguagem declarativa
VARIAVEL = ‘valor’
psql como uma ferramenta que
entende melhor o SQL
Ganhe tempo automatizando com psql
por Dickson S. Guedes
Sim, foi um clickbait
AGENDA
Nossa Jornada…
Variáveis
Macros
Reuso
Criando “comandos”
format e gexec
Considerações finais
Público alvo:
Iniciante
set sauda ola mundo
echo :sauda
echo :"sauda"
echo :'sauda'
set sauda "ola mundo"
set sauda 'ola mundo'
Variáveis no psql
set sauda select 'ola mundo!';
:sauda
… e se …
?
Dá para fazer macro no psql?
set top101 select * from pg_stat_activity order by 17, 13 desc limit 10;
set top102 "select * from pg_stat_activity order by 17, 13 desc limit 10;"
set top103 'select * from pg_stat_activity order by 17, 13 desc limit 10;'
Quais dos 3 acima funcionarão?
… e se …
set ss_film 'select * from film'
set ss_film_fields 'select title, description'
set ff_film ' from film'
set jj_film_actor ' join film_actor using (film_id)'
set jj_actor ' join actor using (actor_id)'
:ss_film
:ss_film_fields :ff_film
:ss_film_fields, first_name :ff_film :jj_film_actor :jj_actor
Vamos agora desconstruir
select *
from pg_stat_all_tables
where age(now(),
coalesce(
last_autoanalyze,
last_analyze,
now() - interval ‘1 year’)) > interval ‘10 days’
and relname !~ ‘^pg_toast_|sql_’
Vamos agora desconstruir
select *
from pg_stat_all_tables
where age(now(),
coalesce(
last_autoanalyze,
last_analyze,
now() - interval ‘1 year’))> interval ‘10 days’
and relname !~ ‘^pg_toast_|sql_’
Vamos agora desconstruir
select *
from pg_stat_all_tables
where age(now(),
:_analyze_mais_recente) > interval ‘10 days’
and relname !~ ‘^pg_toast_|sql_’
set _analyze_mais_recente 'coalesce(last_autoanalyze, last_analyze, now() - interval ''1 year'')'
Vamos agora desconstruir
select *
from pg_stat_all_tables
where age(now(),
:_analyze_mais_recente) > interval ‘10 days’
and relname !~ ‘^pg_toast_|sql_’
Vamos agora desconstruir
select *
from pg_stat_all_tables
where age(now(),
:_analyze_mais_recente) > interval ‘10 days’
and :_ignored_tables
set _ignored_tables 'relname !~ ''^pg_toast_|sql_'''
Podemos simplificar
select *
from pg_stat_all_tables
where age(now(),
:_analyze_mais_recente) > interval ‘10 days’
and :_ignored_tables
E chegamos a esta simplificação
ss_mant_tabelas_analisadas_ha_mais_de_10_dias
E podemos fazer isto …
with dados as (
:ss_mant_tabelas_analisadas_ha_mais_de_10_dias
)
select format('ANALYZE %I', relname) from dados gexec
E chegamos a esta simplificação
ss_mant_tabelas_analisadas_ha_mais_de_10_dias
E podemos fazer isto …
with dados as (
:ss_mant_tabelas_analisadas_ha_mais_de_10_dias
)
select format('ANALYZE %I', relname) from dados gexec
gexec e format( ) - a combinação perfeita
Vamos agora desconstruir
select format(
$$set ss_first_%1$I 'select * from %1$I limit 10;'$$,
tablename
)
from pg_tables
where schemaname !~ '(pg_catalog)'
g /home/guedes/extended_comands.sql
Vamos agora desconstruir
select format(
$$set ss_first_%1$I 'select * from %1$I limit 10;'$$,
tablename
)
from pg_tables
where schemaname !~ '(pg_catalog)'
g /home/guedes/extended_comands.sql
Vamos agora desconstruir
select format(
$$set ss_first_%1$I 'select * from %1$I limit 10;'$$,
tablename
)
from pg_tables
where schemaname !~ '(pg_catalog)'
g /home/guedes/extended_comands.sql
Vamos agora desconstruir
select format(
$$set ss_first_%1$I 'select * from %1$I limit 10;'$$,
tablename
)
from pg_tables
where schemaname !~ '(pg_catalog)'
g /home/guedes/extended_comands.sql
Vamos agora desconstruir
select format(
$$set ss_first_%1$I 'select * from %1$I limit 10;'$$,
tablename
)
from pg_tables
where schemaname !~ '(pg_catalog)'
g /home/guedes/extended_comands.sql
# .psqlrc
… corte …
echo 'gerando extended_commands.sql'
t on
select format(
$$set ss_first_%1$I 'select * from %1$I limit 10;'$$,
tablename
)
from pg_tables
where schemaname !~ '(pg_catalog)'
g /home/guedes/extended_comands.sql
t off
ir extended_commands.sql
Que mais dá para
fazer?
Hands on?
CURTIU?
SEGUE A GENTE!
…
Ganhando tempo automatizando com SQL

More Related Content

Similar to Ganhando tempo automatizando com SQL

Uso de estatísticas pelo postgre sql
Uso de estatísticas pelo postgre sqlUso de estatísticas pelo postgre sql
Uso de estatísticas pelo postgre sqlLocaweb
 
Relato Sobre a Migração de uma Aplicação Legada para Rails
Relato Sobre a Migração de uma Aplicação Legada para RailsRelato Sobre a Migração de uma Aplicação Legada para Rails
Relato Sobre a Migração de uma Aplicação Legada para RailsCássio Marques
 
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...Big Data Week São Paulo
 
Introdução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on RailsIntrodução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on RailsJulio Betta
 
MongoDB com a Turma do Chaves
MongoDB com a Turma do ChavesMongoDB com a Turma do Chaves
MongoDB com a Turma do ChavesPedro Menezes
 
Como Perder Peso (no browser)
Como Perder Peso (no browser)Como Perder Peso (no browser)
Como Perder Peso (no browser)Zeno Rocha
 
Técnicas de Refactoring
Técnicas de RefactoringTécnicas de Refactoring
Técnicas de RefactoringRodrigo Branas
 
Fluentd/LogStash + elastic search + kibana
Fluentd/LogStash + elastic search + kibanaFluentd/LogStash + elastic search + kibana
Fluentd/LogStash + elastic search + kibanaCésar Araújo
 
Monitoramento de Banco de dados SQL Server com Zabbix
Monitoramento de Banco de dados SQL Server com ZabbixMonitoramento de Banco de dados SQL Server com Zabbix
Monitoramento de Banco de dados SQL Server com ZabbixGustavo Henrique
 
Pré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache SparkPré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache SparkFelipe
 
Workshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + MongooseWorkshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + MongooseLuiz Duarte
 

Similar to Ganhando tempo automatizando com SQL (20)

Introdução ao MongoDB
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDB
 
Uso de estatísticas pelo postgre sql
Uso de estatísticas pelo postgre sqlUso de estatísticas pelo postgre sql
Uso de estatísticas pelo postgre sql
 
Relato Sobre a Migração de uma Aplicação Legada para Rails
Relato Sobre a Migração de uma Aplicação Legada para RailsRelato Sobre a Migração de uma Aplicação Legada para Rails
Relato Sobre a Migração de uma Aplicação Legada para Rails
 
Dinamizando Sites Estáticos
Dinamizando Sites EstáticosDinamizando Sites Estáticos
Dinamizando Sites Estáticos
 
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...
 
MRO predict
MRO predictMRO predict
MRO predict
 
MongoDB
MongoDBMongoDB
MongoDB
 
Aula1
Aula1Aula1
Aula1
 
Introdução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on RailsIntrodução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on Rails
 
MongoDB com a Turma do Chaves
MongoDB com a Turma do ChavesMongoDB com a Turma do Chaves
MongoDB com a Turma do Chaves
 
Como Perder Peso (no browser)
Como Perder Peso (no browser)Como Perder Peso (no browser)
Como Perder Peso (no browser)
 
Minicurso mongo db
Minicurso mongo dbMinicurso mongo db
Minicurso mongo db
 
Técnicas de Refactoring
Técnicas de RefactoringTécnicas de Refactoring
Técnicas de Refactoring
 
MongoDB - Iniciando e Conhecendo
MongoDB - Iniciando e ConhecendoMongoDB - Iniciando e Conhecendo
MongoDB - Iniciando e Conhecendo
 
Fluentd/LogStash + elastic search + kibana
Fluentd/LogStash + elastic search + kibanaFluentd/LogStash + elastic search + kibana
Fluentd/LogStash + elastic search + kibana
 
J query
J queryJ query
J query
 
Monitoramento de Banco de dados SQL Server com Zabbix
Monitoramento de Banco de dados SQL Server com ZabbixMonitoramento de Banco de dados SQL Server com Zabbix
Monitoramento de Banco de dados SQL Server com Zabbix
 
Implementação de
Implementação de Implementação de
Implementação de
 
Pré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache SparkPré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache Spark
 
Workshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + MongooseWorkshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + Mongoose
 

More from Dickson S. Guedes

O mínimo necessário que você precisa conhecer sobre computação quântica
O mínimo necessário que você precisa conhecer sobre computação quânticaO mínimo necessário que você precisa conhecer sobre computação quântica
O mínimo necessário que você precisa conhecer sobre computação quânticaDickson S. Guedes
 
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorPorque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorDickson S. Guedes
 
Pattern matching - O que é? Onde vive? Do que se alimenta? Como se reproduz?
Pattern matching - O que é? Onde vive? Do que se alimenta? Como se reproduz?Pattern matching - O que é? Onde vive? Do que se alimenta? Como se reproduz?
Pattern matching - O que é? Onde vive? Do que se alimenta? Como se reproduz?Dickson S. Guedes
 
Primeiros passos machine learning PostgreSQL
Primeiros passos machine learning PostgreSQLPrimeiros passos machine learning PostgreSQL
Primeiros passos machine learning PostgreSQLDickson S. Guedes
 
Dicas de sobrevivência de um DBA sem mouse
Dicas de sobrevivência de um DBA sem mouseDicas de sobrevivência de um DBA sem mouse
Dicas de sobrevivência de um DBA sem mouseDickson S. Guedes
 
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrarCuriosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrarDickson S. Guedes
 
Como encontrar uma agulha num palheiro de logs
Como encontrar uma agulha num palheiro de logsComo encontrar uma agulha num palheiro de logs
Como encontrar uma agulha num palheiro de logsDickson S. Guedes
 
Como encontrar uma agulha no palheiro de logs do PostgreSQL
Como encontrar uma agulha no palheiro de logs do PostgreSQLComo encontrar uma agulha no palheiro de logs do PostgreSQL
Como encontrar uma agulha no palheiro de logs do PostgreSQLDickson S. Guedes
 
Gerenciando múltiplas versões do PostgreSQL com pgvm
Gerenciando múltiplas versões do PostgreSQL com pgvmGerenciando múltiplas versões do PostgreSQL com pgvm
Gerenciando múltiplas versões do PostgreSQL com pgvmDickson S. Guedes
 
PGXN - Como distribuir suas extensões com o PostgreSQL
PGXN - Como distribuir suas extensões com o PostgreSQLPGXN - Como distribuir suas extensões com o PostgreSQL
PGXN - Como distribuir suas extensões com o PostgreSQLDickson S. Guedes
 
Plante uma árvore, escreva um livro, tenha um filho e contribua com software ...
Plante uma árvore, escreva um livro, tenha um filho e contribua com software ...Plante uma árvore, escreva um livro, tenha um filho e contribua com software ...
Plante uma árvore, escreva um livro, tenha um filho e contribua com software ...Dickson S. Guedes
 
Conhecendo Postgresql.- ENECOMP 2009
Conhecendo Postgresql.- ENECOMP 2009Conhecendo Postgresql.- ENECOMP 2009
Conhecendo Postgresql.- ENECOMP 2009Dickson S. Guedes
 
Minicurso Postgresql - Enecomp 2009
Minicurso Postgresql - Enecomp 2009Minicurso Postgresql - Enecomp 2009
Minicurso Postgresql - Enecomp 2009Dickson S. Guedes
 
Testes unitarios no PostgreSQL com pgTAP
Testes unitarios no PostgreSQL com pgTAPTestes unitarios no PostgreSQL com pgTAP
Testes unitarios no PostgreSQL com pgTAPDickson S. Guedes
 
pgScript: um Elefante de barriga cheia
pgScript: um Elefante de barriga cheiapgScript: um Elefante de barriga cheia
pgScript: um Elefante de barriga cheiaDickson S. Guedes
 
Replicacao Sincrona "Nao existe almoco gratis!"
Replicacao Sincrona "Nao existe almoco gratis!"Replicacao Sincrona "Nao existe almoco gratis!"
Replicacao Sincrona "Nao existe almoco gratis!"Dickson S. Guedes
 

More from Dickson S. Guedes (20)

O mínimo necessário que você precisa conhecer sobre computação quântica
O mínimo necessário que você precisa conhecer sobre computação quânticaO mínimo necessário que você precisa conhecer sobre computação quântica
O mínimo necessário que você precisa conhecer sobre computação quântica
 
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorPorque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
 
Pattern matching - O que é? Onde vive? Do que se alimenta? Como se reproduz?
Pattern matching - O que é? Onde vive? Do que se alimenta? Como se reproduz?Pattern matching - O que é? Onde vive? Do que se alimenta? Como se reproduz?
Pattern matching - O que é? Onde vive? Do que se alimenta? Como se reproduz?
 
Primeiros passos machine learning PostgreSQL
Primeiros passos machine learning PostgreSQLPrimeiros passos machine learning PostgreSQL
Primeiros passos machine learning PostgreSQL
 
Dicas de sobrevivência de um DBA sem mouse
Dicas de sobrevivência de um DBA sem mouseDicas de sobrevivência de um DBA sem mouse
Dicas de sobrevivência de um DBA sem mouse
 
Destistificando o EXPLAIN
Destistificando o EXPLAIN Destistificando o EXPLAIN
Destistificando o EXPLAIN
 
Se meu elefante falasse
Se meu elefante falasseSe meu elefante falasse
Se meu elefante falasse
 
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrarCuriosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
 
O Elefante Poliglota
O Elefante PoliglotaO Elefante Poliglota
O Elefante Poliglota
 
Como encontrar uma agulha num palheiro de logs
Como encontrar uma agulha num palheiro de logsComo encontrar uma agulha num palheiro de logs
Como encontrar uma agulha num palheiro de logs
 
Como encontrar uma agulha no palheiro de logs do PostgreSQL
Como encontrar uma agulha no palheiro de logs do PostgreSQLComo encontrar uma agulha no palheiro de logs do PostgreSQL
Como encontrar uma agulha no palheiro de logs do PostgreSQL
 
Gerenciando múltiplas versões do PostgreSQL com pgvm
Gerenciando múltiplas versões do PostgreSQL com pgvmGerenciando múltiplas versões do PostgreSQL com pgvm
Gerenciando múltiplas versões do PostgreSQL com pgvm
 
PGXN - Como distribuir suas extensões com o PostgreSQL
PGXN - Como distribuir suas extensões com o PostgreSQLPGXN - Como distribuir suas extensões com o PostgreSQL
PGXN - Como distribuir suas extensões com o PostgreSQL
 
Pgxn.pgday
Pgxn.pgdayPgxn.pgday
Pgxn.pgday
 
Plante uma árvore, escreva um livro, tenha um filho e contribua com software ...
Plante uma árvore, escreva um livro, tenha um filho e contribua com software ...Plante uma árvore, escreva um livro, tenha um filho e contribua com software ...
Plante uma árvore, escreva um livro, tenha um filho e contribua com software ...
 
Conhecendo Postgresql.- ENECOMP 2009
Conhecendo Postgresql.- ENECOMP 2009Conhecendo Postgresql.- ENECOMP 2009
Conhecendo Postgresql.- ENECOMP 2009
 
Minicurso Postgresql - Enecomp 2009
Minicurso Postgresql - Enecomp 2009Minicurso Postgresql - Enecomp 2009
Minicurso Postgresql - Enecomp 2009
 
Testes unitarios no PostgreSQL com pgTAP
Testes unitarios no PostgreSQL com pgTAPTestes unitarios no PostgreSQL com pgTAP
Testes unitarios no PostgreSQL com pgTAP
 
pgScript: um Elefante de barriga cheia
pgScript: um Elefante de barriga cheiapgScript: um Elefante de barriga cheia
pgScript: um Elefante de barriga cheia
 
Replicacao Sincrona "Nao existe almoco gratis!"
Replicacao Sincrona "Nao existe almoco gratis!"Replicacao Sincrona "Nao existe almoco gratis!"
Replicacao Sincrona "Nao existe almoco gratis!"
 

Ganhando tempo automatizando com SQL

  • 1. Ganhe tempo automatizando com SQL por Dickson S. Guedes
  • 2. Ganhe tempo automatizando com SQL? por Dickson S. Guedes
  • 4.
  • 5.
  • 6.
  • 7. SQL como uma linguagem declarativa VARIAVEL = ‘valor’
  • 8. psql como uma ferramenta que entende melhor o SQL
  • 9. Ganhe tempo automatizando com psql por Dickson S. Guedes
  • 10. Sim, foi um clickbait
  • 11. AGENDA Nossa Jornada… Variáveis Macros Reuso Criando “comandos” format e gexec Considerações finais Público alvo: Iniciante
  • 12. set sauda ola mundo echo :sauda echo :"sauda" echo :'sauda' set sauda "ola mundo" set sauda 'ola mundo' Variáveis no psql
  • 13.
  • 14.
  • 15.
  • 16. set sauda select 'ola mundo!'; :sauda … e se … ?
  • 17.
  • 18.
  • 19. Dá para fazer macro no psql? set top101 select * from pg_stat_activity order by 17, 13 desc limit 10; set top102 "select * from pg_stat_activity order by 17, 13 desc limit 10;" set top103 'select * from pg_stat_activity order by 17, 13 desc limit 10;' Quais dos 3 acima funcionarão?
  • 20.
  • 21.
  • 22.
  • 23. … e se … set ss_film 'select * from film' set ss_film_fields 'select title, description' set ff_film ' from film' set jj_film_actor ' join film_actor using (film_id)' set jj_actor ' join actor using (actor_id)'
  • 25.
  • 26.
  • 27.
  • 28.
  • 29. Vamos agora desconstruir select * from pg_stat_all_tables where age(now(), coalesce( last_autoanalyze, last_analyze, now() - interval ‘1 year’)) > interval ‘10 days’ and relname !~ ‘^pg_toast_|sql_’
  • 30. Vamos agora desconstruir select * from pg_stat_all_tables where age(now(), coalesce( last_autoanalyze, last_analyze, now() - interval ‘1 year’))> interval ‘10 days’ and relname !~ ‘^pg_toast_|sql_’
  • 31. Vamos agora desconstruir select * from pg_stat_all_tables where age(now(), :_analyze_mais_recente) > interval ‘10 days’ and relname !~ ‘^pg_toast_|sql_’ set _analyze_mais_recente 'coalesce(last_autoanalyze, last_analyze, now() - interval ''1 year'')'
  • 32. Vamos agora desconstruir select * from pg_stat_all_tables where age(now(), :_analyze_mais_recente) > interval ‘10 days’ and relname !~ ‘^pg_toast_|sql_’
  • 33. Vamos agora desconstruir select * from pg_stat_all_tables where age(now(), :_analyze_mais_recente) > interval ‘10 days’ and :_ignored_tables set _ignored_tables 'relname !~ ''^pg_toast_|sql_'''
  • 34. Podemos simplificar select * from pg_stat_all_tables where age(now(), :_analyze_mais_recente) > interval ‘10 days’ and :_ignored_tables
  • 35. E chegamos a esta simplificação ss_mant_tabelas_analisadas_ha_mais_de_10_dias E podemos fazer isto … with dados as ( :ss_mant_tabelas_analisadas_ha_mais_de_10_dias ) select format('ANALYZE %I', relname) from dados gexec
  • 36. E chegamos a esta simplificação ss_mant_tabelas_analisadas_ha_mais_de_10_dias E podemos fazer isto … with dados as ( :ss_mant_tabelas_analisadas_ha_mais_de_10_dias ) select format('ANALYZE %I', relname) from dados gexec
  • 37.
  • 38. gexec e format( ) - a combinação perfeita
  • 39.
  • 40. Vamos agora desconstruir select format( $$set ss_first_%1$I 'select * from %1$I limit 10;'$$, tablename ) from pg_tables where schemaname !~ '(pg_catalog)' g /home/guedes/extended_comands.sql
  • 41. Vamos agora desconstruir select format( $$set ss_first_%1$I 'select * from %1$I limit 10;'$$, tablename ) from pg_tables where schemaname !~ '(pg_catalog)' g /home/guedes/extended_comands.sql
  • 42. Vamos agora desconstruir select format( $$set ss_first_%1$I 'select * from %1$I limit 10;'$$, tablename ) from pg_tables where schemaname !~ '(pg_catalog)' g /home/guedes/extended_comands.sql
  • 43. Vamos agora desconstruir select format( $$set ss_first_%1$I 'select * from %1$I limit 10;'$$, tablename ) from pg_tables where schemaname !~ '(pg_catalog)' g /home/guedes/extended_comands.sql
  • 44. Vamos agora desconstruir select format( $$set ss_first_%1$I 'select * from %1$I limit 10;'$$, tablename ) from pg_tables where schemaname !~ '(pg_catalog)' g /home/guedes/extended_comands.sql
  • 45. # .psqlrc … corte … echo 'gerando extended_commands.sql' t on select format( $$set ss_first_%1$I 'select * from %1$I limit 10;'$$, tablename ) from pg_tables where schemaname !~ '(pg_catalog)' g /home/guedes/extended_comands.sql t off ir extended_commands.sql
  • 46.
  • 47. Que mais dá para fazer?