Truncate tabla sin hacer validacion de foreign constraints

Hola Mundo:

¿Cómo les va? Hace tiempo que no pasaba por aquí, porque he estado ocupado desarrollando
productos propios.

El tema de hoy hace referencia a un problema típico de bases de datos, específicamente cuando se quiere hacer un truncate a una tabla que es referenciada desde otras. Al existir restricciones no se puede hacer ni un truncate, ni drop ni delete, aun así cuando la tabla que la referencia está vacía.

Para este caso hay dos opciones:
1) Eliminar los constraint, hacer la operación y luego volver a crear los constraint
2) Desactivar la operación de comprobación de constraint, hacer la operación y volver activarlo.

La opción 2 es una buena medida, que debe ser usada solo en ambiente de laboratorio. El código es el  siguiente

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table1; 
TRUNCATE table2; 
SET FOREIGN_KEY_CHECKS = 1; 

Y eso es todo

“No tiene los permisos necesarios para acceder a esta página” en WordPress

¡Esta migración de WordPress me ha sacado canas verdes! Esto se está volviendo más o menos complicado, pero no me las ganará.

Cuando levanté la DB, tuve muchos problemas con la tabla de wp_options así que decidí a copiar tabla por tabla, para ver si habían otras que me daban problemas.

En la misma base de datos había levantado el respaldo, tenía una instalación limpia de WordPress. Hice un volcado de tablas, una a una hasta que lo hice con la tabla wp_usermeta.

Como tenía dos instalaciones en la misma base de datos, lo más lógico es que tuvieran preifijos distintos para poder distinguirlas entre ellas.

Cuando realicé el volcado de la tabla, después al entrar al portal para probar los nombres de usuario vi el mensaje de error:

No tiene los permisos necesarios para acceder a esta página

La tabla wp_usermeta guarda el prefijo de las tablas de la instalación de WordPress, así que con esta consulta reemplacé el antiguo prefijo por el nuevo prefijo que estaba almacenado en la tabla
UPDATE `newprefix_usermeta` SET `meta_key` = REPLACE(`meta_key`, 'wp_', 'newprefix_');
Donde newprefix es el nuevo prefijo de la tabla y wp_ es el antiguo prefijo.

Con esto ya pude entrar al portal y a la administracion.

🙂

Copiar tablas completas con Pentaho Data Integrator

¡Que taaal! Tiki tiki tí Publicando este artículo bien diciochero jeje.

Hoy les contaré sobre como realizar copias de tablas usando Pentaho Data Integrator, que es una herramienta gratuita, multiplataforma y de código abierto para construir paquetes ETL.

Es bastante potente y no tiene mucho que envidiar a otras que son de paga, por ejemplo, SQL Server Integration Services e Informatica.

Tiene bastantes asistentes que ayudan con las tareas y en este caso usaremos un asistente.

  1. Crear la conexión a la base de datos de origen y  de destino
  2. Ir a Tools -> Wizard -> Copy Table
  3. Seleccionar la conexión base de datos de origen y de destino

    Conexion de Origen y de Destino
    Conexion de Origen y de Destino
  4. Luego se hace la selección de la tabla que se quiere copiar

    Seleccion de Tabla
    Seleccion de Tabla
  5. Aunque ya se ha definido la conexión de destinoi (DB, Usuario, Password, Host) queda configurar el esquema, por lo menos para este caso que el RDBMS es MySQL, es por esto que hay que configurar el step
    Editar el step
    Editar el step

    Además, hay que ejecutar la consulta de creación de tabla. Para esto, hacer click en el botón SQL y ejecutar la sentencia que aparece ahí. Si esto no se hace, arrojará un error de que no se encuentra la tabla y la tarea no terminará de forma satisfactoria.

    SQL Query
    SQL Query
  6. Una vez que está todo configurado, se procede a ejecutar el flujo

    Ejecutar Proceso
    Ejecutar Proceso
  7. Se abrirá la ventana de configuración de la ejecución. En este caso, nada más se hace click en launch

    Ejecutar Proceso
    Ejecutar Proceso

Si todo se ha configurado bien, el proceso durará según el tamaño de la tabla y si es una base de datos externa, de la conexión con el servidor.

Espero que les sirva!

Error 1478 en SQL Server Mirroring

Este error es bastante recurrente cuando se quiere levantar Database Mirroring. Puede que al momento de configurarlo no se haya presentando ningún warning y ningún error en el proceso, pero si al momento de echar a andar el mecanismo de mirroring aparece este error, es porque no se realizó un paso previo.

Error 1478
Error 1478

Así se ve el error y la solución es re simple. Solo hay que respaldar el log de transacciones de la base de datos primaria y restaurar este respaldo en la base de datos de espejo con la opción de NORECOVERY.
Una vez que esta tarea se ha realizado, ya se puede levantar Mirroring y debiéramos tener problemas.

Usando la funcion NEWID()

¡Quee taaaaal! Esta función genera un valor único, de tipo uniqueidentifier cada vez que se ejecuta.  Esta función es muy útil al tener que crear valores únicos. Por ejemplo: Una clave primaria.

Veamos algunos ejemplos:

Seleccionar un valor único aleatorio

Valor Unico
Valor Unico

Seleccionar varios valores al mismo tiempo para comprobar su característica de ser único

Valores Unicos
Valores Unicos

Ahora usemos esto en un caso real. Creemos una tabla, cuya clave primaria sea un campo de tipo uniqueidentifier


CREATE TABLE MiTabla
(
id UNIQUEIDENTIFIER PRIMARY KEY NOT NULL,
color VARCHAR(10) NOT NULL
)

Ojo con el tipo de datos que tiene el campo id.
Insertamos unos datos

INSERT INTO MiTabla (ID, color) VALUES (NEWID(),'VERDE')
INSERT INTO MiTabla (ID, color) VALUES (NEWID(),'AMARILLO')
INSERT INTO MiTabla (ID, color) VALUES (NEWID(),'ROJO')

Y seleccionamos los datos a ver que tenemos:

SELECT * FROM MiTabla

Y el resultado:

Ejemplo de tabla con valores unicos
Ejemplo de tabla con valores unicos

Procedimientos Almacenados en SQL Server

Un procedimiento almacenado no es  más que un conjunto de instrucciones T-SQL que puede aceptar varios parámetros de entrada y devolver distintos valores de salida. También puede llamar a otros procedimientos almacenados y, además, incluir una referencia al CLR de .NET.

Usar procedimientos almacenado tiene múltiples ventajas, entre las que destacan:

  • Trafico reducido entre cliente y servidor:  Todas las sentencias se ejecutan en un solo lote de código. Por la red solo viaja el llamado al procedimiento y sus parámetros. No viaja la sentencia completa, porque ya está almacenada en el servidor.
  • Mayor Seguridad: Puede que para ejecutar cierta operación sobre la base de datos se necesiten ciertos privilegios. Para no estar otorgando privilegios sobre la base de daos a los usuarios, se puede especificar que usuario ejecuta las sentencias descritas dentro del procedimiento almacenado. Esto se logra haciendo uso de la clausula EXECUTE AS al momento de crear el procedimiento almacenado.
  • Reutilizar Codigo: Al reutilizar las sentencias y no reescribirlas cada vez que se necesiten, se evitan inconsistencias y se ahorra tiempo.
  • Mantenimiento sencillo:  En el caso de una actualización del modelo de la base de datos  o cualquier modificación de la estructura de esta, no va a ser necesario modificar todas las consultas de la aplicación. Solo se modifican los procedimientos almacenados generando un minimo impacto en la aplicación.
  • Rendimientos mejorados: Una sentencia se compila cada vez que se ejecuta en la base de datos. En cambio, un procedimiento almacenado es compilado una sola vez y se crea un plan de ejecución que se usará cada vez que se hace una llamada al procedimiento almacenado. Se disminuye la carga del servidor.

Para crear un procedimiento almacenado se debe usar la sentencia CREATE PROCEDURE. Por ejemplo:

CREATE PROCEDURE [dbo].[MiProcedimiento]
@genero char(1)
AS
SET NOCOUNT ON
SELECT
[NationalIDNumber],
[OrganizationNode],
[JobTitle],
[MaritalStatus],
[HireDate]
FROM
HumanResources.Employee
WHERE
[Gender] = @genero
GO

En esta porción de código se pueden indicar varias partes:

  1. En la línea 1, se indica que se creará un nuevo procedimiento almacenado y se le otorga un nombre.
  2. Luego vienen los parámetros con sus respectivos tipos de datos.
  3. AS indica que comienzan las instrucciones en t-sql.
  4. SET NOCOUNT ON indica que no se devolverán las filas afectadas. Se puede dejar en OFF si se quiere saber cuantos registros se seleccionaron o cuantos fueron afectados con la operación.
  5. Consulta SQL. Esta consulta trae los nombres de los empleados según el genero.

Para llamar a un procedimiento almacenado, se debe usar la sentencia EXEC. Por ejemplo:


EXEC MiProcedimiento 'M'

Este procedimiento almacenado fue creado en la base de datos AdventureWorks. Pruebalo tu también.

Delete, Truncate y Drop

Delete From, Truncate Table y Drop Table  son sentencias de SQL que sirven para borrar. Existen en todos los motores de base de datos, pero los tres hacen borrados distintos.

Delete From

Esta sentencia DML se utiliza para eliminar registros según condición, o simplemente, borra todos los registros de la tabla.  No es autocommit, registra todo en el log de transacciones y no altera la estructura de la tabla. Tiene a ser un poco ineficiente al registrar todo. Veamos este ejemplo:

A una tabla con 14 registros, le di la siguiente instrucción:

DELETE FROM Tabla1

Ocurrió lo esperado: Eliminó todos los registros de la tabla y no modificó su estructura. Además, registró todo en el log de transacciones y realizó el commit una vez que ejecutó todos los delete

 

Log transaccional de DELETE FROM
Log transaccional de DELETE FROM

Tomar en cuenta que todo lo que está dentro del cuadrado rojo corresponde a la eliminación de cada uno de los registros de la tabla. Hay una porción destacada en amarillo. Es ahí cuando realiza el commit.

Cuando se elimina un registro en una tabla que tiene un campo como identity el contador nunca más vuelve a usar el registro identity que se eliminó. Por ejemplo:


Numero color
1 blanco
2 rojo
3 azul

y ejecutamos lo siguiente:

DELETE FROM Tabla WHERE Numero = 2

Va a eliminar el segundo registro y al insertar un campo en la base de datos, quedaría así:

Numero color
1 blanco
3 azul
4 amarillo

Al manipular los datos de la tabla, está sujeto a las restricciones de las claves foráneas.

 

Truncate

Truncate Table, sentencia DDL,  elimina todos los registros de la tabla. A diferencia de Delete From, no escribe en el log de transacciones, por lo que no es posible hacer un rollback.  La otra diferencia que tiene con Delete From, es que no ofrece un borrado selectivo y no se le puede pasar un trigget con ON DELETE.
Ejemplo de la imagen:

Ejemplo de Truncate Table
Ejemplo de Truncate Table

Como se puede ver en la imagen, no registra todos los datos que elimina. Lo único que hace es un deallocate.

 

Al borrar los datos de un tabla que tiene una columna como identity, el contador vuelve a cero. Veamos el ejemplo:


Numero color
1 blanco
2 rojo
3 azul

y ejecutamos lo siguiente:

TRUNCATE TABLE Tabla

La tabla quedará vacía y al insertar un registro quedará así:

Numero color
1 verde

Al eliminar registros con esta sentencia, está sujeto a las restricciones de las claves foráneas.

 

Drop

Sentencia DDL, que se utiliza para modificar la estructura de una tabla, por ejemplo al eliminar una columna de una tabla, o bien, eliminar la tabla completa.  Al eliminar la tabla completa, lo primero que hace es hacer un borrado de los registros con DELETE, hace un commit y al final borra la tabla.  El registro es bastante grande, así que me disculparán por no poner un ejemplo.

Espero que esto les haya servido de ayuda.

Exportar datos de MAP Toolkit

Hola Mundo. Último dia de Abril. En el post anterior conté que conocí a una herramienta bastante potente para hacer inventario dentro de una red. Ésta trabaja sobre un SQL Server 2008 Express, por lo que no se puede conectar a través de SQL Server Management Studio.

En su momento, pensé que iba a tener algunos problemas para exportar la info. Después de bastante rato de intentarlo, llegué a lo siguiente:

Recuerden que estaba haciendo un inventario de SQL Server

  1. Iniciar el servicio de SQL Browser desde el Configuration Manager
  2. Importar datos desde SQL Server. Conectarse a la instancia MAPS. (OJO Piojo. Hay que indicar el nombre del equipo y la instancia. Por ejemplo: Mi máquina se llama SQL2 y la instancia se llama MAPS, entonces debo conectarme a SQL2MAPS)
  3.  Importar las siguientes tablas/vistas: sql_inventory_dbinstance_view, sql_dbinstance_databases_view, sql_databaseserverproperties y sql_databaseproperties

Con esto tendrán la info en un Excel lista para llevar.