miércoles, 16 de mayo de 2012

Habilitar o Deshabilitar Triggers en SQL Server

Con este script se pueden habilitar o deshabilitar todos los triggers de la Base de Datos que se encuentre seleccionada.

    DECLARE @cTgName    VARCHAR(50)
    DECLARE @cTableName    VARCHAR(50)

    SET NOCOUNT ON;
   
    DECLARE Cur_TG CURSOR LOCAL FORWARD_ONLY FOR
        SELECT (SCH.NAME + '.' + STG.NAME) AS TG_NAME, (SCH.NAME + '.' + SAO.NAME) AS TABLE_NAME 
        FROM SYS.TRIGGERS STG,
        SYS.ALL_OBJECTS AS SAO,
        SYS.SCHEMAS AS SCH
        WHERE STG.PARENT_ID = SAO.OBJECT_ID
        AND SAO.SCHEMA_ID = SCH.SCHEMA_ID
           
    OPEN Cur_TG
    FETCH Cur_TG INTO @cTgName, @cTableName
   
    WHILE (@@FETCH_STATUS = 0)
    BEGIN

        BEGIN TRY
            -- Para Habilitar
            EXEC ('ENABLE TRIGGER ' + @cTgName + ' ON ' + @cTableName)
            -- Para Deshabilitar
            EXEC ('DISABLE TRIGGER ' + @cTgName + ' ON ' + @cTableName)
        END TRY
        BEGIN CATCH
            PRINT ERROR_MESSAGE()
        END CATCH

        FETCH Cur_TG INTO @cTgName, @cTableName

    END -- Fin del bucle WHILE
   
    CLOSE Cur_TG
    DEALLOCATE Cur_TG

Habilitar o Deshabilitar Llaves Foráneas en SQL Server

Con este script se habilitan o deshabilitan todos los foreing keys de la Base de Datos que se tenga seleccionada.


    DECLARE @cFKName    VARCHAR(50)
    DECLARE @cTableName    VARCHAR(50)

    SET NOCOUNT ON;

    DECLARE Cur_FK CURSOR LOCAL FORWARD_ONLY FOR        
        SELECT SFK.NAME AS FK_NAME, (SCH.NAME + '.' + SAO1.NAME) AS TABLE_NAME
        FROM SYS.FOREIGN_KEYS AS SFK,
        SYS.SCHEMAS AS SCH,
        SYS.ALL_OBJECTS AS SAO1
        WHERE SFK.SCHEMA_ID = SCH.SCHEMA_ID
        AND SFK.PARENT_OBJECT_ID = SAO1.OBJECT_ID

    OPEN Cur_FK
    FETCH Cur_FK INTO @cFKName, @cTableName
   
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
       
        BEGIN TRY

            -- Para Habilitar
            EXEC ('ALTER TABLE ' + @cTableName + ' CHECK CONSTRAINT ' +  @cFKName)
            -- Para Deshabilitar
            EXEC ('ALTER TABLE ' + @cTableName + ' NOCHECK CONSTRAINT ' +  @cFKName)
        END TRY
        BEGIN CATCH
            PRINT ERROR_MESSAGE()
        END CATCH

        FETCH Cur_FK INTO @cFKName, @cTableName

    END -- Fin del bucle WHILE
   
    CLOSE Cur_FK
    DEALLOCATE Cur_FK

lunes, 9 de abril de 2012

Generar Archivos CSV con Progress

Para  generar archivos CSV con Progress, se utiliza la instruccion EXPORT. Enseguida un ejemplo:

OUTPUT TO C:\REPORTES\PREDIO.CSV.

FOR EACH PREDIO NO-LOCK WHERE NUM-RUTA > 0 AND  NUM-RUTA < 999:
  EXPORT DELIMITER "," NUM-CUENTA DIRECC-ORIGINAL GIRO-USUARIO TIPO-USUARIO.
END.

OUTPUT CLOSE.


lunes, 2 de abril de 2012

Conectando Progress con ODBC

Para conectarnos a Progress mediante ODBC tenemos que instalar el driver primeramente, éste viene incluido en la suite de Progress DB y tambien tenemos que tener el servicio de BD escuchando en algun puerto conocido.

Despues ejecutaremos en Administrador de Conexiones ODBC, con el comando odbcad32 y configuraremos nuestra conexión de la siguiente manera:


Es importante usar el usuario sysprogress que originalmente no tiene password. Ahora para conectarnos a la BD lo podemos hacer desde cualquier cliente odbc; yo particularmente uso uno que se llama SQLDBX (http://www.sqldbx.com/).

Ahora ya teniendo la conexión podemos ver los usuarios de la BD con el siguiente query:

select "_userid", "_password", "_user-name" from pub."_user"

Para ver las tablas que contiene la BD podemos ejecutar el siguiente query:

SELECT * FROM sysprogress.SYSTABLES WHERE TBLTYPE = 'T'

Para ver el contenido de alguna tabla podemos ejecutar un query de la siguiente manera:

SELECT * FROM PUB.BENEFITS

Es importante siempre utilizar el esquema PUB, ya que de no hacerlo los queries no funcionarán.

Para crear un usuario nuevo podemos ejecutar la siguiente secuencia de queries:

create user 'sa','password';
grant dba to 'sa';


Una vez que creamos el usuario, automáticamente el usuario sysprogress ya no funciona para la conexión ODBC.


Arrancar y Detener Servicio de BD de Progress

Para arrancar el servicio de Progress DB ejecutaremos el siguiente comando, de preferencia debemos hacerlo con permisos de Administrador.

SET WRKDIR=C:\Progress\WRK
cd C:\Progress\dlc91c\bin
proserve.bat C:/DATA/sports2000/sports2000.db -S 2525 -N TCP -L 300000

Donde 2525 es el puerto en que escuchar el servidor de BD.

Para detener el servicio podemos ejecutar el siguiente comando.

cd C:\Progress\dlc91c\bin
proshut.bat C:/DATA/sports2000/sports2000.db

miércoles, 28 de marzo de 2012

¿Cómo saber si existe una tabla en la BD?

¿Cómo saber si existe una tabla en nuestra BD? Podemos crear y usar la sig función.

Para mandar llamar la funcion

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[existeTabla]
(
    @cTableName VARCHAR(255)
)
RETURNS BIT
AS
BEGIN
    DECLARE @nReturn BIT
    SET @nReturn = 0

    IF (SELECT COUNT(*) FROM SYS.OBJECTS
        WHERE TYPE = 'U' AND UPPER(NAME) = UPPER(@cTableName)) > 0 BEGIN
        SET @nReturn = 1
    END
   
    RETURN @nReturn
END

Para mandar llamar la funcion podemos usar el siguiente query:
SELECT [dbo].[existeTabla] ('TABLA_A_BUSCAR')

Si el resultado es 1 la tabla existe, en caso contrario no existe.


viernes, 16 de marzo de 2012

Crear Indices en Tablas Temporales

Para crear indices en tablas temporales, se puede utilizar el siguiente código.

CREATE TABLE #t1 (a int, b int)
GO
CREATE CLUSTERED INDEX Idx1 ON #t1(b)
CREATE UNIQUE NONCLUSTERED INDEX Idx2 ON #t1(a)
GO
INSERT INTO #t1 VALUES ('1', '0')
GO
DROP TABLE #t1


Nota: En Variables Tabla no se pueden crear índices.

jueves, 8 de marzo de 2012

Buscar una Cadena de Texto en SPs y Funciones

Muchas veces pasa que cambiamos el nombre a alguna tabla, sp, función, etc. Y luego no sabemos en que códigos tenemos ese objeto que modificamos. Para poder sacar donde tenemos ese objeto modificado podemos ejecutar el siguiente query.

SELECT (SELECT TOP 1 NAME FROM sys.schemas WHERE schema_id = ALL_OBJECTS.schema_id) AS ESQUEMA, * 
FROM SYS.ALL_OBJECTS 
WHERE OBJECT_ID IN (SELECT ID FROM syscomments WHERE CTEXT LIKE '%Objeto_a_buscar%') 
ORDER BY SCHEMA_ID

Donde Objeto_a_buscar es la tabla, sp o funcion que deseamos buscar.

Salu2

lunes, 5 de marzo de 2012

Reindexar BD en SQL Server

Script para todas las tablas de una BD de SQL Server ...

DECLARE @cTableName VARCHAR(MAX)

SET NOCOUNT ON;

DECLARE Cur_Tablas CURSOR LOCAL FORWARD_ONLY FOR
SELECT ESQUEMAS.NAME + '.' + TABLAS.NAME AS TABLA
FROM SYS.OBJECTS TABLAS
,SYS.SCHEMAS ESQUEMAS
WHERE TABLAS.TYPE = 'U'
AND ESQUEMAS.SCHEMA_ID = TABLAS.SCHEMA_ID
ORDER BY ESQUEMAS.NAME, TABLAS.NAME

OPEN Cur_Tablas
FETCH Cur_Tablas INTO @cTableName

WHILE (@@FETCH_STATUS = 0)
BEGIN

BEGIN TRY
EXEC ('DBCC DBREINDEX ("' + @cTableName + '"," ", 70)')
PRINT @cTableName
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE()
END CATCH

FETCH Cur_Tablas INTO @cTableName

END -- Fin del bucle WHILE

CLOSE Cur_Tablas
DEALLOCATE Cur_Tablas

jueves, 1 de marzo de 2012

Respaldos en SQL Server

Sp para realizar respaldos.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_Backup]
AS
BEGIN
declare @cPrefijo varchar(10), @cRutaBak varchar(250)
select @cPrefijo ='BD_', @cRutaBak ='C:\Backups\'

declare @cNameBak varchar(80), @cNameResp varchar(80)
select @cNameBak = @cPrefijo+dbo.dtos(getdate())+'-'+replace(str(datepart(hh,getdate()),2)+str(datepart(mi,getdate()),2),' ','0')+'.BAK'
select @cNameResp = @cRutaBak + @cNameBak

BACKUP DATABASE [BD] TO DISK = @cNameResp
WITH COMPRESSION, NOFORMAT, NOINIT,
NAME = N'BD-Full Database Backup',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
END

Para mandarlo llamar:

EXECUTE [dbo].[usp_Backup]

Liberar Memoria en SQL Server

Sp para Liberar Memoria sin necesidad de reiniciar el Servicio ...

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[usp_LiberarMem]
AS
BEGIN
EXEC sp_configure 'show advanced options', 1;
--GO
EXEC sys.sp_configure N'max server memory (MB)', N'1024'
--GO
RECONFIGURE WITH OVERRIDE
--GO
CHECKPOINT
--GO

WAITFOR DELAY '00:00:30'
EXEC sp_configure 'show advanced options', 1;
--GO
EXEC sys.sp_configure N'max server memory (MB)', N'8192'
--GO
RECONFIGURE WITH OVERRIDE
--GO
END

Para ejecutarlo:

EXECUTE [dbo].[usp_LiberarMem]

lunes, 16 de enero de 2012

Un Mediodía Triste

“Un mediodía triste, viendo el lomo gris del metro
aplanando la banqueta,
mientras derrite el asfalto un sol blanco y voraz”.

“Pasan los delfines como almas en pena,
consortes de la muerte que se sube al mundo sin pagar boleto.
El viento aúlla canciones flacas.
Gente hay una peste, como esperando a Cristo.
Cristo está sentado seguramente
en la tercera fila de un burlesque”.

Hay un bar pequeño,
con la esquina verde,
afuera dormita un organillero.
Tiene espesas cejas
y babea alcohol:
lo cubre la sombra de un ángel bluesero.

Poco movimiento,
es temprana hora.
La ciudad no muestra su cara granosa,
supurante y roja,
sus pelos al pecho,
ni su carne floja.

“La tarde se sienta en el centro viejo,
se baja las medias corridas y sucias,
menea sus pestañas de mujer nocturna
y deja caer la noche al abrir las piernas”.

“Podrías morir de una enfermedad que usa placa y corriente eléctrica,
o sumergido en una plácida niebla de opio,
o montado en las cálidas carnes de una mujer fenicia.
Podrías morir un día cualquiera,
la hora poco importa,
¡son tiempos obscuros,
escucha atento a las sirenas!”.

De una madriguera
surge la pandilla,
por usar espuelas todos son buscados.
Como la marea
de un mar iracundo,
van cubriendo tramos de calles ajenas.
Embarran los muros
de pintura roja;
hay una emoción que fricciona el aire.
Aún no crecen flores en el pavimento.
La ciudad se ha vuelto una novia amarga.

Tengo tres preguntas,
responda el primero:
¿quién mató la noche?,
¿quién abrió la puerta?,
¿descifró este sueño
y se ocultó en el alba?

José Cruz Camargo