martes, 20 de mayo de 2014

Atachar y recrear log de Sql Server

En esta ocasión hablaré de cómo atachar una base de datos de Sql Server.

El atachar una base de datos sirve para restaurar una base de datos a partir del archivo primario y/o archivos secundarios.

Generalmente se presenta esta situación cuando no se tiene espeacio en disco duro para hacer un respaldo y restaurar la base en otra de respaldo. También sirve para generar logs de datos más pequeños o para recuperarse en caso de que el sistema operativo o servidor queden fuera de servicio y no se cuenta con un respaldo de la base de datos.

Es recomendable que se instalen las bases de datos en unidades físicas de disco duro distintas de donde está instalado el disco duro.

CREATE DATABASE baseDeDatos 
    ON (FILE='d:\rutaDeArchivoPrimario.mdf')
    FOR ATTACH_REBUILD_LOG

lunes, 14 de abril de 2014

Respaldo comprimido en Sql Server

El siguiente script les permitirá hacer un respaldo desde Sql Server Management Studio con compresión y verificación de integridad.
Para llenar en automático los campos ejecuten el atajo "Ctrl + M".
Les aparecera una ventana que solicita el nombre de la base de datos, la fecha del respaldo y una descripción del mismo.
Pueden cambiar la ruta en donde queda guardado el respaldo.
La compresión en los respaldos se puede aplicar en Sql Server 2008 y 2012.
El radio de compresión es casi de 5 a 1, es decir que una base de 5GB se quedará respaldada en aproximadamente 1 GB.

USE [master];

BACKUP DATABASE <baseDeDatos, VARCHAR(100),>
TO DISK = 'D:\SQL Server 2008\Backup\<baseDeDatos, VARCHAR(100),>_<fecha,VARCHAR(8),>.bak'
WITH 
 COMPRESSION, 
 CHECKSUM,
 NAME = '<baseDeDatos, VARCHAR(100),> - <descripcion, VARCHAR(100),>';

domingo, 9 de febrero de 2014

Leer las bases de datos MongoDB desde Java / Read MongoDB databases from Java

Hola, a continuación les muestro como leer los nombres de las bases de datos de MongoDB desde Java 1.7, usando el conector versión mongo-java-driver-2.9.3.jar.

Hello, next I will show you how to read the MongoDB database names from Java 1.7, using connector version mongo-java-driver-2.9.3.jar.
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import java.util.List;

public class MongoDBAccess {

 /**
  * @param args
  */
 public static void main(String[] args) {
  Mongo mongoClient = null;
  try{
   mongoClient = new Mongo("127.0.0.1", 27017); // Change to proper server or port, I used the default one
   List databases = mongoClient.getDatabaseNames();
   for(String database : databases){
    System.out.println(database);
   }
  }
  catch(MongoException exc){
   System.out.println(exc.getMessage());
  }
  catch(Exception exc){
   System.out.println(exc.getMessage());
  }
  finally{
   if(mongoClient != null){
    mongoClient.close();
   }
  }
 }
}
Para mayor información, visiten: MongoDB - Java Language Center
For further information, visit: MongoDB - Java Language Center

domingo, 2 de febrero de 2014

Año bisiesto en Oracle.

Hoy expondré una función para determinar si un año es bisiesto en Oracle. Si tienen dudas acerca del algoritmo. Lo pueden checar el mi artículo de año bisiesto en Sql server.
CREATE OR REPLACE FUNCTION esBisiesto(fecha DATE)
RETURN NUMBER
AS
 esBisiesto NUMBER(1,0) := 0;
 anio NUMBER(4,0) := TO_NUMBER(TO_CHAR(fecha, 'YYYY'),'9999'); --Extrae el anio
BEGIN

 IF anio MOD 4 = 0 AND (anio MOD 100 <> 0 OR anio MOD 400 = 0)
    THEN
  esBisiesto := 1;
    END IF;
    RETURN esBisiesto;
END;

domingo, 26 de enero de 2014

Encender leds en secuencia con Arduino.

Hoy expondré como programar una secuencia de leds en Arduino.
Los leds encienden con lógica negativa, es decir en estado bajo (0) o conexión a tierra.
Los leds están conectados a los pines 10-13 de la tableta Arduino ADK. En el resto de las tabletas Arduino Uno también puede funcionar.
A continuación pueden ver el esquema eléctrico y el código fuente de Arduino.
// LUCES SECUENCIALES

// Se establecen las pines 10 al 13 como salidas digitales
int salidas[] = {10,11,12,13};
int contador = 0;

void setup() {                
  for(contador = 0; contador < 4; contador++){
    pinMode(salidas[contador], OUTPUT);
    digitalWrite(salidas[contador], HIGH); // La conexion del circuito es LOW ACTIVE, el estado HIGH apaga el led.
  }       
}

void loop() {
  contador = 0;
  while(contador < 4){
    digitalWrite(salidas[contador], LOW); // Enciende el led especificado en el arreglo
    delay(1000); // Retarda 1 segundo en el arreglo
    digitalWrite(salidas[contador], HIGH); // Apaga el led especificado en el arreglo
    if(contador == 4) contador = 0; // Reinicia la secuencia
    contador++; // Incrementa la salida de led a encender
  }
}

lunes, 30 de diciembre de 2013

Leap Year function in Sql Server

Here is a function to determine if a year is a leap year in Sql Server.

The rules to determine a leap year are:

  • Must be divisible by 4.
  • Must NOT be divisible by 100.
  • Must be divisible by 400.
CREATE FUNCTION isLeapYear(
 @date DATETIME
) RETURNS BIT 
AS
BEGIN
 DECLARE 
  @year INT,
  @isLeapYear BIT
  
 SET @year = YEAR(@date)

 IF @year % 4 = 0 AND (@year % 100 <> 0 OR @year % 400 = 0)
 BEGIN
  SET @isLeapYear = 1
 END
 ELSE
 BEGIN
  SET @isLeapYear = 0
 END 

 RETURN @isLeapYear
END

Introducción a Programando Chácharas

Estimados lectores, les doy la bienvenida a Programando Chácharas; un sitio dedicadoa cubrir temas básicos sobre los aspectos de la programación a

Activar xp_cmdshell en Sql server 2005 - 2008

El procedimiento xp_cmdshell sirve para ejecutar comandos de DOS desde SQL Server.

Se preguntarán para que me sirve ejecutar comandos DOS desde Sql Server. Pues a veces es util crear directorios, leer su contenido o copiar archivos, cuando no se tiene acceso directo o de consola al servidor en el que está instalado Sql Server.

El comando viene desactivado porque representa un hueco de seguridad que puede ser usado en nuestra contra, pero hay veces que es útil saber de su existencia y usarlo para salir del paso.

Para habilitar su uso se requiere ser administrador de la base de datos. Estos son los comandos:

USE master;

GO

EXECUTE SP_CONFIGURE 'show advanced options', 1
RECONFIGURE WITH OVERRIDE

GO
 
EXECUTE SP_CONFIGURE 'xp_cmdshell', '1'
RECONFIGURE WITH OVERRIDE

GO

EXECUTE SP_CONFIGURE 'show advanced options', 0
RECONFIGURE WITH OVERRIDE

GO

Para deshabilitarlo:
USE master;

GO

EXECUTE SP_CONFIGURE 'show advanced options', 1
RECONFIGURE WITH OVERRIDE

GO
 
EXECUTE SP_CONFIGURE 'xp_cmdshell', '0'
RECONFIGURE WITH OVERRIDE

GO

EXECUTE SP_CONFIGURE 'show advanced options', 0
RECONFIGURE WITH OVERRIDE

GO
Para usarlo:
EXECUTE master.dbo.xp_cmdshell 'dir c:\'

martes, 3 de abril de 2012

Trigger en Oracle

Este es un trigger transaccional de Oracle para comunicarse a Sql Server
CREATE OR REPLACE 
TRIGGER tgrInsertaLocalizadorEnKuve
  AFTER UPDATE ON tarima
  REFERENCING NEW AS NEW
  FOR EACH ROW
DECLARE PRAGMA AUTONOMOUS_TRANSACTION;
  vFecha DATE := SYSDATE;
  --vClaveProducto CHAR(40);
  --vClaveTipoProducto NUMBER;
BEGIN

  -- LoteInterno = noLocalizador
  -- CostoPromedio = idEstatus
  -- loteFabricante = imei
  -- loteProveedor = numeroControl
  
  --SELECT claveTipoProducto 
  --INTO vClaveTipoProducto
  --FROM producto
  --WHERE claveProducto = vClaveProducto;
  
  --IF vClaveTipoProducto = 1 THEN -- Si el producto es de tipo GPS
  IF :NEW.claveProducto IN ('1', '2', '21', '22') THEN

    INSERT INTO localizadorTemporal@hsodbcDes
    VALUES(:NEW.loteInterno, :NEW.costoPromedio,  :NEW.loteFabricante, :NEW.loteProveedor, vFecha);
    COMMIT;
    
  END IF;
  
  EXCEPTION
  WHEN OTHERS THEN
      raise_application_error(-20001,'Hubo error: '||SQLCODE||' -ERROR- '||SQLERRM);

END;

lunes, 15 de agosto de 2011

Actualización de registros en SQL Server con unión de tablas y recuperación de registros actualizados

Este script demuestra cómo actualizar 2 tablas relacionadas mediante un JOIN y como poder recuperar los registros actualizados.


DECLARE @tablaReferencia TABLE(
id INT,
valorReferencia INT
)

DECLARE @tablaAActualizar TABLE(
id INT,
valor INT DEFAULT 0,
otro INT DEFAULT 0
)

DECLARE @actualizados TABLE(
id INT,
valor INT,
otro INT
)

INSERT INTO @tablaReferencia(id, valorReferencia) VALUES(1, 4)
INSERT INTO @tablaReferencia(id, valorReferencia) VALUES(2, 5)

INSERT INTO @tablaAActualizar(id) VALUES(1)
INSERT INTO @tablaAActualizar(id) VALUES(2)
INSERT INTO @tablaAActualizar(id) VALUES(3)

SELECT * FROM @tablaReferencia
SELECT * FROM @tablaAActualizar

UPDATE @tablaAActualizar
SET valor = tr.valorReferencia, otro = 6
OUTPUT
INSERTED.id, INSERTED.valor, INSERTED.otro
INTO @actualizados
FROM @tablaAActualizar ta
INNER JOIN @tablaReferencia tr
ON ta.id = tr.id


SELECT * FROM @tablaAActualizar
SELECT * FROM @actualizados