SQL Server Snippets – Consultar roles y usuarios de una base de datos

El siguiente snippet sirve para obtener el listado de roles de una base de datos, con los usuarios que pertenecen a dicho rol:

SELECT
  p.name rol,
  p.principal_id id_rol,
  m.name usuario,
  m.principal_id id_usuario
FROM sys.database_role_members rm
  INNER JOIN sys.database_principals p
    ON rm.role_principal_id = p.principal_id
  INNER JOIN sys.database_principals m
    ON rm.member_principal_id = m.principal_id
ORDER BY p.name

La consulta devuelve un listado de roles y usuarios de la base de datos donde se ejecuta. Cabe mencionar que el listado contiene solamente los roles que están asignados a al menos un usuario (debido a los INNER JOIN), y que devuelve una fila por cada usuario y rol distinto. En este sentido, los usuarios que poseen más de un rol aparecerán repetidos en el listado. En otras palabras, si un usuario pertenece a N roles, entonces aparecerá repetido N veces en el listado, una vez por cada rol al que pertenece.

La consulta funciona (hasta donde yo he probado) en SQL Server 2005, 2008 y 2012.

Feliz día :)

Leer archivo de tabla de Visual Fox Pro (DBF) desde SQL Server

En mi trabajo, debido a que varios sistemas que se utilizan han sido desarrollados en Visual Fox, ha surgido la necesidad de leer los archivos de tabla (.DBF), desde SQL Server, para poder importar la información de los sistemas antiguos a los nuevos.

Existen varios driver para realizar esta tarea (dBase, ODBC, OleDB, etc.). En esta entrada me centraré en explicar como leer los archivos de tabla utilizando el driver de OleDB.

Primeramente, hay que instalar el driver OleDB en la computadora que alberga la instancia de SQL Server. El driver puede descargarse aquí. Si no me equivoco, no es necesario reiniciar la computadora ni los servicios de SQL Server luego de la instalación (puedo equivocarme, jejeje :) ).

En segundo lugar, hay que asegurarse que el usuario que ejecuta la instancia de SQL Server, tenga permiso de lectura sobre el archivo de tabla DBF. Si se utiliza autenticación de Windows, entonces el usuario de Windows debe tener permiso de lectura sobre el archivo.

Finalmente, para leer el archivo, basta con hacer la lectura utilizando la función T-SQL llamada OPENROWSET, de la siguiente manera:

SELECT *  FROM OPENROWSET(
'VFPOLEDB.1',
'C:\ruta\del\archivo';'';'',
'SELECT * FROM NOMBRE_ARCHIVO')

Por ejemplo, para leer el archivo C:\Users\UsuarioPruebas\Documents\TABLA.dbf, la sentencia sería la siguiente:

SELECT *  FROM OPENROWSET(
'VFPOLEDB.1',
'C:\Users\UsuarioPruebas\Documents';'';'',
'SELECT * FROM TABLA')

El comando ha sido probado en SQL Server 2005, pero creería que también funciona para versiones posteriores (2008, 2012).

Feliz día :)

Presentación de FluentViewModel

Hola nuevamente. No me pude esperar, así que decidí presentarles mi proyecto para ASP.NET MVC: FluentViewModel. Espero subirlo a GitHub en un futuro cercano (es decir, no muy lejano, jejeje…), para que esté disponible para todo el mundo, y quien lo quiera mejorar pueda hacerlo.

¿Qué es FluentViewModel?

FluentViewModel es una interfaz fluida para definir modelos de vista en ASP.NET MVC usando C#, construida sobre FluentValidation.

FluentViewModel permite mapear las propiedades de un modelo existente a plantillas de editores de formulario y vistas, aprovechando las ventajas de las clases genéricas, notación lambda y la funcionalidad de autocompletar de Visual Studio, para facilitar a los programadores la creación de modelos de vista.

Por otra parte, FluentViewModel hace uso de las funcionalidades de FluentValidation para definir las validaciones necesarias a realizarse para los objetos.

¿Cómo funciona FluentViewModel? (a grosso modo)

Creo que la mejor forma de explicar cómo funciona, es con un ejemplo: Sigue leyendo

Imprimir reporte de ReportViewer desde otro navegador web que no sea IE

El título es algo largo, jejeje, pero tenía que ser explícito. Si ya han usado el control ReportViewer en alguna aplicación o sitio web de ASP.NET, habrán notado que el botón de imprimir no se muestra en navegadores web como Mozilla Firefox o Google Chrome, sino solamente en Internet Explorer. ¿Por qué sucede esto? Muchos sostienen que es una artimaña del imperio para obligar al público a usar IE. Sin embargo, la versión que sostienen otros es que se debe a que para hacer uso de este botón se requiere que el navegador soporte ActiveX.

¿Qué podemos hacer al respecto, si definitivamente no queremos utilizar IE? Bueno, después de buscar en google y hacer algunas pruebas sin éxito, surgió la solución que describo a continuación, y que requiere el uso de la librería jQuery: Sigue leyendo

SQL Server Snippets – Aproximación de valor real a N-ésimo decimal superior/inferior

Supóngase que se tiene un valor real o float, que se quiere aproximar al N-ésimo decimal superior. Por ejemplo:


DECLARE @valor FLOAT
SET @valor = 1.9011

Para aproximar al 3er decimal superior, basta usar la función mátematica integrada de T-SQL llamada CEILING, de la siguiente forma:


SELECT CEILING(@valor*1000)/1000

El resultado de la operación es 1.902. Observemos paso a paso lo que sucede: Sigue leyendo

Nuevo proyecto: Juego para Android

Después de algunos sucesos, me he sentido motivado y animado a iniciar un proyecto a mediano-largo plazo, que consiste en un juego para Android. El único detalle está en que jamás en mi vida he hecho un juego, y mucho menos un programa para Android, jejeje… Lo más que hice fue una guardar una tabla de resultados para un proyecto en la materia de Gráficos por Computadora de la universidad. Pero me gusta correr antes que caminar (en este caso en particular), así que quiero hacer un juego 3D. A continuación describo mis ideas. Sigue leyendo

SQL Server Snippets – Columna de fecha de última modificación en SQL Server

Supongamos que por cuestiones de control de modificaciones y auditoría, se quiere contar con un campo de fecha de última modificación en todas las tablas de una base de datos de SQL Server.

El inconveniente es que SQL Server no posee nativamente un tipo de dato que guarde la fecha de última modificación de un registro, el cual se actualice automáticamente al modificar una fila de datos. Por ello, una alternativa a esto es definir una columna de tipo datetime en cada tabla que se actualice cada vez que se modifique uno o más registros de esta, a través de un trigger. Sigue leyendo