Un literal es el valor escrito directamente en el texto del SQL, como 'EXEMPLO' o 4242123499. Ahí suele estar el dato personal: documento de identidad, nombre, correo electrónico, teléfono. La máscara reemplaza los literales por *** en el SQL que usted ve y descarga. Viene activada y vale para todo lo que muestra su cuenta.
La regla de los números de esta página vale desde la consola 1.6.0. Antes, la opción de los números ocultaba solo los números de 6 dígitos o más, como 4242123499, y dejaba rownum <= 10 como estaba. El informe descargado antes del cambio sigue la regla antigua: descárguelo de nuevo para tener la regla nueva.
Qué oculta la máscara
Son dos opciones, y cada una funciona por separado:
- Texto entre comillas. Todo texto entre comillas simples se convierte en
'***', también en las formasN'...'yq'[...]'. El texto cortado en medio del literal queda'***. - Números. Todo número usado como valor se convierte en
***, corto o largo: en comparación,IN,BETWEEN, asignación, argumento de función, lista delSELECT,GROUP BYyFETCH FIRST. Solo queda como está el número de posición en elORDER BY. El signo menos queda, y el número desaparece.
Las dos opciones valen también dentro de los comentarios del SQL (-- y /* */), donde la aplicación a veces graba valores, como el nombre de la pantalla o el id del registro.
| En el trace | En el informe |
|---|---|
select * from t where cpf='98765432100' and id=4242123499 | select * from t where cpf='***' and id=*** |
where obs=q'[it's]' and y=nq'{a}' and z=Q'!b!' | where obs=q'[***]' and y=nq'{***}' and z=Q'!***!' |
select * from t where nome='EXEMPLO DA SIL (texto cortado) | select * from t where nome='*** |
where ORDEM = 40 and id in (1, 2, 3) and v between 5 and 10 | where ORDEM = *** and id in (***, ***, ***) and v between *** and *** |
update t set qtd = 7, preco = 1.5e3 where k = .5 and z = -3 | update t set qtd = ***, preco = *** where k = *** and z = -*** |
select a, count(*) from t group by 1 having count(*) > 1 order by 2 desc, 1 nulls last | select a, count(*) from t group by *** having count(*) > *** order by 2 desc, 1 nulls last |
select a from t order by decode(a, 1, 2), 3 fetch first 10 rows only | select a from t order by decode(a, ***, ***), 3 fetch first *** rows only |
select /* tela='CADASTRO', id=42 */ * from t | select /* tela='***', id=*** */ * from t |
Lo que la máscara no oculta
- Las sugerencias del optimizador (
/*+ */), enteras. Enselect /*+ parallel(t 4) */ * from t where rownum <= 10, la sugerencia queda y solo el10se convierte en***. - Nombres de tabla, columna y objeto, incluidos los que van entre comillas dobles (
"COL9") y los que tienen dígitos (t1234567). - Binds, como
:1,:b123456y:"SYS_B_0": el nombre del bind queda, y el valor nunca entra en el informe. - El CLIENT ID, el módulo, la acción, el host y la ruta del archivo, en el resumen, y, en los deadlocks, el usuario de la base de datos, la máquina y el programa de cada sesión.
- El nombre del archivo enviado y los nombres de la pila PL/SQL.
La máscara cambia lo que aparece, no lo que guarda WaitScope: el informe en el servidor mantiene el SQL tal como está en el trace. Para enviar menos datos personales, genere el trace sin los valores de bind y envíe solo los archivos de la operación que quiere analizar.
Dónde vale la máscara
En todo lo que usted ve: la página del informe, el detalle de la sentencia, la página del objeto, el HTML, el PDF y el JSON descargados, la app de Android y la API. En el informe, cubre todo lugar donde aparece texto de SQL:
- Sentencias SQL por contribución y Sentencias principales por componente y por clase;
- el texto de la sentencia, la tabla Variantes que más gastaron y el SQL recursivo ejecutado por esta sentencia, en el detalle de la sentencia;
- Llamadas de nivel 0 más largas;
- Textos compartibles;
- Errores, en la lista de dónde apareció cada error;
- Deadlocks, en el SQL de cada sesión.
Con cualquiera de las opciones activada, el SQL ID de las variantes también desaparece: la tabla Variantes que más gastaron queda sin la columna SQL ID, y la columna SQL IDs de Textos compartibles muestra ocultos por la máscara. El sql_id se calcula a partir del texto con los valores y permitiría descubrir el literal oculto.
En el SQL que la base de datos rechazó, registrado en el PARSE ERROR, el texto aparece solo hasta la primera comilla, seguida de ***: en un SQL rechazado, no se puede saber con seguridad dónde termina cada valor (Errores ORA en el trace).
Como la máscara solo cambia la presentación, desactivarla muestra de nuevo el texto original, también en los análisis antiguos.
Las sentencias que solo difieren en los literales se convierten en una forma, con :s en lugar del texto entre comillas y :n en lugar del número. El texto de la forma ya no tiene literales, y la máscara no lo cambia: oculta los literales de las variantes. Vea SQL con literales en lugar de bind variables.
Valores de bind
Los valores de bind están en el bloque BINDS del trace, que se graba en los niveles 4 y 12 del evento 10046 o con binds => TRUE en DBMS_MONITOR. WaitScope ignora ese bloque al leer el trace: los valores no entran en el informe, con o sin la máscara. Solo existen en el archivo enviado, que sale del servidor cuando termina el análisis.
Aun así, prefiera el trace sin binds: el nivel 8 del 10046 o DBMS_MONITOR con las esperas y sin los binds. Vea niveles del evento 10046.
Activar o desactivar la máscara
- En la consola, haga clic en su nombre de usuario, en la parte superior de la pantalla, para abrir Mi cuenta.
- En Privacidad de los informes, marque o desmarque Ocultar el texto entre comillas en el SQL (cpf = '***').
- Marque o desmarque Ocultar los números usados como valor en el SQL (id = ***).
- Haga clic en Guardar.
Resultado: la consola muestra “Privacidad de los informes guardada.”, y el SQL de todos sus análisis pasa a salir con la nueva elección, en la consola, en la app y en las próximas descargas.
La app de Android sigue la elección hecha en la consola. Por la API, las dos opciones están en GET y PUT /api/v1/conta/privacidade, en los campos ocultar_textos y ocultar_numeros (rutas de la cuenta en la API v1). El informe que usted ya descargó no cambia: descárguelo de nuevo para tener el archivo con la nueva elección.
Adónde ir después
- Retención, eliminación y privacidad de los datos: qué guarda el informe y quién lo ve.
- SQL con literales en lugar de bind variables: cuándo los literales en el SQL cuestan tiempo de parse.
- Textos compartibles: SQL sin bind: las sentencias que solo difieren en los literales.