Mostrando entradas con la etiqueta T-SQL. Mostrar todas las entradas
Mostrando entradas con la etiqueta T-SQL. Mostrar todas las entradas

Enviar correo electrónico en un formato tabular utilizando el correo electrónico de la base datos SQL Server

Enviar correo electrónico en un formato HTML utilizando el correo electrónico de la base datos SQL Server

LINQ: Consulta Maestro-Detalle

Problema


Lo primero, voy a exponer el problema que me han planteado:
Dada una tabla, digamos, “Cabecera”, con una tabla relacionada de “Detalle” con una relación 1 a

Cannot resolve the collation conflict between "Modern_Spanish_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.

El día de hoy estaba trabajando con unas tablas de unas bases de datos del servidor en donde trabajo... y al realizar una consulta, me arrojaba un error sobre su COLLATION (intercambio de caracteres entre columnas). Un error así...:

Cannot resolve the collation conflict between "Modern_Spanish_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.

SNAPSHOT DATABASE

Han visto que el Object Explorer en el SQL Server Management Studio donde se encuentran las bases de datos hay una carpeta que dice Database Snapshots.

Esto puedo confundir mucho ya que pareciera que fuera parte de la replicación pero no es así, realmente es una base de datos sólo lectura, estática basada en una base datos normal (fuente).

En la parte de abajo hay un ejemplo reemplacen la información por sulla y aparecerá ya base datos bajo la carpeta de Database Snapshots.

Cuál es su función:
Pueden ser utilizados para los informes. Asimismo, en el caso de un error del usuario en una base de datos de código fuente, puede restaurar la base de datos fuente al estado en que estaba cuando se creó el snapshot.

La pérdida de datos se limita a las actualizaciones de la base de datos desde su creación de la instantánea. Además, la creación de una snapshot de base de datos puede ser útil inmediatamente antes de hacer un cambio importante de una base de datos, como cambiar el esquema o la estructura de una tabla.

Tiene 3 posibles usos:


• Mantener los datos históricos para la generación de informes (Reporteria)
• Protección de datos de errores de usuario (Backup).
• La gestión de una base de datos de prueba (Base datos de pruebas)

Importante:
Database snapshots, fueron introducidos en SQL Server 2005, sólo están disponibles en las ediciones Enterprise de SQL Server 2005, SQL Server 2008 y SQL Server 2008 R2.

En la parte de abajo hay un ejemplo reemplacen la información por sulla y aparecerá ya base datos bajo la carpeta de Database Snapshots.

Crear una base datos snapshots



SNAPSHOT CREATE DATABASE AdventureWorks_dbss1800 ON
( NAME = AdventureWorks_Data, FILENAME =
'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\AdventureWorks_data_1800.ss' )
AS SNAPSHOT OF AdventureWorks
;


Si hacer un restore de en base a un SNAPSHOT seria de la siguiente manera:

Restore


USE master
RESTORE DATABASE AdventureWorks FROM DATABASE_SNAPSHOT = 'AdventureWorks_dbss1800';
GO


Que permisos necesito para crear una:
La única manera de crear una SNAPSHOT CREATE DATABASE es utilizar Transact-SQL. Cualquier usuario que pueda crear una base de datos puede crear una snapshot de base de datos, sin embargo, para crear una instantánea de una base de datos reflejada, usted debe ser un miembro de la función de servidor sysadmin.

Articulo de referencia:
http://msdn.microsoft.com/en-us/library/ms175469.aspx
http://msdn.microsoft.com/en-us/library/ms187054.aspx
http://www.sqlcoffee.com/Tips0004.htm

MariaDB, La Hermanita Menor de MySQL

Es por todos sabido que Oracle ha adquirido Sun, y con ello lo que Sun había adquirido meses atrás, hablo en concreto de MySql.


MySql es o era (no sé cuál de los dos calificativos es correcto) el sistema de bases de datos Open Source más famoso y utilizado en el mundo.


Sin embargo, ahora tenemos que Sun forma definitivamente parte de Oracle, y Oracle tiene ahora la "patita" en máquinas de Sun, la "pattita" en lenguajes con Java, y la "patita" de bases de datos con MySql, pero Oracle es famosa precisamente por tener un gestor de bases de datos muy poderoso, el propio Oracle que da nombre a la compañía, así que, ¿qué hacer con MySql?.


Hay que tener en cuenta además, que la sombra de Oracle es muy larga y lo suficientemente ancha como para ocultar a MySql de la faz de la tierra. La incertidumbre por lo tanto, es bastante grande con respecto al futuro de MySql.


De momento no ha hecho nada "raro" con MySql, sin embargo, hay mucha gente que comenta que Oracle va a empezar a cobrar soporte con MySql y en el futuro...:s ya veremos qué...;) igual incluso hasta desaparece...


Aún y así, un irreducible finlandés no se va a quedar de brazos cruzados.
Hablo de Ulf Michael Widenius a quién se le conoce con el apodo de "Monty" (blog de Monty).


Monty es el principal autor de MySql y miembro fundador de MySql AB, empresa que fue adquirida en Febrero de 2008 por Sun Microsystems como comentaba anteriormente. Por la nada depreciable cantidad de 16 millones de € ($ 252883200 MXN).


Con la venta de MySql, Monty se embolsó mucho dinero y en Febrero de 2009 dejó Sun para montar una nueva compañía. Los motivos por los que dejó Sun no están claros.


Lo peor para Oracle, es que Monty se ha puesto a crear un nuevo motor de bases de datos de datos teniendo en mente a MySql y agregándoles "esas" cosas que quería haberle agregado a MySql en su día y que por las razones que sean, no ha podido llevar a cabo.


La iniciativa de Monty tiene que ver sobre todo con la adquisición de Sun por parte de Oracle.


Adquisición maestra, ya que se ha manejado la situación estratégica de forma expecional. Primero Sun compra MySql,  todo normal y coherente, no!?.


Luego Oracle compra Sun, y aquí aparecen las dudas. Monty duda de la compra (seguramente se sintió engañado/decepcionado/triste como amante de un sistema gestor de bases de datos abierto).


El departamento de la libre competencia de la Unión Europea analiza entonces si vulnera la libertad, pero aunque Oracle y Sun tienen un frente común en el mundo de las bases de datos, no es menos cierto que al tener Sun sus departamentos de Hardware y Software con Java a la cabeza, se ha hecho claramente la vista gorda sobre MySql.


Sin dudas, siento que esto ya estaba pactado de ante mano y Monty fue engañado. Quitaron a MySql, y así Oracle solo tendría un único competidor real y de importancia, hablo de SQL Server.


Al menos a Monty le quedó la tranquilidad de haberse hecho rico. Pero Monty es como comentaba antes, un hombre irreducible y tenía pensado vengar su honor como si de un duelo se tratara.


En Internet apareció entonces una iniciativa impulsada por el propio Monty para salvar a MySql, hecho que motivó que Monty se adentrara en esta aventura.


El producto en el que anda trabajando se llama MariaDB. El nombre de Maria se debe a su hija menor.


En realidad, MariaDB es un fork (bifurcación, branch o rama) que parte del código base de MySql. Es decir y como ellos lo comentan en el wiki de la página MariaDB es un upgrade de MySQL.


La empresa de Monty encargada de llevar a cabo la aventura de MariaDB se llama Monty Program AB.


El icono elegido por Monty en este caso es una foca, icono que posiblemente utilice para sus distribuciones.




MariaDB Logo
MariaDB Logo


Ahora bien... ¿cuál es la versión actual de MariaDB?.
La versión actual es MariaDB 5.2.0 Beta que está basada en MySql 5.1.


Monty afirma que esta versión es estable, aunque no quiere decirlo muy alto porque es una versión en desarrollo y por lo tanto, no debería ser utilizada en producción.


El caso es que a Oracle le ha salido un emergente y posible competidor, porque el irreducible Monty no tiene pensado dejar tirada a la Comunidad y va a hacer todo lo posible por sacar adelante el proyecto de MariaDB.


Por su hija y por él mismo, va a luchar para prevalecer su honor. Una noticia que personalmente celebro de pie.

Diferencias entre TRUNCATE y DELETE en MySQL

Si os habeis preguntado alguna vez las diferencias entre truncate y delete en la base de datos MySQL Server. Aquí os pongo una pequeña explicación de cuando utilizar una u otra.


TRUNCATE


Este comando borra todas las filas de una tabla sin registrar las eliminaciones individuales en el log de transacciones.


Por ejemplo:


[sourcecode lang="sql"]TRUNCATE Cursos;[/sourcecode]


Borra todos los registros de la tabla Cursos


DELETE


DELETE borra las filas de una tabla, pero registra las eliminaciones individuales en el log de transacciones. Podemos utilizar la clausula WHERE para filtrar las filas que necesitemos eliminar.


Ejemplo:


[sourcecode lang="sql"]DELETE FROM Cursos  WHERE CursoId = 50;[/sourcecode]


DIFERENCIAS ENTRE TRUNCATE Y DELETE




  • Ambas eliminan los datos, no la estructura.

  • Solo DELETE permite la eliminación condicional de los registros.

  • DELETE es una operación registrada en el log de transacciones y trucate no.

  • TRUNCATE es una operación registrada en el log de transacciones, pero como un todo, en conjunto, no por eliminación individual. TRUNCATE se registra como una liberación de las páginas de datos en las cuales existen los datos.

  • TRUNCATE es más rápida que DELETE.

  • Ambas se pueden deshacer con un ROLLBACK.

  • TRUNCATE reiniciará el contador para una tabla que contenga una columna IDENTITY.

  • DELETE mantendrá el contador de la tabla para una columna IDENTITY.

  • TRUNCATE es un comando DDL(lenguaje de definición de datos) mientras que DELETE es un DML(lenguaje de manipulación de datos).

  • TRUNCATE no desencadena un TRIGGER, DELETE sí.

  • TRUNCATE recrea una tabla.


CUANDO USARLAS




  • Usar Truncate es más rapido que Delete si vas a borrar toda una tabla y no te importan los indices(identity) o bien quieres resetearlos.

  • Usar Delete para borrados selectivos.

  • Usar Delete en caso de tener Foreign Key, es decir .. usarla en caso de borrados en cascada.

Crear Servicio Web En PHP Con NüSoap

1.- Para que funcione el ejemplo descárgate las clases de NüSOAP desde la pagina del proyecto http://sourceforge.net/projects/nusoap/.

2.- Después descomprimes ese archivo y lo copias a tu sitio web (para este ejemplo el sitio se llama miwebservice y los archivos de NuSOAP los puse en un directorio llamado lib-nusoap.

3.- Luego ejecutas en tu Servidor MySQL el script de la Base de Datos db_productos.sql que lo puedes descargar desde esta pagina.

4.- Luego crea una pagina PHP (en este ejemplo la pagina se llama servicioweb.php) y codificas lo siguiente:
[sourcecode language="php"]
< ?php
require_once('lib-nusoap/nusoap.php');

$server = new soap_server;

$ns="http://localhost/aplicativo"; // espacio de nombres; Sitio donde estará alojado el web service
$server->configurewsdl('MiWebService'); //nombre del web service
$server->wsdl->schematargetnamespace=$ns;

/************ REGISTRANDO EL ARRAY A DEVOLVER(array de productos) **************/
$server->wsdl->addComplexType(
'ArregloProductos', // Nombre
'complexType', // Tipo de Clase
'array', // Tipo de PHP
'', // definición del tipo secuencia(all|sequence|choice)
'SOAP-ENC:Array', // Restricted Base
array(),
array(
array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:Productos[]') // Atributos
),
'tns:Productos'
);

/************ REGISTRANDO LA ESTRUCTURA DE DATOS PRODUCTOS **************/
$server->wsdl->addComplexType('Productos', 'complexType', 'struct', 'all', '',
array(
'ProductoID'=> array('name' => 'ProductoID','type' => 'xsd:int'),
'Nombre' => array('name' => 'Nombre', 'type' => 'xsd:string'),
'Precio' => array('name' => 'Precio', 'type' => 'xsd:string')
)
);

/*METODO DEL WEB SERVICE*/
function ListarProductos($estado){
if($estado!=''){
$db = new mysqli(); //mysqli exclusivo para usar procedimientos almacenados
$db_result = $db->connect ("localhost", "root", "","db_productos");
$sql=sprintf("call usp_ListarProductos('%s');",$estado); //intentando filtrar el SQL Injection
$result = $db->query($sql);
if (mysqli_errno($db)) printf("mySQL error %s\n", $db->error); //si es que hubo error se muestra
$db->close();
$i=0;
if($result->num_rows>0){
while($row = mysqli_fetch_assoc($result)){
$toc[$i]['ProductoID'] = $row["producto_id"];
$toc[$i]['Nombre'] = $row["nombre"];
$toc[$i]['Precio'] = $row["precio"];
$i++;
}
$result->free; //liberando memoria
return $toc;
}
}
return '';
}

/************ REGISTRANDO EL METODO **************/
$server->register(
'ListarProductos', // Nombre del Método
array('estado' => 'xsd:string' ), // Parámetros de Entrada
array('return' => 'tns:ArregloProductos') //Datos de Salida
);

/******PROCESA LA SOLICITUD Y DEVUELVE LA RESPUESTA*******/
$input = (isset($HTTP_RAW_POST_DATA)) ? $HTTP_RAW_POST_DATA : implode("\r\n", file('php://input'));
$server->service($input);
exit;
?>
[/sourcecode]



Si deseas puedes descargar el ejemplo completo desde aquí. Varios usuarios me han hecho la observación en la cual no funciona el código, esto es por el nombre de la carpeta comprimida que llame SQLeros-NüSoapEjemplo.zip, para que funcione bien solo cambienle el nombre por: SQLeros-NuSoapEjemplo.zip

También veremos como consumir el servicio desde C#,VB.Net y Java. Saludos

Replicando Datos En Oracle

Introducción


El presente documento muestra la forma de replicar de manera sencilla los datos de una base de datos en oracle hacia otro servidor oracle, mediante el uso de vistas materializadas.


La replicación te permite tener una copia exacta de una base de datos alojada en un servidor (maestro) que se guardará en otro servidor (esclavo). Todas las modificaciones que se hagan en la base de datos del servidor maestro se actualizarán inmediatamente en el servidor esclavo.


Esto no es una copia de seguridad, ya que si borramos una fila en la base de datos maestra, también se borrará en la base de datos esclava.


A continuación tenemos los pasos para instalar y configurar nuestro servidor para replicar datos.



Instalando Oracle.


Para nuestro caso usaremos la de oracle llamada oracle Express Edition, la cual es gratuita para nuestro servidor. Nos dirigimos a la página:


http://www.oracle.com/technology/software/products/database/xe/htdocs/102xewinsoft.html


Y aceptamos los términos de licenciamiento del programa, en este momento descargaremos el producto para posteriormente instalarlo en nuestro sistema.





[caption id="attachment_51" align="aligncenter" width="300" caption="Descargando OracleXE"]Descargando OracleXE[/caption]


Una vez descargado lo instalaremos dando clic derecho en el instalador y eligiendo la opción, abrir.




[caption id="attachment_52" align="aligncenter" width="300" caption="Ejecutando el instalador"]Ejecutando el instalador[/caption]


Esperamos un momento y podremos ver las opciones del programa.




[caption id="attachment_53" align="aligncenter" width="300" caption="Opciones de configuracion"]Opciones de configuracion[/caption]

[caption id="attachment_54" align="aligncenter" width="300" caption="Instalacion OracleXE"]Instalacion OracleXE[/caption]

El programa de instalación nos muestra la pantalla de bienvenida para la instalación, en este momento tenemos que dar click en siguiente.





[caption id="attachment_55" align="aligncenter" width="300" caption="LicenciaDirectorio de instalacion"]Licencia[/caption]


Aceptamos los términos y condiciones del programa y pulsamos siguiente, en seguida seleccionamos la ubicación de los archivos de instalación, si queremos instalarlos en otra ubicación podemos seleccionarla pulsando el botón  Examinar, después de esto pulsamos siguiente.





[caption id="attachment_57" align="aligncenter" width="300" caption="Establecer contraseña"]Establecer contraseña[/caption]


Ahora tecleamos una contraseña para los usuarios SYS y SYSTEM, los cuales son los usuarios (dba) administradores en oracle, y pulsamos en siguiente, ahora nos mostrara un resumen de la instalación si estamos de acuerdo con este daremos clic en instalar.





[caption id="attachment_58" align="aligncenter" width="300" caption="Instalacion"]Instalacion[/caption]

Configurando El Servidor


Ahora editaremos el archivo “C:\oracle\product\10.2.0\db_1\network\admin\tnsnames.ora”, y agregaremos las siguientes líneas de configuración (resaltadas en cursiva y negrita) para que el servidor oracle reconozca nuestro servidor remoto, usando una resolución de nombres tns.
# tnsnames.ora Network Configuration File: D:\oracle\product\10.2.0\db_1\network\admin\tnsnames.ora


# Generated by Oracle configuration tools.

LISTENER_ORCL =

(ADDRESS =

(PROTOCOL = TCP)

(HOST = RAMMSCORP.gateway.2wire.net)

(PORT = 1522)

)

ORCL =

(DESCRIPTION =

(ADDRESS =

(PROTOCOL = TCP)

(HOST = RAMMSCORP.gateway.2wire.net)

(PORT = 1522)

)

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = orcl)

)

)

YOS =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS =

(COMMUNITY = TCP)

(PROTOCOL = TCP)

(HOST = yosy1)

(PORT = 1521)

)

)

(CONNECT_DATA =

(SID = XE)

)

)

EXTPROC_CONNECTION_DATA =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS =

(PROTOCOL = IPC)

(KEY = EXTPROC1)

)

)

(CONNECT_DATA =

(SID = PLSExtProc)

(PRESENTATION = RO)

)

)
Donde YOS es el nombre del servidor remoto que agregamos, es decir un alias, PROTOCOL es el protocolo de comunicación hacia el servidor, HOST es el nombre ó la dirección IP de la computadora que tiene el servidor, PORT indica el numero de puerto al cual se conectara el servidor y finalmente SID que es el nombre de servicio del servidor remoto.


De esta manera nos podremos conectar con el servidor remoto usando la nomenclatura de conexión:


Usuario/Password@Alias_Del_Servidor:[Puerto]


Donde Usuario es cualquier usuario valido del servidor remoto, Password es la contraseña del usuario remoto, @Alias_del_servidor es el nombre que hemos añadido en el archivo de configuración tnsnames.ora, y finalmente el Puerto que indica a que puerto se conectara este parámetro es opcional, por defecto las conexiones se realizan al puerto 1521.


Una vez editado y configurado archivo, tendremos que configurar nuestro servidor estableciendo un DBLink ó un enlace a base de datos.


Usando la siguiente instrucción:




Create database link "Nombre_Del_DBLink" connect to Usuario identified by "Password" using 'HOST[: PUERTO]/SID'

De la siguiente instrucción tenemos Nombre_Del_DBLink el cual es un nombre cualquiera para identificar a que base de datos estamos ligados, Usuario el cual debe de ser un usuario remoto valido, Password es la contraseña del usuario remoto, HOST es el nombre ó dirección ip del servidor, PUERTO indica el numero del puerto al que se conectara el parámetro es opcional, el puerto por defecto es el 152, y por ultimo SID es el nombre del servicio al cual se conectara nuestro servidor.


La cual nos proporcionara la facilidad de hacer consultas del tipo:


Objeto@DBLink


Donde Objeto puede ser cualquier tipo de objeto en la base de datos remota y @DBLink es el enlace a la base de datos, de este modo podremos usar las tablas, vistas, triggers y demás objetos en el servidor.


Estos pasos de configuración se hacen en los dos servidores para que se puedan comunicar, es decir tenemos que dar de alta el servidor 1 en el servidor 2 y viceversa; además tenemos que dar de alta un DBLink para cada uno de ellos, una vez teniendo configurados los servidores podremos iniciar la replicación.



Replicando Datos


Ahora antes de replicar los datos tenemos que tener datos, necesitamos tener cuando menos una tabla en la base de datos, ahora crearemos una tabla para hacer esta práctica la cual llamaremos: COMPRAS; la cual estará en el servidor 1 (RAMMS) y será replicada hacia el servidor 2 (YOS). Utilizaremos las sentencias de SQL Plus para crear la tabla con los siguientes campos de la siguiente manera:



CREATE TABLE RAMMS.COMPRAS

(

CODIGO VARCHAR2 (8 BYTE) NOT NULL,

PROVEEDOR VARCHAR2 (30 BYTE) NOT NULL,

PRODUCTO VARCHAR2 (45 BYTE) NOT NULL,

PRECIOCOMPRA INTEGER NOT NULL,

PRECIOVENTA INTEGER NOT NULL,

CANTIDAD NUMBER NOT NULL

)

Y posteriormente:
ALTER TABLE RAMMS.COMPRAS ADD (

PRIMARY KEY

(CODIGO)

USING INDEX

TABLESPACE USERS

PCTFREE    10

INITRANS   2

MAXTRANS   255

STORAGE    (

INITIAL          64K

MINEXTENTS       1

MAXEXTENTS       UNLIMITED

PCTINCREASE      0

));

Después de crear la tabla agregaremos datos en ella, quedando de la siguiente manera:


Ahora realizaremos una consulta desde el servidor 2 (YOS) usando los DBLink, quedando de la siguiente manera:




[caption id="attachment_50" align="aligncenter" width="300" caption="Datos"]Datos[/caption]
SELECT * FROM COMPRAS@DBLINKRAMMS

Arrojando la siguiente información:

[caption id="attachment_50" align="aligncenter" width="300" caption="Datos"]Datos[/caption]

Como podemos observar la consulta funciona es decir que podemos consultar objetos desde el servidor 2, ahora crearemos en el servidor 1 (RAMMS), una tabla LOG para la replicación de la tabla COMPRAS, con la siguiente instrucción:



CREATE MATERIALIZED VIEW LOG ON RAMMS.COMPRAS

NOCACHE

LOGGING

NOPARALLEL;


Esta tabla guardara los datos cambiados y actualizara de manera instantánea todas las replicas de la tabla COMPRAS.


Ahora desde el servidor 2 (YOS) crearemos nuestra vista materializada para recibir los datos de la tabla original, a este procedimiento de replica se le denomina replica en forma de instantánea o de snapshot, lo haremos usando la siguiente instrucción.



CREATE MATERIALIZED VIEW RAMMS.COMPRAS

BUILD IMMEDIATE

REFRESH FAST ON COMMIT

AS

SELECT * FROM COMPRAS@DBLINKRAMMS;

Ahora en el servidor 2 (YOS), ya disponemos de una copia exacta de la tabla compras del servidor 1 (RAMMS), y se actualizara automáticamente cuando se haga un commit en las transacciones, ahora podemos ejecutar la sentencia:



SELECT * FROM COMPRAS;

E inmediatamente después podremos apreciar el resultado de la consulta, nótese que en el servidor 2,no existían datos para la tabla COMPRAS de hecho COMPRAS no es una tabla es una ¡vista!







[caption id="attachment_50" align="aligncenter" width="300" caption="Datos"]
Datos[/caption]




De esta manera cualquier cambio realizado en el servidor 1, se verá reflejado inmediatamente en el servidor 2, de esta manera tenemos la información actualizada y lo más importante distribuida en varios nodos al mismo tiempo.



Conclusión


En esta práctica aprendimos a hacer una replicación de instantánea de una tabla en oracle usando dos servidores uno que es el servidor que tiene la tabla a replicar (RAMMS) y un cliente (YOS)  el cual puede tener los datos de la tabla para consultar, cabe señalar que la vista materializada es de solo lectura, debido a que es una instantánea, también configuramos los accesos de los servidores mediante el archivo de configuración tnsnames.ora y dimos de alta los servidores en los archivos, lo que nos daba como resultado la comunicación entre ambos y logrando así poder generar el enlace de base de datos entre ellos. Teniendo la posibilidad de realizar consultas distribuidas entre los servidores. Finalizando en la creación de la tabla de LOGS y la vista materializada, para poder consultar los datos replicados de manera local.


Documento en Scribd ó ¡Descargalo!

SELECT TOP 1 song FROM youtube ORDER BY NEWID() --Links 2 3 4

Bueno este es un video aleatorio del youtube que me gusta mucho es links 2 3 4, de rammstein espero les guste... Mi parte favorita es cuando batallon de hormiguitas va a partirles su madre a los escarabajos malditos, y sobre todo el mensaje de trabajo en equipo de las hormiguillas, es realmente una de las mejores canciones de este grup, aleman llena de poder y fuerza en los acordes de la canción.





Simplemente impresionante, espero y lo disfruten, xD!!

Localización Geografíca Por IP Usando SQL Server

Introducción


En Internet es el concepto del sitio web de análisis para facilitar el seguimiento de todos los visitantes las actividades y patrones de uso. Una de las dimensiones de la pista es la información geográfica de los visitantes, que puede obtenerse usando la dirección IP de la información que se recoge cuando un usuario entra en una página web. En este artículo describiremos un proceso simple que permite a su sistema de información mostrar la información geográfica de los visitantes.



Ámbito


Este artículo no describe el proceso necesario para capturar la información IP del usuario. Este proceso es una solución a nivel de las aplicaciones que se pueden construir con ASP.NET, PHP, JSP, Python, Ruby, etc. El ámbito de aplicación de este artículo se limita a la utilización de la dirección IP para descubrir los datos geográficos. Estos datos se compone del País, región, ciudad, código postal y el código de área cuando corresponda. Algunos países no tienen el concepto de código postal. :s



¿Qué es una dirección IP?


Cuando un usuario entra en una página web, la aplicación web tiene la capacidad para recopilar información de este usuario. Uno de estos elementos de datos es la dirección IP. La dirección IP tiene un formato de xxx.xxx.xxx.xxx( de 4 octetos separados por puntos ej. 189.23.45.21), y es una dirección lógica asignada a un dispositivo. Esto es lo que identifica a su dirección de Internet, y está compuesto de segmentos que identifican su ubicación geográfica.



¿Qué necesito para mapear una dirección IP a una ubicación geográfica?


Para asignar la dirección IP a una representación geográfica, el sistema de mapeo de los datos geográficos necesita informacion sobre sus ubicaciones. Esta información es proporcionada por varias empresas. En este caso, nosotros estamos usando el GEOLiteCity datos, que es gratuito. Para obtener estos datos, visite aqui y descargar el archivo ZIP que contiene dos archivos, bloques y ubicación CSV(comma separate value). El archivo de mapas de un bloque de números IP a una ubicación. El archivo tiene la ubicación de información geográfica. Tenga en cuenta que hay frecuentes cambios a estos archivos, de modo que asegúrese de leer la descripción de sus servicios.



Para importar estos datos a su base de datos, primero debe crear la tabla de definiciones. Nosotros necesitamos crear el Bloque Ubicación geográfica y tablas. Esta es la tabla de definiciones: (también puede descargar scripts(las secuencias de comandos)).




[caption id="attachment_20" align="alignnone" width="461" caption="tablas"]tablas[/caption]

Puedes importar los datos a través de su método preferido. La primera línea en el archivo CSV es una declaración de derechos de autor. La segunda línea de la cabecera de la columna, así que asegúrese de eliminar o pasar por alto  la primera línea durante el proceso de importación. También he incluido una tabla de registro de visitantes que pueden ser utilizados para rastrear la información del usuario. Esta tabla es muy simple, y no incluye todos los posibles elementos de datos que pueden ser recogidos.


Para simplificar el proceso de imporatacion de datos podemos ejecutar un BULK INSERT, usando la sentencia:




BULK INSERT GeoLiteCity_Location
FROM 'GeoLiteCity-Location.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '0x0a',
KEEPNULLS)
GO

BULK INSERT GeoLiteCity_Blocks
FROM 'GeoLiteCity-Blocks.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '0x0a',
KEEPNULLS)
GO

Esto tarda un poco puesto que son cerca de 85000 registros por tabla, jeje en fin, Seguimos.




Solución


Una vez que los datos se ha importado, te darás cuenta de que la dirección IP en los datos no se ve nada parecido 192.15.10.125. La información se almacena realmente como un número de IP. Este valor numérico es lo que nos permite hacer una serie de comparación. Una serie de números IP se asigna a una determinada ubicación. Esto es lo que nos permite hacer la asociación, pero el primer paso es averiguar cómo convertir una dirección IP a un número IP. Aquí es donde una función definida por el usuario nos puede ayudar. Primero tenemos que convertir la dirección IP a un número de IP usando la función ConvertIP2Num a continuación:



CREATE function dbo.ConvertIp2Num(@ip nvarchar(15))
returns bigint
as
begin

declare @delimiter NVARCHAR(1), @SUBNET_MASK INT

set @delimiter = '.'
set @SUBNET_MASK = 256

DECLARE @textXML XML;
SELECT    @textXML = CAST('<col>' + REPLACE(@ip, @delimiter, '</col><col>') + '</col>' AS XML);

DECLARE @idx int, @ipNum float
SET @idx = 4
SET @ipNum = 0

declare @segments table(id int ,col int)
INSERT INTO @segments(id, col)
--reorder the sections. must start from the right segment (4 to 1)
SELECT  ROW_NUMBER () OVER (ORDER BY col) as id,
T.col.value('.', 'int') as col
FROM    @textXML.nodes('/col') T(col)
order by id desc

--convert segments to number
select  @ipNum = @ipNum + (cast((col % @SUBNET_MASK) as float) * power(@SUBNET_MASK,@idx-id))
from @segments

return cast(@ipNum as bigint)
end

sqleros.com.arEjemploGeolocalizacionGO


Esta función primero la dirección IP se divide en cuatro segmentos (delimitado por un punto). Aquí es donde realmente el XML se convierte en la mano. Acabamos de crear una cadena XML y utilizar el analizador para hacer la división para nosotros por la selección de los nodos XML. Usamos el Row_Number () para crear un factor que nos ayudará a llegar al segmento de peso (es decir, el segmento: 192 ha RowNumber: 1 y con un peso de: 4-1 = 3). Ahora aplicar la fórmula de conversión, que consiste en la asignación de una base cero peso a cada segmento (cero a partir de la serie de sesiones de la derecha) y multiplicando por este segmento (256 ^ n) o potencia (256, n) donde n = peso. El último paso es añadir todos los resultados del segmento. Por ejemplo, IP 192.15.10.125 se convierte de la siguiente manera:





[caption id="attachment_29" align="alignnone" width="270" caption="Conversion de ip"]Conversion de ip[/caption]


El resultado es el número que se puede utilizar para la consulta geográfica tablas. Para ello, puede crear una consulta similar a la de debajo de la cual devuelve la información geográfica.






[caption id="attachment_31" align="alignnone" width="459" caption="Resultado"]Resultado[/caption]

Conclusión:


Con este artículo, tuve la oportunidad de mostrar de un simple proceso de crear su propia base de datos de GEO buscar y dar solución a un mapa de la dirección IP a su información de ubicación. Todavía hay otros elementos a considerar como automatizar el proceso de importación para descargar los nuevos archivos, convertir la dirección IP a valor en numeros , integrar esta información en un almacén de datos, y crear informes que muestran su equipo de marketing en las regiones lo que los clientes están ubicados.


Fuente original en ingles Arhivos adicionales



Esta función primero la dirección IP se divide en cuatro segmentos (delimitado por un punto). Aquí es donde realmente el XML se convierte en la mano. Acabamos de crear una cadena XML y utilizar el analizador para hacer la división para nosotros por la selección de los nodos XML. Usamos el Row_Number () para crear un factor que nos ayudará a llegar al segmento de peso (es decir, el segmento: 192 ha RowNumber: 1 y con un peso de: 4-1 = 3). Ahora aplicar la fórmula de conversión, que consiste en la asignación de una base cero peso a cada segmento (cero a partir de la serie de sesiones de la derecha) y multiplicando por este segmento (256 ^ n) o potencia (256, n) donde n = peso. El último paso es añadir todos los resultados del segmento. Por ejemplo, IP 192.15.10.125 se convierte de la siguiente manera: