Mostrando las entradas con la etiqueta DBA. Mostrar todas las entradas
Mostrando las entradas con la etiqueta DBA. Mostrar todas las entradas

2017/04/03

SQL Server - Como ocultar una instancia

Por defecto cuando instalamos SQL Server nuestra instancia esta abierta y puede ser descubierta vía red, para demostrar esto simplemente abrimos un SSMS (SQL Server Management Studio) y vamos al browser de servidores SQL de nuestra red.
SQL Server - Como ocultar una instancia

Como se observa en la imagen al hacer un browser de servidores va a buscar en toda la red. todo SQL Server que este activo.
Para que esto no suceda lo que necesitamos hacer es configurar la instancia para que este en modo hide, para eso hacemos:
 - Accedemos al SQL Server configuration Manager.
 - Vamos a SQL Server Network Configuration.
 - Protocolos de SQL Server y hacemos clic del mouse sobre esa opción para ir a propiedades.
SQL Server - Como ocultar una instancia
 - Ponemos en Yes la opción de “Hide Instance”.
 - Reiniciamos el servicio.

Con esta configuración nuestra instancia queda mas segura ya que la misma no podrá ser browsiada a nivel red.

2015/05/16

SQL Server - Convertir o separar por comas una cadena dividido en filas

La siguiente función convierte y separa comas una cadena dividido en filas.
DECLARE @nombre_db AS VARCHAR(50) 
CREATE FUNCTION fn_SplitString
(
 @Str           NVARCHAR(MAX),
 @Separator     CHAR(1)
)
RETURNS @ResultOutput TABLE(Id INT IDENTITY(1, 1), Result NVARCHAR(100))
AS
BEGIN
 DECLARE @Splitted_string NVARCHAR(4000)
 DECLARE @Pos INT
 DECLARE @NextPos INT
 
 SET @Str = @Str + @Separator
 SET @Pos = CHARINDEX(@Separator, @Str)
 WHILE (@pos <> 0)
 BEGIN
     SET @Splitted_string = SUBSTRING(@Str, 1, @Pos - 1)
     SET @Str = SUBSTRING(@Str, @pos + 1, LEN(@Str))
     SET @pos = CHARINDEX(@Separator, @Str)
     INSERT INTO @ResultOutput
     VALUES
       (
         @Splitted_string
       )
 END
 RETURN
END
Utilizando la función fn_SplitString en consulta:
--Separar una cadena por comas
SELECT Result
FROM   fn_SplitString('Split,string,example,in,sql,server', ',')

--Separar una cadena por símbolo de canalización
SELECT Result
FROM   fn_SplitString('Split|string|example|in|sql|server', '|')

--Separar una cadena por el espacio
SELECT Result
FROM   fn_SplitString('Split string example in sql server', ' ')

2015/01/08

SQL SERVER - Encontrar tablas creadas o modificadas en la última semana

El siguiente Script SQL muestra una manera de identificar las tablas que se crearon o modificaron en la base de datos en la ultima semana.
 
SELECT o.name AS [Object_Name]
      ,s.name [Schema_Name]
      ,o.type_desc [Description]
      ,o.create_date [Creation_Date]
      ,o.modify_date [Modified_Date]
FROM   sys.all_objects o
       LEFT OUTER JOIN sys.schemas s
            ON  o.schema_id = s.schema_id
WHERE  create_date>(GETDATE()- 7)
       OR modify_date>(GETDATE()- 7)


Como puede ver, la consulta se puede agregar a un Job de SQL Server y podemos enviar el mismo como un correo electrónico al DBA o equipo de seguridad de forma automática.

2014/12/30

Cómo elegir una Base de Datos para su Empresa


A medida que su organización recopila más datos y quiere hacer un mejor uso de los datos que va adquiriendo se tienen varias opciones que van mucho más allá de las bases de datos tradicionales. Quizás ud. se encuentra en el punto en que el uso de herramientas de inteligencia de negocios que hacen extracciones desde su datawarehouse no es  suficiente, y los datos son demasiado grandes para analizarlos lo suficientemente rápido por los medios tradicionales, y por lo tanto, es el momento de realizar un análisis detallado de las alternativas de bases de datos disponibles en el mercado.

Claramente la elección de la tecnología de base de datos estará determinada por los parámetros de su proyecto: la cantidad de datos, la rapidez con que le llegan, el análisis que quiere hacer y si va a utilizarlos operacionalmente o para la toma de decisiones estratégicas. También es posible que desee extraer conocimiento del negocio, por ejemplo, de la venta al detalle en el punto de venta o de las transacciones de un programa de CRM. Quizás usted podría estar tratando de acelerar la logística, identificar dónde está el inventario en tiempo real en su cadena de suministro o realizar un seguimiento del comportamiento de un gran número de clientes en su sitio web.

La pregunta es entonces: ¿Cuáles bases de datos son apropiadas para determinados tipos de proyectos?. La siguiente breve guía que hemos elaborado, puede ayudarle a evaluar las opciones que hay disponibles:

Base de datos relacional

Qué es: Es el sistema tradicional de base de datos relacional, con datos estructurados organizados en tablas.
Fortalezas: Usa el lenguaje estándar de consulta SQL, que  garantiza la consistencia de los resultados de las consultas.
Debilidades: Requiere que la tabla completa se almacene en archivo o memoria, requiere de datos estructurados y esquemas relacionales, la tabla canónica debe ser replicada con el fin de realizar análisis en servidores paralelos.

Si usted está tratando con datos estructurados o de transacciones relativamente simples, por ejemplo, pedidos de clientes o datos de puntos de venta y desea la máxima flexibilidad en las preguntas que quiere responder, el lugar para comenzar es la base de datos relacional. La ventaja directa es que su organización probablemente ya está utilizando un RDBMS, por lo que su personal de TI,  incluyendo los analistas de bases de datos, pueden crear las consultas SQL directamente sin necesidad de mayor entrenamiento. Usted sólo tiene que elegir una base de datos de clase empresarial (a la escala adecuada de su proyecto) para satisfacer sus necesidades de análisis de datos. Puede elegir algunas tales como Oracle, IBM InfoSphere Warehouse, Sybase o Teradata. Hay muchas más, éstas son sólo un ejemplo.

Por otro lado, las desventajas podrian estar en el precio, en la flexibilidad de las consultas a datos que están rigurosamente estructurados y que se almacenan en un único conjunto canónico de tablas, las cuales tienen que ser replicadas si necesitar usar el procesamiento en paralelo para acelerar el rendimiento. En este caso, cada actualización tiene que ser replicada en otras copias, así que si los datos cambian mucho, hay un montón de costos asociados (procesamiento en memoria, procesamiento en disco, equipos, discos,  tiempo, etc.), lo que afectará negativamente a los tiempos de respuesta de las consultas. Usted podría también mantener las tablas en memoria en lugar de tenerlas en el disco, con el fin de acelerar la lectura y escritura, pero esto tiene un costo mayor. Y a medida que crecen los datos, el tiempo de respuesta para las consultas de análisis pueden fácilmente pasar de ser instantáneas a tomar horas, días o semanas.

Base de datos columnar

Qué es: Es una base de datos relacional que almacena los datos por columna en lugar de filas.
Fortalezas: Todos los puntos fuertes de una base de datos relacional, optimizada para un mejor rendimiento en el análisis de los datos de varias columnas a la vez.
Debilidades: Requiere que la tabla completa se almacene en archivo o memoria, requiere de datos estructurados y esquemas relacionales.

¿Qué pasa si sus datos están muy estructurados, pero necesita realizar un mayor análisis de los datos almacenados en unas pocas columnas particulares, por ejemplo, el análisis de las transacciones de venta por tienda o por producto?. En este caso, una base de datos en columnas tiene más sentido, y puede elegir algunas de las opciones tales como Sybase IQ, Microsoft SQL Server 2012, Teradata Columnar o Actian VectorWise.

Aunque suena raro el nombre, una base de datos columnar es también una base de datos relacional. La diferencia está en la forma: en lugar de almacenar cada tabla de datos como una fila tras otra en un solo archivo, una base de datos columnar almacena las columnas en archivos separados, por lo que se pueden indexar y buscar por separado, incluso en diferentes servidores (en un clúster) para mejorar el rendimiento. Como resultado, las bases de datos columnares pueden ser mucho más rápidas para el análisis que una base de datos relacional tradicional, ya que lo concentran en sólo una o unas pocas columnas. A pesar de esta ventaja, este tipo de base también hereda muchos inconvenientes de las bases de datos relacionales, incluyendo el esfuerzo y el tiempo de procesamiento del sistema necesario para mantener las tablas canónicas.

Bases de datos NoSQL

Qué es: Es una base de datos no-relacional que almacena los datos en registros de transacciones en lugar de las tablas.
Fortalezas: Más rápido y más compacto cuando se trata de bases de datos muy grandes, soporta datos no estructurados o estructurados irregularmente, es compatible con el análisis y fácil de distribuir a servidores en paralelo.
Debilidades: La tecnología no está madura, no hay un lenguaje de consulta estándar o herramientas de consulta, no garantiza la consistencia en los resultados de las consultas.

Supongamos ahora que su proyecto se ocupará de un orden de magnitud superior datos, por decir Teras de información, que no están tan estructurados. Por ejemplo, el seguimiento de la logística del inventario en tiempo real o el análisis de cómo los clientes utilizan su sitio web. Con bases de datos convencionales, se podría requerir de grandes tablas multidimensionales en los que la mayor parte de las celdas probablemente estarían vacías, mientras que otras, podrían tener que almacenar varios valores a la vez. Este es el tipo de situación complicada es por la que las bases de datos NoSQL fueron creadas. Estas incluyen bases de datos NoSQL como Hadoop HBase, Hypertable, MongoDB o MarkLogic. Con NoSQL, no hay una tabla real de datos, no hay estructura física de una tabla. Aquí, en cambio, la base de datos consiste en una lista de todos los datos (que puede contener una información con diferente forma cada vez) , que se escriben, haciendo una consulta de búsqueda que lista para saber qué datos se han escrito recientemente en un registro en particular. Es como si se ha creado una enorme tabla que en cada escritura, agrega la información y estira la tabla al terminar la búsqueda en el registro.

Con NoSQL no hay necesidad de una tabla gigante canónica que se almacene en el disco o en la memoria. Los registros individuales no se escriben en una tabla, sino que se almacenan en estructuras de datos complejas en un sólo archivo o documento, como por ejemplo, almacenar la información sobre una publicación de un blog (título, cuerpo de texto, autor, etc.) junto a los comentarios y etiquetas del mismo, ¡todo en un único registro!. Y las copias de la base de datos NoSQL se pueden escribir en varios servidores dentro de un grupo, por lo que el análisis se puede dividir en paralelo. En comparación con las tablas de datos convencionales, NoSQL recorre un camino más pequeño, se realiza mucho más rápido y es más fácil de poner en paralelo. Sin embargo, como su nombre lo indica, NoSQL no ofrece garantías de integridad relacional o consistencia de datos, y en la actualidad no hay lenguaje de consulta estándar que facilite su consulta. Este tipo de bases de datos es más adecuada para el análisis de grandes volúmenes de datos (conocido en la jerga actual, como el famoso Big Data), y especialmente cuando los resultados deben ser entregados en tiempo real.

Por otro lado, tampoco hay soporte generalizado para bases de datos NoSQL, y esto podría ser un problema a la hora de pedir ayuda. Sin embargo, si existen herramientas de software que apoyan el funcionamiento de NoSQL, tales como Hadoop, que divide el trabajo que se realiza en varios servidores en un clúster. Cabe destacar también, que con la llegada del Cloud Computing, hay más proveedores con servidores en “la nube” y una variada oferta de almacenamiento, que hace innecesario adquirir hardware con el fin de hacer un análisis basado en NoSQL.

Consideraciones de gestión a tener en cuenta

Para concluir esta guía, cualesquiera sea la base de datos que elija para su proyecto deberá tener en cuenta que tendrá que adquirir tecnología y desarrollar las habilidades de su personal de TI, es decir, capacitación y entrenamiento. Asegúrese también de que los costos encajen en el contexto de su proyecto empresarial. Recuerde que la tecnología desconocida requiere de tiempo para recibir el veto de los usuarios y también de tiempo para desarrollar las habilidades de su personal de TI. Seguramente su personal de TI sabe cómo lidiar con bases de datos convencionales, pero mucho de ese conocimiento no se transferirá directamente. Una buena idea en este punto es partir con experimentos a pequeña escala o prototipos, para ir adquiriendo experiencia.

Por otro lado, hay que tener en cuenta que los proveedores de bases de datos siempre están trabajando para hacer frente a las limitaciones propias del software y el hardware,  y agregando nuevas funcionalidades para satisfacer las nuevas necesidades de manejo de grandes volúmenes de datos, y quizás ello requiera de cambiar algunas técnicas y prácticas de sus desarrolladores para asimilar e internalizar su uso.

Finalmente, es muy probable que cometa errores. Mientras menos costosos sean, mejor. Por lo que  identificar la mejor tecnología de base de datos para sus proyectos de análisis e inteligencia de negocios, es un buen punto de partida. Y este es el espíritu de esta guía. Buena suerte!.

2014/06/12

Tablas y su numero de filas en SQL Server

El siguiente script permite ver el nombre de las tablas y su numero de filas en una base de datos.
 
SELECT sysobjects.Name  AS NombreTabla,
       sysindexes.Rows  AS TotalFilas
FROM   sysobjects
       INNER JOIN sysindexes
            ON  sysobjects.id = sysindexes.id
WHERE  TYPE = 'U'
       AND sysindexes.IndId < 2
ORDER BY
       sysobjects.Name
Una vez ejecutada la consulta.

2014/06/09

Eliminar todas las conexiones activas en una base de datos

Permite cerrar las conexiones abiertas de una base de datos en SQL Server, cuando quieres  alterar y/o eliminar una tabla o base de datos y no se puedes porque existen conexiones activas que lo impiden, solo debes de ejecutar el siguiente script.
 
CREATE PROCEDURE dbo.KillConexiones 
    @dbName SYSNAME
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @spid     INT,
            @cnt      INT,
            @sql      VARCHAR(255)
    
    SELECT @spid = MIN(spid),
           @cnt     = COUNT(*)
    FROM   MASTER..sysprocesses
    WHERE  dbid     = DB_ID(@dbname)
           AND spid != @@SPID
    
    PRINT 'Eliminando ' + RTRIM(@cnt) + ' procesos.'
    WHILE @spid IS NOT NULL
    BEGIN
        PRINT 'Eliminando Proceso ' + RTRIM(@spid)
        SET @sql = 'KILL ' + RTRIM(@spid)
        EXEC (@sql)
        SELECT @spid = MIN(spid),
               @cnt     = COUNT(*)
        FROM   MASTER..sysprocesses
        WHERE  dbid     = DB_ID(@dbname)
               AND spid != @@SPID
        
        PRINT RTRIM(@cnt) + ' Procesos por eliminar.'
    END
END
GO

Encontrar los queries que consumen mas recursos

Los DMVs (Dynamic Management Views) son una magnifica forma de encontrar información de performance a partir de SQL Server 2005 en adelante (2008/2008R2/2012).

En este query de Pinal Dave se utilizan DMVs para encontrar los queries que mas consumen en un server SQL Server 2005/2008 (recordar que este script funciona solo en bases compatibles 2005/2008).
 
SELECT TOP 10 SUBSTRING(
           qt.TEXT,
           (qs.statement_start_offset / 2) + 1,
           (
               (
                   CASE qs.statement_end_offset
                        WHEN -1 THEN DATALENGTH(qt.TEXT)
                        ELSE qs.statement_end_offset
                   END - qs.statement_start_offset
               ) / 2
           ) + 1
       ),
       qs.execution_count,
       qs.total_logical_reads,
       qs.last_logical_reads,
       qs.total_logical_writes,
       qs.last_logical_writes,
       qs.total_worker_time,
       qs.last_worker_time,
       qs.total_elapsed_time / 1000000     total_elapsed_time_in_S,
       qs.last_elapsed_time / 1000000      last_elapsed_time_in_S,
       qs.last_execution_time,
       qp.query_plan
FROM   sys.dm_exec_query_stats qs
       CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY
       qs.total_logical_reads DESC -- logical reads
       -- ORDER BY qs.total_logical_writes DESC -- logical writes
       -- ORDER BY qs.total_worker_time DESC -- CPU time
Obviamente se puede cambiar el ordenamiento del script para destacar otro criterio de busqueda.

No está de más destacar un conjunto de queries, los DMVs AllStars, que se puede descargar aquí y que es una interesante herramienta para todo DBA en busca de detectar problemas de performance.

2014/06/02

Convertir números a letras en SQL Server

Función para poder convertir un monto numérico en un monto en letras, muy útil si se quiere hacer una descripción de un monto para alguna factura o boleta. Primero crearemos la función llamada "fn_ConvertirNumeroLetras" que recibe 2 parámetros, uno es el numero que deseamos convertir a letras y el otro el nombre de la moneda que deseamos concatenarlo al monto.
 
/*********************************************************************************
  NOMBRE:        fn_ConvertirNumeroLetra
  PROPOSITO: CONVERTIR NUMEROS A LETRAS.
  VERSIONES:
      Ver      Fecha        Autor               Descripción (inc. Req/inc)
     ------  ----------  ---------------    ------------------------------------
      1.0    01/06/2014  EDGAR CALZADA      CREACION
 *********************************************************************************/
 CREATE FUNCTION fn_ConvertirNumeroLetra
 (
        @Numero     NUMERIC(18, 2),
        @Moneda     VARCHAR(100)
 )
 RETURNS VARCHAR(512)
 AS
 BEGIN
        DECLARE @lnEntero       INT,
                @lcRetorno      VARCHAR(512),
                @lnTerna        INT,
                @lcMiles        VARCHAR(512),
                @lcCadena       VARCHAR(512),
                @lnUnidades     INT,
                @lnDecenas      INT,
                @lnCentenas     INT,
                @lnFraccion     INT,
                @resultado      AS VARCHAR(512)
       
        SELECT @lnEntero = CAST(@Numero AS INT),
               @lnFraccion     = (@Numero - @lnEntero) * 100,
               @lcRetorno      = '',
               @lnTerna        = 1
       
        WHILE @lnEntero > 0
        BEGIN
            /* WHILE */
            -- Recorro terna por terna      
            SELECT @lcCadena = ''          
            SELECT @lnUnidades = @lnEntero % 10            
            SELECT @lnEntero = CAST(@lnEntero / 10 AS INT)          
            SELECT @lnDecenas = @lnEntero % 10      
            SELECT @lnEntero = CAST(@lnEntero / 10 AS INT)          
            SELECT @lnCentenas = @lnEntero % 10            
            SELECT @lnEntero = CAST(@lnEntero / 10 AS INT)
            -- Analizo las unidades        
            SELECT @lcCadena = CASE /* UNIDADES */
                                    WHEN @lnUnidades = 1 AND @lnTerna = 1 THEN
                                         'UNO ' + @lcCadena
                                    WHEN @lnUnidades = 1 AND @lnTerna <> 1 THEN
                                         'UN ' + @lcCadena
                                    WHEN @lnUnidades = 2 THEN 'DOS ' + @lcCadena
                                    WHEN @lnUnidades = 3 THEN 'TRES ' + @lcCadena
                                    WHEN @lnUnidades = 4 THEN 'CUATRO ' + @lcCadena
                                    WHEN @lnUnidades = 5 THEN 'CINCO ' + @lcCadena
                                    WHEN @lnUnidades = 6 THEN 'SEIS ' + @lcCadena
                                    WHEN @lnUnidades = 7 THEN 'SIETE ' + @lcCadena
                                    WHEN @lnUnidades = 8 THEN 'OCHO ' + @lcCadena
                                    WHEN @lnUnidades = 9 THEN 'NUEVE ' + @lcCadena
                                    ELSE @lcCadena
                               END /* UNIDADES */
            -- Analizo las decenas
            SELECT @lcCadena = CASE /* DECENAS */
                                    WHEN @lnDecenas = 1 THEN CASE @lnUnidades
                                                                  WHEN 0 THEN
                                                                       'DIEZ '
                                                                  WHEN 1 THEN
                                                                       'ONCE '
                                                                  WHEN 2 THEN
                                                                       'DOCE '
                                                                  WHEN 3 THEN
                                                                       'TRECE '
                                                                  WHEN 4 THEN
                                                                       'CATORCE '
                                                                  WHEN 5 THEN
                                                                       'QUINCE '
                                                                  ELSE 'DIECI' + @lcCadena
                                                             END
                                    WHEN @lnDecenas = 2 AND @lnUnidades = 0 THEN
                                         'VEINTE ' + @lcCadena
                                    WHEN @lnDecenas = 2 AND @lnUnidades <> 0 THEN
                                         'VEINTI' + @lcCadena
                                    WHEN @lnDecenas = 3 AND @lnUnidades = 0 THEN
                                         'TREINTA ' + @lcCadena
                                    WHEN @lnDecenas = 3 AND @lnUnidades <> 0 THEN
                                         'TREINTA Y ' + @lcCadena
                                    WHEN @lnDecenas = 4 AND @lnUnidades = 0 THEN
                                         'CUARENTA ' + @lcCadena
                                    WHEN @lnDecenas = 4 AND @lnUnidades <> 0 THEN
                                         'CUARENTA Y ' + @lcCadena
                                    WHEN @lnDecenas = 5 AND @lnUnidades = 0 THEN
                                         'CINCUENTA ' + @lcCadena
                                    WHEN @lnDecenas = 5 AND @lnUnidades <> 0 THEN
                                         'CINCUENTA Y ' + @lcCadena
                                    WHEN @lnDecenas = 6 AND @lnUnidades = 0 THEN
                                         'SESENTA ' + @lcCadena
                                    WHEN @lnDecenas = 6 AND @lnUnidades <> 0 THEN
                                         'SESENTA Y ' + @lcCadena
                                    WHEN @lnDecenas = 7 AND @lnUnidades = 0 THEN
                                         'SETENTA ' + @lcCadena
                                    WHEN @lnDecenas = 7 AND @lnUnidades <> 0 THEN
                                         'SETENTA Y ' + @lcCadena
                                    WHEN @lnDecenas = 8 AND @lnUnidades = 0 THEN
                                         'OCHENTA ' + @lcCadena
                                    WHEN @lnDecenas = 8 AND @lnUnidades <> 0 THEN
                                         'OCHENTA Y ' + @lcCadena
                                    WHEN @lnDecenas = 9 AND @lnUnidades = 0 THEN
                                         'NOVENTA ' + @lcCadena
                                    WHEN @lnDecenas = 9 AND @lnUnidades <> 0 THEN
                                         'NOVENTA Y ' + @lcCadena
                                    ELSE @lcCadena
                               END /* DECENAS */
            -- Analizo las centenas        
            SELECT @lcCadena = CASE /* CENTENAS */
                                    WHEN @lnCentenas = 1 AND @lnUnidades = 0 AND @lnDecenas
                                         = 0 THEN 'CIEN ' +
                                         
                                         @lcCadena
                                    WHEN @lnCentenas = 1 AND NOT(@lnUnidades = 0 AND @lnDecenas = 0) THEN
                                         'CIENTO ' + @lcCadena
                                    WHEN @lnCentenas = 2 THEN 'DOSCIENTOS ' + @lcCadena
                                    WHEN @lnCentenas = 3 THEN 'TRESCIENTOS ' + @lcCadena
                                    WHEN @lnCentenas = 4 THEN 'CUATROCIENTOS ' + @lcCadena
                                    WHEN @lnCentenas = 5 THEN 'QUINIENTOS ' + @lcCadena
                                    WHEN @lnCentenas = 6 THEN 'SEISCIENTOS ' + @lcCadena
                                    WHEN @lnCentenas = 7 THEN 'SETECIENTOS ' + @lcCadena
                                    WHEN @lnCentenas = 8 THEN 'OCHOCIENTOS ' + @lcCadena
                                    WHEN @lnCentenas = 9 THEN 'NOVECIENTOS ' + @lcCadena
                                    ELSE @lcCadena
                               END /* CENTENAS */
            -- Analizo la terna
           
            SELECT @lcCadena = CASE /* TERNA */
                                    WHEN @lnTerna = 1 THEN @lcCadena
                                    WHEN @lnTerna = 2 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN
                                         @lcCadena + ' MIL '
                                    WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0)
                                         AND
                                         
                                         @lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas
                                         = 0 THEN @lcCadena + 'MILLON '
                                    WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0)
                                         AND
                                         NOT (@lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas = 0) THEN
                                         @lcCadena
                                         + ' MILLONES '
                                    WHEN @lnTerna = 4 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN
                                         @lcCadena + ' MIL MILLONES '
                                    ELSE ''
                               END /* TERNA */
            -- Armo el retorno terna a terna        
            SELECT @lcRetorno = @lcCadena + @lcRetorno      
            SELECT @lnTerna = @lnTerna + 1
        END /* WHILE */        
        IF @lnTerna = 1
            SELECT @lcRetorno = 'CERO'
       
        SELECT @resultado = RTRIM(@lcRetorno) + ' CON ' + LTRIM(STR(@lnFraccion, 2))
               + '/100 ' + @Moneda
       
        RETURN @resultado
 END
 GO
 
 -- Para ejecutarlo solo nos bastara con llamar a la función y pasarle los 2 parámetros mencionados.
 SELECT [dbo].fn_ConvertirNumeroLetra(125.50, 'Nuevos Soles')
 -- Esto nos dará como resultado lo siguiente.
 -- CIENTO VEINTICINCO CON 50/100 Nuevos Soles
 

2014/05/04

SQL SERVER - Envía las copias de seguridad a una carpeta de red, servidor FTP, Dropbox, Google Drive o Amazon S3

Déjenme decirles acerca de una de las herramientas más útiles de SQL que cada DBA debe utilizar - es SQLBackupAndFTP . He estado utilizando esta herramienta desde el año 2009 - y que es el primer programa que se instala en el servidor SQL. Descargue una versión gratuita, la configuración de 1 minuto y las copias de seguridad diarias están a salvo en la nube. 
En resumen, SQLBackupAndFTP
  • Crea la base de datos SQL Server y archivo de copias de seguridad en la fecha prevista
  • Comprime y cifra las copias de seguridad
  • Envía copias de seguridad a una carpeta de red, servidor FTP, Dropbox, Google Drive o Amazon S3
  • Envía notificaciones por correo electrónico sobre el éxito o el fracaso del trabajo
SQLBackupAndFTP viene en versiones gratis y pagados (desde $ 29) - Véase la comparación de versiones . La versión gratuita es totalmente funcional para las copias de seguridad ad hoc ilimitadas o para copias de seguridad programadas de hasta dos bases de datos - será suficiente para muchos clientes pequeños.
Lo que más me ha impresionado desde el principio - es que he entendido cómo funciona y era capaz de configurar el trabajo de una sola forma (ver Imagen 1 - forma principal arriba)
  1. Conectarse a su servidor SQL y seleccione las bases de datos para hacer copia de seguridad
  2. Haga clic en "Añadir destino de copia de seguridad" para configurar las copias de seguridad donde deben ir a (la red, servidor FTP, Dropbox, Google Drive o Amazon S3)
  3. Ingrese su correo electrónico para recibir confirmaciones por correo electrónico
  4. Establece la hora para comenzar backups completos diarios (o vaya a Configuración si necesita copias de seguridad diferenciales o del registro de transacciones en un horario flexible)
  5. Pulse el botón "Ejecutar ahora" para poner a prueba
Se puede llegar a este formulario si hace clic en los botones "Configuración" en la sección "Programación". Seleccione qué tipos de copias de seguridad y la frecuencia con que desea ejecutar de ellas y ver las copias de seguridad programadas en la lista de "plan de respaldo estimado"

El tutorial detallado está disponible en el sitio web del desarrollador.
Junto con la configuración SQLBackupAndFTP le da la opción de instalar "One-Click SQL Restore" (se puede instalar autónomo también) - una herramienta básica para la restauración de las copias de seguridad simplemente completa.
Sin embargo básico, puede arrastrar y colocar en él el archivo zip creado por SQLBackupAndFTP, se baja la cremallera del archivo BAK, si es necesario, se conecta con el servidor SQL en el inicio, selecciona la base de datos a la derecha, es lo suficientemente inteligente como para reiniciar el servidor para soltar las conexiones abiertas en caso de necesidad - muy útil para desarrolladores que necesitan para restaurar las bases de datos a menudo.
Usted puede preguntar por qué es esta herramienta es mejor que las tareas de mantenimiento disponibles en SQL Server? Mientras que las tareas de mantenimiento son fáciles de configurar, SQLBackupAndFTP es todavía muy fácil e integra soluciones para la compresión, cifrado, FTP, almacenamiento en la nube y el correo electrónico que lo hacen superior a las tareas de mantenimiento en todos los aspectos.
En una cara de la moneda SQLBackupAndFTP no es la herramienta más lujoso para gestionar copias de seguridad o consultar su salud. Sólo funciona con fiabilidad en las instancias locales de SQL Server. En otras palabras, tiene que ser instalado en el servidor de SQL en sí. Para los servidores remotos que utiliza secuencias de comandos que es menos fiable. Esta limitación es en realidad inherente a servidor SQL como mandato BACKUP DATABASE crea la copia de seguridad no en el cliente, pero en el propio servidor.
Esta herramienta es compatible con casi todas las versiones conocidas de SQL Server. Se trabaja con SQL Server 2008 (todas las versiones) y muchas de las versiones anteriores. Es especialmente útil para SQL Server Express 2005 y SQL Server Express 2008, ya que carecen de herramientas integradas para la copia de seguridad.
Recomiendo esta herramienta a todos los administradores de bases. Ellos deben absolutamente probar, ya que es gratis y hace exactamente lo que promete. Puede descargar una copia gratuita de la herramienta desde aquí.
Referencia:  Pinal Dave ( http://blog.SQLAuthority.com )

2014/04/07

Mejores Prácticas para ser un DBA SQL Server

Navegando por la red me encontré este excelente articulo que resume en 4 fases  los puntos críticos para ser un buen DBA, no dejen de leerlo, excelente articulo.
Fase 1.- Día a día

1.  Compruebe los registros de eventos del S.O. y los registros de SQL Server para detectar eventos inusuales.
2.  Verifique que todos los trabajos programados se han ejecutado correctamente.
3.  Confirme que las copias de seguridad se han hecho y guardado con éxito a un lugar seguro.
4.  Monitoree el espacio en disco para asegurarse de que sus servidores de SQL no se quedarán sin espacio en disco. Para un mejor rendimiento, todos los discos deben tener 15% o más de espacio libre.
5.  A lo largo del día, haga un seguimiento periódico de rendimiento utilizando Monitor de sistema y de perfiles / Traza de SQL.
6.  Monitorear regularmente e identificar problemas de bloqueo.
7.  Mantenga un registro de los cambios que realice a los servidores, incluyendo la documentación de los problemas de rendimiento a identificar y corregir.
8.  Crear alertas de SQL Server para que le avise de posibles problemas, y las envíe por mail. Tomar las medidas necesarias.
9.  Regularmente restaure copias de seguridad en un servidor de prueba para verificar que realmente los puede restaurar. No es necesario para restaurar todas las copias de seguridad todos los días, pero debiera hacerlo a menudo para asegurarse de que usted tiene buenas copias de seguridad.
10.  Tómese su tiempo para aprender algo nuevo como un DBA para promover su desarrollo profesional.

Fase 2.- Instalación

1. Siempre documente las instalaciones de modo completo, aun cuando parezca redundante, esto hará que las instancias de SQL Server se pueden reproducir fácilmente en caso de emergencia.
2. Si es posible, instalar y configurar todas las instancias de SQL Server de una manera consistente, de la misma forma, basándose en las normas pre-acordadas de su organización.
3. No instale los servicios de SQL Server que no se utilizan, como Microsoft indexación de texto completo, Reporting Services o Analysis Services.
4. Para obtener el mejor rendimiento de SQL Server, detenga todos los servicios del sistema operativo que no son necesarios.
5. Para un óptimo rendimiento de SQL Server, no ejecutar al SQL Server junto con ninguna otra aplicación. 6. Para obtener el mejor rendimiento I / O, busque los archivos de base de datos (. mdf) y archivos de registro (. ldf) en discos separados para aislar a los patrones de acceso a disco.
7. Si tempdb se utiliza en gran medida, póngalo en un disco aparte.
8. No instale SQL Server en un controlador de dominio.
9. Asegúrese de que SQL Server se instala en una partición NTFS.
10. No utilice NTFS con cifrado de archivos de datos (EFS) y ni compresión de datos sobre el disco de la base de datos de SQL Server y los archivos de registro.

Fase 3.- Actualizar

1. Ejecute el Upgrade Advisor de SQL Server antes de actualizar. Haga los cambios necesarios antes de realizar la actualización.
2. Realizar una actualización de prueba antes de actualizar los servidores de producción. Y no se olvide de probar las aplicaciones con la nueva versión también.
3. Antes de actualizar, asegúrese de tener un plan para revertir los cambios en caso que la actualización sea problemática.
4. No actualizar clústeres de SQL Server en su lugar. En cambio, a reconstruirlos en un nuevo hardware.
5. Si actualiza desde una versión anterior de SQL Server, debe actualizar todas las estadísticas en todas las bases de datos. Esto se debe a que las estadísticas no se actualizan automáticamente durante el proceso de actualización.

Fase 4.- Seguridad

1. Asegure la seguridad física de cada Servidor SQL, previniendo que cualquier usuario no autorizado pueda acceder físicamente a sus servidores.
2. Instalar solamente las mínimas y necesarias nettwork libraries y network protocols en sus instancias SQL
3. Minimize el número de usuarios sysadmins con acceso a SQL Server.
4. Como DBA, lóguese como sysadmin solo cuando realmente lo necesite. Cree cuentas específicas para DBAs para que puedan acceder a SQL Server cuando no necesiten privilegios sysadmin.
5. Asigne a la cuenta “sa” una password realmente compleja y no la use nunca para loguearse a SQL Server. En vez de eso use una cuenta Windows Authentication para acceder SQL Server como sysadmin.
6. Dele a los usuarios los mínimos permisos necesarios que le permitan a ellos realizar su trabajo.
7. De ser posible, use stored procedures o views para el acceso a los datos en vez de dejarlos acceder directamente a las tablas.
8. De ser posible, use Windows Authentication logins en vez de SQL Server logins.
9. Use strong passwords (combinación de mayúsculas, minúsculas, números y caracteres especiales) para todos los SQL Server login.
10. No le asigne permisos al rol de base de datos “public”
11. Remueve Logins IDs que ya no necesitan acceder a SQL Server apenas los detecte.
12. Deshabilite el usuario “guest” en cada base de datos usando REVOKE CONNECT FROM GUEST.
13. No use “cross database ownership chaining” si no es realmente necesario.
14. Nunca habilite permisos a xp_cmdshell a los usuarios que no son sysadmin.
15. Eliminar las bases de ejemplo (adventureworks, pubs, northwind) de todas las instancias de producción.
16. Usar Windows Global Groups, o SQL Server Roles para manejar grupos de usuarios con similares permisos.
17. No debería crear ni permitir crear network shares en servidores SQL Server.
18. Configurar login auditing, de esta manera se puede ver quienes intentaron loguearse y los intentos fallidos de login.
19. No use jamás la cuenta sa ni login ids que sean sysadmin como cuentas de acceso desde aplicaciones.
20. Asegúrese que sus servidores están detrás de un firewall y no están expuestos directamente a internet.
21. En SQL Server 2005 y previos, remover el grupo de BUILTIN/Administrators para evitar que los administradores locales del servidor puedan acceder a SQL Server. En SQL Server 2008, el grupo BUILTIN/Administrators group no existe en forma predeterminada.
22. Ejecute cada servicio SQL Server bajo una cuenta de dominio diferente.
23. Dele a las cuentas asignadas a los servicios SQL Server los mínimos permisos que le permitan al mismo ejecutarse de la manera correcta. En la mayoría de los casos los permisos de un administrador local no son necesarios y menos aún los permisos de un administrador de dominio.
24. Cuando use queries distribuidas use linked servers en vez de remote servers. Remote servers están solo por backward compatibility.
25. No navegue internet desde una instancia de producción de SQL Server.
26. En vez de instalar antivirus/antispyware en un SQL Server, realice escaneos desde un servidor remoto y solo cuando la actividad del servidor SQL no sea tan alta.
27. Agregue los service packs, tanto de SQL Server com de sistema operativo apenas estén disponibles.
28. Considere la posibilidad de encriptar los backups con herramientas como Red Gate SQL Backup Pro u otras.
29. Solo habilite las trazas de “C2 auditing” o “Common Criteria compliance” cuando sea realmente necesario, porque sobrecargan el servidor si están habilitadas.
30. Considere seriamente ejecutar un SQL Server security scanner para detectar si hay huecos de seguridad en sus servidores, tanto a nivel sistema operativo como servidor de base de datos. http://searchsqlserver.techtarget.com/feature/SQL-Server-security-test-checklist
31. Considere habilitar SSL or IPSEC para las conexiones entre sql server y los clientes.
32. Si está utilizando SQL Server 2005/2008, habilite password policy checking.
33. Si está usando SQL Server 2008 en un entorno de alta seguridad, considere implementar TDE, Transparent Data Encryption para proteger los datos de su servidor.
34. Si utiliza SQL Server 2005, no use SQL Server Surface Area Configuration para desbloquear características que nunca se utilizan y que pueden traer solamente problemas de seguridad.
35. Si está usando SQL Server 2005/2008 y crea endpoints, solo habilite permisos grant CONNECT a los logins que realmente necesitan acceder esos endpoints. Explícitamente deniegue (deny) CONNECT permissions a los endpoints que no son necesarios para los usuarios.

(Traducido Articulo de Brad McGehee)

2014/01/01

Sobre mi

INFORMACION
Apellidos y Nombre       Calzada Gutierrez Edgar
Dirección                       Urb. Los Naranjos Mz. U3 Lte. 27 – Los Olivos
# Móvil                          +511 956 721 673
Email                             cgtedgar@gmail.com
Nacionalidad                 Peruano

INTRODUCCION
Profesional en computación e informática con más de cuatro años de experiencia laboral en puestos relacionados a las tecnologías de información (TIC’s) tales como administración de bases de datos, desarrollo de sistemas, soporte técnico, manejo de sistemas operativos (Windows, Linux) y seguridad informática.

EDUCACION
26/01/2014 – 04/05/2014
                CIBERTEC
                Curso: PHP 5.0 Application Developer

21/01/2012 – 25/02/2012
                Instituto Nacional de Investigación Forense (INIF)
                Curso: Informática Forense

06/02/2006 – 30/09/2009
                Instituto Superior Tecnológico IDAT
                Técnico en computación e informática 

EXPERIENCIA
14/12/2012 – Actualidad
                TURISMO CIVA S.A.C.
                Jr.  Sancho de Rivera Nº. 1184 Urb. Monserrate – Cercado de Lima
                Cargo: Programador de sistemas
                Función principal:
    -          Desarrollo y mantenimiento de sistemas para logística operativa y logística administrativa.

02/07/2012 – 31/10/2012
                ABF CORP
                Av. Luis Felipe Villarán Nº. 395 – San Isidro        
    Cargo: Programador
    Función principal:
    -          Desarrollo y mantenimiento de los módulos de automatización de la impresión de recetas, ingresos de órdenes de compra y transferencia del centro de distribución.
    -          Creación de campos de usuario en SAP.

24/04/2012 – 30/06/2012
                ENLACE CORREOS S.A.
                Av. Paseo de la Republica Nº. 4979 – Surquillo
                Cargo: Programador
                Función principal:
    -          Desarrollo y mantenimiento del sistema SysProsegur, el cual incluye varios módulos desarrollados en N capas con C# y JQuery.
    -          Administración de la base de datos en Oracle PL/SQL.

25/03/2010 – 31/01/2012
                COLEGIO DE ECONOMISTAS DE LIMA
                Av. Javier Prado Oeste Nº. 830 – San Isidro
                Cargo: Programador y help desk
                Función principal:
    -          Administración de la base de datos y del sistema de pagos.
    -          Mantenimiento preventivo y correctivo a los equipos de cómputo.
   -          Soporte al personal administrativo y agremiado.

06/07/2011 – 06/10/2011
                ASOCIACION BENEFICA PRISMA
                Calle Carlos Gonzales Nº. 251 Urb. Maranga – San Miguel
                Cargo: Voluntariado (medio tiempo)
                Función principal:
    -          Creación de una nueva página web y un campus virtual.
    -          Creación del manual de usuario del campus virtual.

15/08/2009 – 06/03/2010
                TRADER CORP E.I.R.L.
                Av. Larco Nº. 345 – Miraflores
                Cargo: Programador y help desk
                Función principal:
    -          Análisis y programación de sistemas.
    -          Mantenimiento preventivo y correctivo a los equipos de cómputo, soporte técnico.
    -          Desarrollo de páginas web para los clientes de la empresa.

20/10/2008 – 05/12/2008
                COLEGIO AVANTE
                Av. Las Palmeras Nº. 5601 – Los Olivos
                Cargo: Encargado de sistemas
                Función principal:
    -           Desarrollo y mantenimiento de los sistemas de matrículas, pagos, asistencias.
    -          Mantenimiento preventivo y correctivo de los equipos de cómputo.

CONOCIMIENTOS
Sistemas operativos     
                Windows (xp, 7, 8)
                Linux (Centos, Ubuntu)
    Windows Server (2003, 2008, 2012)
               
Bases de datos
                Microsoft SQL Server (2008R2, 2012, 2014)
                Oracle PL/SQL
                MySQL
    PostgreSQL

Programación
                Microsoft Visual Studio (2010, 2012, 2013)
                               C Sharp (escritorio y web)
                               Visual Studio (escritorio y web)
                Adobe (CS5, CS6)
                               Dreamweaver
                               Fireworks
                               Flash
                Php
                               CodeIgnater
                               Laravel
                               Zend Framework

                NetBeans (java)
                               Escritorio y web

Otros
Dev Express, Visual Source Safe, JQuery, Ajax, BDDesigner, Erwin DataModeler,
Rational Rose, Xampp, Wamp, redes, IBM AS/400

INTERESES
Profesional
                Innovaciones tecnológicas
                Desarrollo de software
                Metodologías de programación
                Administración de bases de datos
                Cultura digital
                Hacking

Ocio
                Deporte
                Viajar
                Música
                Ciclismo