Welcome to 3Dev Blogs Sign in | Join | Help

mctsROAPMAP-sqlserver2008He tenido el gusto de participar en la primera sesión del SQL Server 2008 Certification Live Meeting donde me he enterado de algunas novedades con respecto al nuevo programa de certificación para SQL Server 2008. Ahora la certificaciones para SQL Server serán mucho más especificas. Para SQL Server 2005, si es que deseamos certificarnos como MCTS SQL Server 2005 tenemos que tomar el examen 70-431 donde se evaluan temas relacionados tanto a tareas del DBA como tareas del DBD (Database Developer), es decir, la cosa hasta aquí está combinada. Lo que se hará para las certificaciones MCTS para SQL Server 2008 es devidirse los temarios (incluirse algunos más) y evaluarse cada uno de ellos a más profundidad por separado.

En consecuencia, aparecerán dos nuevas certificaciones MCTS, estas son MCTS SQL Server 2008, Implementation and Maintenance (que requerirá aprobar el examen 70-432) y MCTS SQL Server 2008, Database Development (que requerirá aprobar el examen 70-433). Así que para SQL Server 2008 tendremos 3 certificaciones  MCTS contando también el MCTS para Inteligencia de Negocios. Lo que no me ha quedado claro, es que si estas nuevas certificaciones MCTS servirán como prerequisitos para obtener los respectivos MCITP. Bien, aunque algo me dice que será así, nos tocará esperar a ver que decide Microsoft. A Nivel de las certificaciones MCITP no se han aumentado nada, todo sigue igual.

Otra novedad es que no habrá camino de hacer un upgrade de la certificación MCDBA (SQL Server 2000) directamente a MCITP Database Administrator (SQL Server 2008), se recomienda tomar los exámenes para el MCTIP Database Administrator (SQL Server 2005), y luego por esta vía, actualizar a SQL Server 2008. Algo más, mencionaron también que la certificación MCDBA expirará a partir de Marzo 2009, por eso, Microsoft no recomienda esta certificación, e invita a certificarse para versiones a partir de SQL Server 2005.

Aún tengo las esperanzas que incluyan alguna certificación top que englobe las demás certificaciones de todos los niveles. En fin, .... a esperar.

Post Cruzado de Geeks.ms

La idea es aportar con este feedback para el nuevo programa de certificación de SQL Server 2008, y versiones posteriores, o si se quiere podria hasta incluirse dentro del programa existente para SQL Server 2005. Este feedback podria aplicarse para los demás productos Microsoft. En fin, sólo es un feedback, tómese como tal.

Me gustaría escucharlos, saber sus opiniones al respecto, ... seguro que tendrán alguna mejor idea que la que planteo aquí, por eso me gustaria conocer sus feedbacks de cada uno de ustedes. Vamos, me gustan las mentes inquietas!...

Deje su feedback aqui: http://geeks.ms/blogs/ozonicco/archive/2008/02/03/68733.aspx 

Saludos,

http://geeks.ms/blogs/ozonicco/PercyReyes_TechNet2.jpg
Hace tres semanas tuve el agrado de recibir un email de la gente de Microsoft TechNet Newsletter donde me invitaban para conceder una entrevista sobre mi trabajo con la comunidad SQL Server Perú durante estos ultimos años. Desde luego me sentí muy halagado por esta invitación, y no dudé en responder las preguntas que me hicieron llegar.

Hoy día, mi amigo Elías Mereb, me avisó que dicha entrevista ya había sido publicada, y vaya sorpresa!!!, es cierto. Nuevamente agradezco a toda la gente que nos ha venido apoyando siempre para sacar adelante la comunidad, gracias de verdad. 

Aqui dejó la entrevista por si deseas echarle un vistazo:
http://www.microsoft.com/latam/technet/articulos/tn/2008/ene08-16.mspx  

Post Cruzado Geeks.ms

PercyReyes,

PIVOT es uno de los nuevos operadores incluídos en SQL Server 2005 que podemos usar en la cláusula FROM para rotar filas en columnas y conseguir informes de tabla cruzada en un formato tabular, más presentables, claramente resumidos y descriptivos.  En un post anterior tratamos un ejemplo acerca del uso de PIVOT. Bien, la forma cómo se usó PIVOT en dicho ejemplo viene a ser su implementación estática, asi es, vimos cómo implementar PIVOT estático, además se dejó algunos recursos para familiarizarse con el tema. Por ejemplo, usemos la base de datos AdventureWorks y analicemos un poquito el resultado del siguiente query que más adelante pivotearemos:

SELECT CustomerID,YEAR(DueDate) [Year], TotalDue 
FROM Sales.SalesOrderHeader
ORDER BY CustomerID

En los resultados podemos apreciar que cada cliente hizo muchas ventas por año, entre los años 2001 y 2004.

CustomerID    Year        TotalDue
-----------      ----------- ---------------------
1                   2001        14603,7393
1                   2001        26128,8674
1                   2002        37643,1378
1                   2002        34722,9906
2                   2002        10184,0774
2                   2002        5469,5941
2                   2003        1739,4078
2                   2003        1935,5166
2                   2003        3905,2547
2                   2003        4537,8484
2                   2004        4053,9506
2                   2004        908,3199
3                   2004        17051,8292
3                   2004        34873,5257
...                 .....         .......(Continúa)

En fin, el uso de PIVOT estático tiene la clara desventaja de limitar en número de columnas desglosadas para mostrar información de la columna pivoteada, por ejemplo, de acuerdo al resultado del query anterior, si queremos pivotear la columna TotalDue, y desglosar la información en 4 columnas, es decir, pivotear TotatlDue para los años del 2001 al 2004, se tendría que especificar cada uno de esos valores dentro de la consulta, cuestión que será sencillo y fácil dado que sólo tendremos que indicar 4 valores.  

SELECT CustomerID, [2001] AS '2001', [2002] AS '2002', [2003] AS '2003', [2004]  AS '2004'
FROM (
      SELECT CustomerID,YEAR(DueDate) [Year], TotalDue FROM Sales.SalesOrderHeader
     ) pvt
PIVOT (SUM(TotalDue) FOR [Year] IN ([2001],[2002],[2003],[2004])) AS Child
ORDER BY CustomerID

Hasta aquí todo parece estar bien, y claro que es así. He aquí los resultados:

CustomerID   2001                       2002                  2003                    2004
-----------      --------------------- --------------------- --------------------- ---------------------
1                 40732,6067            72366,1284          NULL                    NULL
2                 NULL                     15653,6715          12118,0275           4962,2705
3                 39752,8421            168393,7021        219434,4265          51925,3549
4                 NULL                     263025,3113        373484,299           143525,6018
5                 NULL                     33370,6901          60206,9999           20641,1106
6                 NULL                     NULL                   668,4861               2979,3473
7                 NULL                     6651,036             3718,7804              NULL
8                 NULL                     NULL                  19439,2466            10900,0347
9                 NULL                     320,6283             11401,5975            5282,8652
10               NULL                     96701,7401          291472,2172          204525,9634
11              40350,4474             24300,4254          NULL                     NULL
12              NULL                      117419,735          191505,7911          29091,7653
14              NULL                      NULL                   7348,0162              1446,6848
...             ........                    ...........             .............          ......(Continúa)

Sin embargo,  hay un problema, ¿Sabes cual es el problema? -> la implementación de PIVOT estáticos no es escalable, ya que los valores de la columna que se desglosa para llenar información de la columna pivoteada puede aumentar, es decir, conforme vaya pasando el tiempo la ventas se seguirán llevando acabo teniendo años superiores al 2004, como 2005, 2006,..., y si quisiera (pasados 2 años por ejemplo) pivotear todas las ventas para todos los años hasta la fecha tendría que modificar el query, modificar e indicar los años adicionales a desglosarse.

Otro desventaja sería por ejemplo, ¿Qué pasa si tengo que pivotear un columna que tiene 30 valores diferentes?, pues usando PIVOT estático tendría que estar indicando manualmente cada uno de los 30 valores dentro del query, cosa que se torna fastidiosa, aburrida, y sobre todo trabajosa, y esto es poco, pueden ser más valores, por ejemplo 100, me muero!.

Todos estos líos se solucionan mediante PIVOT dinámico, que no viene a ser más que una implementación algoritmica para capturar dinámicamente los valores de la columna a desglosare para la columna pivoteada e insertarlo dentro de la cadena final del query a ejecutarse usando sp_executesql (SQl Dinámico). Dejo el query a su merced!, podeis masticarlo a su gusto!.

DECLARE @TableYears AS TABLE([Year] INT NOT NULL)
DECLARE @Year INT, @YearsPVT NVARCHAR(MAX) 
INSERT INTO @TableYears  SELECT DISTINCT YEAR(DueDate) AS [Year] FROM  Sales.SalesOrderHeader 
SET @Year = (SELECT MIN([Year]) FROM @TableYears)
SET @YearsPVT=N''
WHILE @Year IS NOT NULL
BEGIN
  SET @YearsPVT = @YearsPVT + N',['+ CONVERT(NVARCHAR(10),@Year) + N']'
  SET @Year = (SELECT MIN([Year]) FROM @TableYears WHERE [Year]>@Year)
END
    
SET @YearsPVT = SUBSTRING(@YearsPVT,2,LEN(@YearsPVT))
PRINT @YearsPVT
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = N'SELECT *
            FROM ( 
                SELECT CustomerID,YEAR(DueDate) [Year], TotalDue FROM Sales.SalesOrderHeader
                ) pvt
            PIVOT (SUM(TotalDue) FOR [Year] IN (' + @YearsPVT + ')) AS Child
            ORDER by CustomerID'
 
EXEC sp_executesql @SQL

Los resultados del query con PIVOT dinámico serán los mismos que los conseguidos usando PIVOT estático :D. Funciona!, sí señor! :). Ahora vayamos con otro ejemplo, algo parecido, pero ahora será usando la base de datos Northwind, pivoteamos la columna Monto y lo desglosaremos de acuerdo al CategoryName:

--ESTO ES LO QUE PIVOTEAMOS!
SELECT P.ProductID, C.CategoryName, OD.UnitPrice * OD.Quantity AS Monto  
FROM Products P 
    INNER JOIN dbo.[Order Details] OD
ON P.ProductID=OD.ProductID
   INNER JOIN Categories C
ON C.CategoryID=P.CategoryID
GO

Estos serán los resultados:

ProductID   CategoryName         Monto
-----------    ------------------         ------------------
11              Dairy Products        168,00
42              Grains/Cereals        98,00
72              Dairy Products        174,00
14              Produce                  167,40
51              Produce                  1696,00
41              Seafood                  77,00
51              Produce                  1484,00
65              Condiments            252,00
22              Grains/Cereals        100,80
57              Grains/Cereals        234,00
65              Condiments            336,00
20              Confections            2592,00
33              Dairy Products        50,00
...              ................       .....(Continúa)

Pivoteando el resultado anterior, usando PIVOT "estático":

--PIVOTEO
SELECT ProductID, [Beverages], [Condiments], [Confections], [Dairy Products], 
       [Grains/Cereals], [Meat/Poultry],[Produce],[Seafood] 
FROM 
(
    SELECT P.ProductID, C.CategoryName, (OD.UnitPrice * OD.Quantity) AS Monto
    FROM Products P 
        INNER JOIN dbo.[Order Details] OD
            ON P.ProductID=OD.ProductID
        INNER JOIN Categories C
            on C.CategoryID=P.CategoryID
) PIV
PIVOT (SUM(Monto) FOR  CategoryName IN ([Beverages], [Condiments], [Confections], [Dairy Products], 
       [Grains/Cereals], [Meat/Poultry],[Produce],[Seafood])) AS Child
 

Seguro que ya hiciste un copy/paste, je je je, y si aún el nivel de compatibilidad de la base de datos Northwind es 80 o inferior de seguro te encontrarás con este error:

Msg 325, Level 15, State 1, Line 13
Incorrect syntax near 'PIVOT'. You may need to set the compatibility level of the current database to a higher value to enable this feature. See help for the stored procedure sp_dbcmptlevel.

El operador PIVOT sólo trabaja con base de datos cuyo nivel de compatibilidad mayor o igual a 90 (SQL Server 2005). Northwind es una base de datos creada con SQL Server 2000, y por lo tanto su nivel de compatibilidad es 80. Para solucionar este problema debemos obviamente cambiar dicho nivel de compatibilidad a 90.

EXEC dbo.sp_dbcmptlevel @dbname=N'Northwind', @new_cmptlevel=90

Ahora si, volvemos a ejecutar el query y tendremos (Muestro resultados parciales):

pivoteostatico

Lograremos lo mismo, esta vez usando PIVOT dinámico:

--pivot dinámico
DECLARE @CatPVT AS NVARCHAR(MAX), @Categorias AS varchar(20)
DECLARE @CatID INT 
SET @CatID=(SELECT MIN(CategoryID) FROM Categories)
SET @Categorias = ( SELECT CategoryName FROM Categories WHERE CategoryID = @CatID)
SET @CatPVT = N''
WHILE @Categorias IS NOT NULL
BEGIN
  SET @CatPVT = @CatPVT + N',['+ @Categorias +N']'
  SET @Categorias = (SELECT TOP(1) CategoryName 
                     FROM Categories WHERE CategoryID > @CatID 
                     ORDER BY CategoryID ASC)
  SET @CatID=(SELECT MIN(CategoryID) FROM Categories Where Categoryname=@Categorias)
END
print @CatPVT
SET @CatPVT = SUBSTRING(@CatPVT, 2, LEN(@CatPVT))
print 'ok'
print @CatPVT
 
DECLARE @sql AS nvarchar(MAX)
SET @sql = N'SELECT *  
            FROM (SELECT P.ProductID, C.CategoryName, (OD.UnitPrice * OD.Quantity) AS Monto
                  FROM Products P 
                    INNER JOIN dbo.[Order Details] OD
                        ON P.ProductID=OD.ProductID
                    INNER JOIN Categories C
                    ON C.CategoryID=P.CategoryID
            ) PIV
            PIVOT (SUM(Monto) FOR  CategoryName IN ('+ @CatPVT  + ')) AS Child'
 
EXEC sp_executesql @sql

No debo recordarles que dentro de la implementación de PIVOT dinámico podrían usarse tablas temporables, variables del tipo TABLE y/o  CTEs en lugar de emplearse subconsultas, en todo caso los resultados serán los mismos, sin embargo el rendimiento podría ser mejor, y la lógica se simplicaría bastante.  En fin, es bastante sencillo, y a ver si en otro post explico algo al respecto.

Saludos,

Ciertas veces, para llevar acabo algunas tareas administrativas, tenemos la necesidad de saber cuales son las tablas (u otros objetos: Vistas, UDFs, Stored Procedures) de las cuales depende determinada tabla, o cuales son las tablas (u otros objetos) que dependen de determinada tabla. Existen dos formas, la primera es dando click sobre una tabla cualquiera y luego click derecho para finalmente escoger "'View Dependencies'". En este post voy a explicar como llevar acabo esta tarea mediante T-SQL.

Existen dos vistas del sistema: sys.objects y sys.sysreferences, que podemos consultar para extraer dicha información haciendo una operación JOIN entre estas en base a la dos columnas claves: kfeyid y rkeyid.

  • fkeyid Id. de la tabla que hace referencia
  • rkeyid Id. de la tabla a la que se hace referencia

La vista sys.objects contiene información para cada objeto(excepto triggers DDL y DML) creada dentro de la base de datos definido dentro del esquema del usuario. Usando sys.sysreferences podemos acceder a la metadata de las definiciones de todas las restricciones FOREIGN KEY a las columnas involucradas en una base de datos definida también dentro del esquema del usuario.

Por ejemplo si deseamos ver las tablas dependientes sobre la tabla Products (DB Northwind):

   1: SELECT S.[name] AS 'Tablas Dependientes'
   2: FROM sys.objects S INNER JOIN sys.sysreferences R 
   3:   ON S.OBJECT_ID = R.rkeyid
   4: WHERE S.[type] = 'U' AND
   5:       R.fkeyid = OBJECT_ID('Products')

Si deseamos sabes cuales son las tablas, las cuales dependen de la tabla Products: 

   1: SELECT S.[name] AS 'Tablas que depende de Products'
   2: FROM sys.objects S INNER JOIN sys.sysreferences R 
   3:     ON S.object_id = R.fkeyid
   4: WHERE S.[type] = 'U' 
   5:      AND R.rkeyid = OBJECT_ID('Products')

Este código podriamos generalizarlo dentro de un stored procedure y haciéndolo totalmente dinámico no sólo para consultar información acerca de tablas sino de otros objetos como Vistas, SPs, UDF, etc. Cuestión que usted podrá hacerlo rápidamente ;). En fin, eso fue lo que queria aportar, espero sea de utilidad!,

Feliz Navidad para todos! :D.

Saludos,

Boost SQL Server Priority es una de las tantas opciones que podemos configurar en un servidor SQL Server para mejorar la performance del mismo. La opción Boost SQL Server Priority (Aumento de Prioridad) permite cambiar la prioridad de los procesos de Windows Server (Microsoft Windows 2000 ó Windows 2003) y de SQL Server.

Por defecto, Boost SQL Server Priority se encuentra ajustado en 0 lo cual hace que SQL Server se ejecute con una prioridad normal si es que estuviera ejecutándose en un equipo uniprocesador o un equipo simétrico de multiprocesador (SMP). Por otra parte, si establece Boost SQL Server Priority en 1, entonces el proceso de SQL Server se ejecutará con mayor prioridad. Esto puede mejorar el rendimiento de un servidor que está ejecutando sólamente instancias de SQL Server y no otras aplicaciones, es decir, se recomienda configurar este valor a 1 para servidores dedicados para SQL Server.

Esta opción Boost SQL Server Priority puede configurarse de dos maneras. La primera forma es mediante SQL Server Management Studio, para esto vea Cómo establecer la opción priority boost (SQL Server Management Studio).

priority boost

La segunda manera de ajustar este valor es mediante código T-SQL, y es lo que a continuación paso a demostrar. Lo que se debe saber hasta ahora es que Boost SQL Server Priority es una "opción avanzada" y para poder tener alcance a este nivel, el siguiente paso es Habilitar Opciones Avanzadas, ya que por defecto está deshabilitado.

sys.sp_configure 'show advanced options', 1

Ahora debemos correr la sentencia RECONFIGURE para confirmar o actualizar el cambio.

RECONFIGURE
GO

Hecho todo lo anterior, pasamos a configurar Boost SQL Server Priority:

EXEC sys.sp_configure N'priority boost', N'1'
GO

Confirmamos o guardamos cambios:

RECONFIGURE WITH OVERRIDE
GO

Tenga mucho cuidado y bastante criterio cuanto decida manipular esta opción. Si está ejecutando varias instancias de SQL Server en un equipo, y si activa Boost SQL Server Priority sólo para algunas instancias, entonces el desempeño del resto de instancia serán afectados negativamente. Sin embargo, si el sistema está dedicado a SQL Server y las tareas de lecura y escritura (Disk I/O) tienden a ser pesadas, entonces debería habilitar esta opción para obtener ganancias de rendimiento sustanciales. Algo importante en este tema es no configurar Boost SQL Server Priority para servidores agrupados que ejecutan SQL Server 7.0, SQL Server 2000 o SQL Server 2005; y de nuevo repito: no recomiendo el uso de esta opción en máquinas de un sólo procesador, salvo tenga configurado un servidor dedicado para SQL Server.

Saludos,

El día de hoy se llevó acabo el evento TechNet Summit 2007 Trujillo Edition con total normalidad en el auditorio de la Universidad Privada Alas Peruanas (Sucursal Trujillo).  Básicamente el evento consistió en 4 sesiones, dos de las cuales fueron relacionados a Windows Server 2008 (Expositor: Nelson Angeles), y las otras dos de SQL Server 2005: Seguridad y SQL Server 2008 (Más allá de lo relacional) fueron dadas por mi persona. Dejo algunas fotos del evento, y en esta primera parte estoy yo dando la charla de SQL Server 2005 : Seguridad - Revisión en Profundidad :D.

01-12-07_092401-12-07_092801-12-07_1004

Este evento fue realizado y organizado por las comunidades SQL Server Perú y CAM UAP Trujillo, y bueno, para serles sincero el evento estuvo interesante, no tan sólo por los temas hablados sino también porque los asistentes participaron bastante, pudo apreciarse al final que la gente se quedó contenta y conforme con las charlas dadas, y lo bueno es que se pudo dar a conocer nuevas características y funcionalidades próximas a ser liberadas tanto para Windows Server 2008 y SQL Server 2008.  (En las fotos aún sigo dando charla, y como también pueden apreciar a Nelson Angeles).

01-12-07_100801-12-07_120701-12-07_1205

Todo el material de este evento ya pueden descargarlo, más abajo dejo el link. Además les invito a bajar este WebCast acerca de SQL Server 2008 (Generalidades), que lo distruten!. Ah!, por cierto, también pueden bajar todo el material de todas las sesiones de TechNet Summit 2007 Central que se dió en Lima.

Descargar Presentaciones y Demos: Material_TechNetSummit2007_TrujilloEdition.

Ojalá que más adelante podamos seguir organizando más eventos en esta linda ciudad, y esperamos asistan todos!. Ya estaremos comunicándoles! :P.

Saludos,

Con la llegada de SQL Server 2008, algunos de los nuevos tipos de datos que ya son (o serán) novedades tenemos a los siguientes: HIERARCHY ID (para almacenar valores de nodos en un jerarquía), FILESTREAM (para almacenar data de tipo grande, documentos, imágenes), tipos para almacenar datos espaciales como GEOGRAPHY, GEOMETRY, así como los tipos de datos TIME (3 a 5 bytes de tamaño) y DATE (3bytes), DATETIME2 (6 a 8 bytes), DATETIMEOFFSET (8 a 10 bytes), entre otros más.

En este post vamos a hablar acerca de los tipos de datos para manejar fechas y tiempo, es decir, los 4 últimos arriba mencionados. Los otros tipos de datos serán motivos de otro post!.

DATETIME es un tipo de dato compuesto que almacena fecha y tiempo. La novedad es que en SQL Server 2008, el tipo de dato DATETIME se ha separado en dos: DATE y TIME, con esto no quiero decir que DATETIME se haya eliminado, este sigue siendo necesario para otros escenarios, pocos pero en fin. Esta noticia es muy buena ya que por ejemplo, siempre, casi siempre... sólo necesitabamos almacenar la fecha, más no el tiempo, y el único tipo de dato que podiamos usar era DATETIME, el cual "amablemente" guardaba algo más: el tiempo, aunque no lo necesitemos, pues no habia solución. DATETIME aparte de ser un tipo de dato cuyo tamaño es 8 bytes (realmente bastante), es pesado pudiendo originarse problemas de performance general.

Particularmente casi nunca uso DATETIME, prefieron usar con mucho criterio SMALLDATETIME, Porqué?, pues su tamaño es 4 bytes, y para lo que necesito está bien, puedo manejar fechas entre el rango de 1900 y 1979. Obviamente, SMALLDATETIME también almacena la hora, cosa que no se necesita en la mayoria de aplicaciones. De manera semejante sucedía cuando queriamos trabajar sólo con la hora, no había forma de separar la hora de la fecha. Ejemplo:

-- creando un tipo de datos DATE, y asignándole un valor 
DECLARE @FechaTiempo DATETIME
SET @FechaTiempo= GETDATE()
SELECT @FechaTiempo AS FechaTiempo
Resultado:

FechaTiempo
-----------------------
2007-11-03 16:25:53.653

(1 row(s) affected)

Con los tipos de datos DATE y TIME, este problema se soluciona. DATE para almacenar sólo fechas, y TIME para tiempo.

Para asignar valor a un tipo de dato DATETIME usábamos la función del sistema GETDATE(). GETDATE() devuelve un valor de tipo DATETIME. ¿Y cómo asignamos valor a estos nuevos tipos de datos DATE y TIME?, curiosamente la solución es usar GETDATE(). Asi es, pues fíjate que internamente el Database Engine de SQL Server 2008 al detectar que el valor devuelto por GETDATE() será asignado a un tipo DATE o TIME, este filtra sólo la fecha o sólo el tiempo. Veamos un ejemplo:

-- creando un tipo de datos TIEMPO, y asignándole un valor 
DECLARE @Tiempo TIME
SET @Tiempo= GETDATE()
SELECT @Tiempo AS Tiempo
 
-- creando un tipo de datos DATE, y asignándole un valor 
DECLARE @Fecha DATE
SET @Fecha= GETDATE()
SELECT @Fecha AS Fecha
Resultados:

Tiempo
----------------
16:26:22.2800000

(1 row(s) affected)

Fecha
----------
2007-11-03

(1 row(s) affected)

Otro de los tipos para manejar fecha y tiempo son DATETIME2 y DATETIMEOFFSET, a los cuales yo me refiero como extensiones del tipo DATETIME. DATETIME2 es un DATETIME con más precisión y un mayor rangos de años, y con DATETIMEOFFSET se tendrá la posibilidad de manejar fecha y tiempo relacionados a una zona horaria en particular. Cool! :D.

-- creando un tipo de datos DATETIME2, y asignándole un valor 
DECLARE @FechaTiempo2 DATETIME2
SET @FechaTiempo2= GETDATE()
SELECT @FechaTiempo2 AS FechaTiempo2
 
-- creando un tipo de datos DATETIMEOFFSET, y asignándole un valor 
DECLARE @FechaTiempoOFFSET DATETIMEOFFSET
SET @FechaTiempoOFFSET= GETDATE()
SELECT @FechaTiempoOFFSET AS FechaTiempoOFFSET

Resultados:

FechaTiempo2
---------------------------
2007-11-03 16:26:47.8270000

(1 row(s) affected)

FechaTiempoOFFSET
----------------------------------
2007-11-03 16:26:47.8270000 +00:00

(1 row(s) affected)

Finalmente puedo decir que la gente de SQL Server creo que está escuchando mis oraciones, hace tiempo que venía necesitando estos tipos de datos, rogando que existan tipos de datos separados para manejar fecha y tiempo.

Post Cruzado de Geeks.ms

Uno de los modos de transacciones que se conocen, aparte de las transacciones auto-commit y las explícitas, son las Transacciones Implícitas que son aquellas iniciadas por SQL Server en el caso de que no exista alguna transacción. Las transacciones implícitas no llegan a realizar un COMMIT o ROLLBACK automáticamente, siendo necesario finalizarlo explicitamente. Esto es útil cuando deseamos iniciar automáticamente las transacciones e ir administrando y evaluando la confirmación o cancelación de las mismas. Por defecto, SQL Server maneja las transacciones en modo auto-commit, es decir, en este modo SQL server inicia y termina automáticamente una transacción cuando esta no ha sido definida por el desarrollador.

En fin, una transacción implícita cuando no existen transacciones se inician con las siguientes sentencias: ALTER TABLE, CREATE, DROP, GRANT, REVOKE, OPEN, FECTH, INSERT, UPDATE, DELETE, SELECT, TRUNCATE TABLE. Para usar las transacciones implícitas debe ajustarse la conexión para que trabaje en este modo.

SET IMPLICIT_TRANSACTIONS ON;

Otra manera de ajustar a modo implícito, sería activar la opción ANSI_DEFAULTS, con esto el modo de transacción implícita también se activará. Así:

SET ANSI_DEFAULTS ON

Vamos a ejecutar el siguiente código y checkear si la transacción es iniciada.

CREATE TABLE [Customers](
 [CustomerID] [nchar](5) NOT NULL,
 [CompanyName] [nvarchar](40) NOT NULL,
 [ContactName] [nvarchar](30) NULL,
 [ContactTitle] [nvarchar](30) NULL,
 [Address] [nvarchar](60) NULL,
 [City] [nvarchar](15) NULL,
 [Region] [nvarchar](15) NULL,
 [PostalCode] [nvarchar](10) NULL,
 [Country] [nvarchar](15) NULL,
 [Phone] [nvarchar](24) NULL,
 [Fax] [nvarchar](24) NULL,
 CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED ([CustomerID])
)

Ahora se necesita evaluar si alguna transacción activa asociada a la conexión actual, para esto consultaremos el valor de @@TRANCOUNT.

SELECT @@TRANCOUNT AS [TranCount];

Vemos que el resultado indicará que hay una transacción iniciada. Bien, hasa ahora aún no hemos cerrado la transacción anterior, entonces el siguiente código se ejecutará dentro de dicha transacción.

INSERT INTO [Customers]
VALUES
(
 'APRPS',
 'HILARION-Abastos',
 'Percy Reyes',
 'Sales Representative',
 'Obere Str. 57',
 'Berlin',
 NULL,
 '12209',
 'Germany',
 '030-0074321',
 '030-0076545'
)

Ejecute el siguiente código para comprobar que el número de transacciones sigue siendo 1.

SELECT @@TRANCOUNT AS [TranCount];

Finalmente hacemos un ROLLBACK TRAN (ó un COMMIT TRAN), y pasamos a evaluar el valor de @@TRANCOUNT (como se a venido haciendo) para comprobar que el número de transacciones activas ahora es cero.

ROLLBACK TRAN
GO
SELECT @@TRANCOUNT AS [TranCount];

Entonces, como hemos hecho un ROLLBACK TRAN, no debe existir la tabla Customers que se pretendió crear al inicio. Para comprobarlo puede hacer un simple SELECT a la tabla, y SQL Server Engine le devolverá un error indicándole que no existe dicha tabla.

Por último, la volver a modo auto-commit, haga lo siguiente:

SET IMPLICIT_TRANSACTIONS OFF;
 

Cuando estemos trabajando con transacciones implícitas podría darse el caso de que en algún momento olvidemos de hacer el COMMIT TRAN correspondiente originando más adelante transacciones grandes, y posiblemente provocando bloqueos con otras conexiones, o teniedo ROLLBACKs indeseados debido a conexiones cerradas. Se recomienda no olvidar realizar el COMMIT TRAN o ROLLBACK TRAN cuando trabaje en este modo.

Post Cruzado de Geeks.ms

Post Cruzado de Geeks.ms

He tenido el gusto de recibir una invitación como expositor para el evento tecnológico organizado por la Comunidad Microsoft de SENCICO con motivo del aniversario de esta institución y que se llevará acabo el 23 del presente, en horas de la tarde, Local SENCICO Trujillo (Perú) -  Auditorio: Av. Carlos Monge 292 - Urb. Chimú.

El tema que tocaré será: Cómo asegurar la información en SQL Server 2005. En esta charla de 1:15 horas veremos cómo SQL Server 2005 incorpora mejoras significativas en el modelo de seguridad de la plataforma de bases de datos, con el objetivo de proporcionar más opciones a nivel de gestión y de seguridad tanto para los desarrolladores como a los administradores.

Además conoceremos varias características de seguridad configurables y de gran precisión, las cuales permiten a los administradores implementar una defensa optimizada para los riesgos de seguridad específicos de su entorno.

Espero verlos en el evento!.

Saludos cordiales!.

Post Cruzado de Geeks.ms

En todo este tiempo hemos venido realizando eventos y talleres gratuitos (más adelante cuento al respecto) en beneficio del público en general que está interesada en las tecnologías Microsoft SQL Server ya sea con fines académicos o como herramienta de trabajo. En fin, dimos el campanazo realizando el evento de lanzamiento de la comunidad en la Sala de Microsoft Perú (San Isidro, Lima), evento muy importante para nosotros debido a que empezábamos de esta manera a recorrer un fenomenal camino en el mundo de la comunidades Microsoft con la misión de ser una comunidad TOTALMENTE DIFERENTE E INNOVADORA al resto de comunidades del país y del planeta (esto suena un poco marciano pero es la verdad!).  A continuación paso a contarles algunos detalles, pero antes no te olvides de leer la misión, visión y objetivos de la comunidad :D. ´

Lee la historia completa aquí.

Saludos,

Percy Reyes,

Post Cruzado de Geeks.ms

He publicado cerca de 57 artículos acerca de temas de programación en Visual Basic .NET, C#, y SQL Server 200 – 2005, para sitios web como www.elguille.info , www.netveloper.comwww.mentores.net  , Microsoft MSDN Estudiantes, etc, durante el año 2005. Espero los sirva(mucha gente me pide información de GDI+, ps aquí están). Obviamente no está toda la lista porque no he podido encontrarlos (en serio), si alguien encuentra en la red, un artículo de mi autoría, y que no esté en esta lista, por favor, estaré agradecido de que posteen el link!.

 En esta entrada pueden ver toda la lista de artículos: Ver lista de artículos

Saludos, y un abrazo!,

Percy Reyes,

Post Cruzado de Geeks.ms

Eres un DBA de clase A? o eres uno de los tantos que muere en el intento?. Tener reglas de oro bajo las cuales trabajar o principios a los que se suele llamar Best Practices (Buenas Prácticas), podrian ayudarnos a lograrlo:

En pocas palabras: No se necesita ser un genio de la base de datos, sino un profesional con buenas prácticas de la misma.

Saludos,

Percy Reyes,

Post Cruzado de Geeks.ms

Excelente paper donde describe con ejemplos algunas debilidades y características del SQL (Structured Query Language).

Más detalles: En esta entrada 

Saludos!,

Percy Reyes,

Post Cruzado de Geeks.ms

Todos sabemos que se debe considerar, la seguridad de la base de datos como lo más importante en el proceso de implementar soluciones que interactuen con información sensible, es decir, si los sistemas de administración base de datos(RDBMS) en la que todos confiamos implícitamente, para llevar guardar nuestra data sensible, no son seguras, el impacto en nuestras vidas, y en general en nuestra sociedad podrían ser devastadores.  En este post vamos a tratar este tema de una perspectiva "inside" (profundo) y a la vez social.

Entonces, si podría decirse que existe dinero en cualquier parte de una red, esa parte es el servidor de la base de datos. Cuando decimos que las economías modernas son confiadas en las computadoras, lo que realmente significa es que las economías modernas son confiadas en los RDBMS (Relational Database Management System). Las bases de datos están detrás de los sistemas que afectan casi cada aspecto de nuestras vidas - nuestras cuentas bancarias, expedientes médicos, pensiones, expedientes de empleo, expedientes del teléfono, expedientes de impuesto, detalles del registro del coche, compras del supermercado - casi cada trozo de información útil en nuestras vidas se almacenan en un Sistema Moderno de Administración de Base de Datos Relacional (RDBMS), como SQL Server, Oracle, DB2, Informix, MySQL, SyBase ASE, PostgreSQL, etc.  En fin, estas son las razones por las cuales se debe considerar la seguridad de la base de datos como algo muy importante e imprescindible.

Bien se sabe que, existen muchos métodos para atacar bases de datos que son desconocidos por la gran parte de administradores de base de datos, profesionales de la seguridad, de los auditores de redes, y cuyas consecuencias se ponen de manifiesto al no saber defender  sus sistemas frente a múltiples variaciones de ataques, o no saber cómo otros los atacan. Por el contrario, que pasaría si supieran cómo podrían ser atacados por otros?, entonces se "defenderian" (y hasta ya no fuera necesario defenderse) debidamente porque entenderían completamente cómo otros podrían atacar sus bases de datos y redes, y esto lo usarían para implementar la seguridad en sus sistemas. Lastimosamente esto no suele suceder en la mayoría de casos, por  otro lado, curiosamente, lo que hace la mayoría de los vendedores de software(como Microsoft, Oracle, DB2, etc), una vez que algún gurú haya encontrado y reportado un bug de seguridad a la empresa, ellos al poco siempo suelen (como siempre, lo cual no es malo) entregarte un hotfix o parches para solucionar el problema. Qué pasaría si a estos gurús no se les pegara la gana de reportar dichos bugs?, entonces la empresa nunca liberaría hotfix o service packs(parches), he aquí nace la pregunta, ¿Cómo cuidas la seguridad de tu servidor de base de datos?. Creo que la mejor manera de defender tu servidor bases de datos y en general, toda tu red contra estos bugs desconocidos - es entendiendo detalladamente los mecanismos de generación de bugs y procurando crear configuraciones que frustren o eviten esto. Claro, esto es muchísimo mejor que simplemente parchar y esperar que nadie ataque tu sistema. No seas un DBA Holgazán!, muchos intrusos se aprovechan de esto!.

Casi siempre, asegurar una base de datos es una cuestión de aplicar los principios tried-and-tested (intentar y testear) que se han utilizado en la seguridad de redes y base de datos por décadas como forzar el privilegio mínimo que reduzca la superficie del ataque removiendo funcionalidad innecesaria (SQL Server 2005 ya es seguro por defecto), siendo estrictos en la autentificación y los controles de acceso, separando bloques de funcionalidad en áreas distintas, implementando enforce encryption, y así, muchos principios más. Entonces, la verdadera y única diferencia es que en una base de datos, todos estos mecanismos funcionan dentro del "pequeño" mundo de la misma.

Seguramente usted sea uno de aquellos que se pone a leer toda la documentación referente a seguridad y quedará contento con conocer una tremenda lista de medidas de seguridad que será su instrumento moderno para mantener segura su base de datos. Esto es bueno y propio de todo administrador responsable, sin embargo pueda que muchas veces, al leer dicha documentación usted se vea confundido con tanta teoría y complicándose la cuestión. Este asunto sería más fácil si usted, como buen DBA, entendiera (lo que más arriba ya mencioné) que casi todos los sistemas de administración de base de datos tienen cierta noción e implementación del manejo de privilegios, de controles de acceso, etc. y que éstos son implementados para luego competir por certificaciones de seguridad que prueban que han puesto apropiadamente estos mecanismos en ejecución. El problema es que aunque estas certificaciones son importantes, son solamente una parte de la historia, y de ninguna manera la parte más importante, ejemplo: los estudios de que RDBMS es más seguro?, algunos de estos dicen que SQL Server es más seguro que Oracle y viceversa. Que rollo!.

En fin, sea cual sea el RDBMS que esté usted usando, si éste viola los mecanismos, principios o standares de seguridad, entonces las evaluaciones y las acreditaciones no estarán trabajando como debería de ser. En todo caso, usted ya sabe que debe atacar el problema raíz frustrando la generación de bug mediante una configuración adecuada. Ahora, juraría, que la seguridad es lo último en lo que usted pone atención!. Claro, no olvidemos que las empresas de hoy en día no invierten en seguridad porque creen que nadie podria atacarlos, no toman consciencia al respecto. He aquí el gran problema más de caracter social que de...

Saludos,

Percy Reyes,

More Posts Next page »