miércoles, 28 de noviembre de 2018

ORM en desarrollo de aplicaciones

Un ORM, en el desarrollo de aplicaciones con acceso a base de datos, simplifica el trabajo del desarrollo de este tipo de aplicaciones enormemente. En el desarrollo de este tipo de aplicaciones se requiere realizar un mapeo, que consiste en transformar la información de la base de datos en tablas a objetos de la aplicación y viceversa. Entonces, ¿Qué es un ORM? Un ORM es el responsable del mapeo automático.

ORM procede de las siglas Object Relational Mapping. El trabajo deja de ser manual ya que el ORM lo realizará de forma independiente de la base de datos. Además, gracias al mapeo automático podrás cambiar de motor de base de datos fácilmente y cuando quieras.

El ORM es un modelo de programación que transforma las tablas de una base de datos en entidades para simplificar enormemente la tarea del programador.

Un ORM es una biblioteca especializada en acceso a datos que genera por ti todo lo necesario para conseguir que no tengas conceptos "extraños" de bases de datos en tu código orientado a objetos. En la práctica para ti la base de datos es como si no existiera.

Un ORM (Object Relational Mapping) es un tipo de biblioteca de acceso a datos que intenta hacer que esta tarea sea más natural para los desarrolladores. Así, a la hora de acceder a datos, en lugar de utilizar otro lenguaje (generalmente SQL), un ORM permite que puedas utilizar los paradigmas habituales de la programación orientada a objetos: clases y objetos. En lugar de pensar en tablas y relaciones, piensas en objetos y propiedades.

Ventajas y desventajas de un ORM
  • Ventajas
    • No tienes que escribir código SQL
    • Algo que muchos programadores no dominan y que es bastante complejo y propenso a errores. Ya lo hacen por nosotros los ORM.
    • Facilidad y velocidad de uso
    • Un ORM, nos facilita las labores básicas de cualquier acceso a datos , el CRUD (Create, Read, Update y Delete). Realizando todas estas labores a través de un lenguaje de alto nivel orientado a objetos.
    • Abstracción de la base de datos usada.
    • Por ejemplo, si se usaran instruciones SQL desde la aplicación en vez de ORm, listar los 10 primeros registro de una tabla conlleva a usar diferentes sintaxis en las bases de datos MS-SQL SERVER, ORACLE o MySQL. El ORM al tener un capa intermedia, abstrae al programador de la base de datos y le centra en el desarrollo de la aplicación.
    • Seguridad de la capa de acceso a datos contra ataques.
    • Se encargan de evitar posibles ataques de inyección SQL y similares.
  • Desventajas
    • En entornos con gran carga poner una capa más en el proceso puede mermar el rendimiento.
    • En general una consulta SQL directa será más eficiente siempre.
    • Aprender el nuevo lenguaje del ORM.
    • La configuración inicial que requieren se puede complicar dependiendo de la cantidad de entidades que se manejen y su complejidad, del gestor de datos subyacente, etc...

Uno de los mapeos automáticos más utilizados es de JAVA y se llama Hibernate, pero también están iBatis, Ebean, para .NET nHibernate, Entity Framework, o para PHP Doctrine y Propel, entre otros.

Para profundizar más puede acceder a:
https://www.campusmvp.es/recursos/post/que-es-un-orm.aspx

Posted by InfoTacticas Soluciones  |  2 comments

11/28/2018 03:02:00 p. m. Share:

jueves, 10 de mayo de 2018

Listar las tablas de una base de datos, su tamaño en disco, de los datos e indices

Para listar las tablas de una base de datos con información de su tamaño en disco, de los datos e indices y del número de filas se puede hacer uso del siguiente script:
--
--

--

--Cursor que contiene todos los objetos que ocupan espacio
DECLARE objects_cursor CURSOR LOCAL FAST_FORWARD READ_ONLY for
      SELECT s.name + '.' + o.name from sys.schemas s
      INNER JOIN sys.objects o
      ON o.schema_id = s.schema_id
      WHERE
            o.type = 'S' or --Tablas de sistema
            o.type = 'U' or --Tablas de usuario
            o.type = 'V' or --Vistas (solo las indexadas devuelven tamaño)
            o.type = 'SQ' or --Cola de servicio
            o.type = 'IT' -- Tablas internas usadas p.e. por el Service Broker o los indices XML
--Tabla temporal para albergar los resultados
CREATE TABLE #results
      (name_with_schema SYSNAME,
   name SYSNAME, rows CHAR(11),
      reserved VARCHAR(18), data VARCHAR(18),
      index_size VARCHAR(18),Unused VARCHAR(18))

DECLARE @resultado AS TABLE
      (name SYSNAME, rows CHAR(11),
      reserved VARCHAR(18), data VARCHAR(18),
      index_size VARCHAR(18),Unused VARCHAR(18))
--Recorremos el cursor obteniendo la información de espacio ocupado
DECLARE @object_name AS SYSNAME
OPEN objects_cursor
FETCH NEXT FROM objects_cursor
INTO @object_name;
WHILE @@FETCH_STATUS = 0
BEGIN
      INSERT INTO @resultado
            EXEC sp_spaceused @object_name
   
   INSERT INTO #results
   SELECT @object_name, x.* 
   from @resultado as x

   delete from @resultado
   
      FETCH NEXT FROM objects_cursor
            INTO @object_name;    
END;
CLOSE objects_cursor;
DEALLOCATE objects_cursor;
-- Quitamos "KB" para poder ordenar
UPDATE
  #results
SET
  reserved = LEFT(reserved,LEN(reserved)-3),
  data = LEFT(data,LEN(data)-3),
  index_size = LEFT(index_size,LEN(index_size)-3),
  Unused = LEFT(Unused,LEN(Unused)-3)
--Ordenamos la información por el tamaño ocupado
SELECT
  name_with_schema,
  Name,
  reserved AS [Tamaño en Disco (KB)],
  data AS [Datos (KB)],
  index_size AS [Indices (KB)],
  Unused AS [No usado (KB)],
  Rows AS Filas FROM #results
ORDER BY
    name_with_schema,
 name,
  CONVERT(bigint, reserved) DESC

drop table #results


indices sql server
Posted by InfoTacticas Soluciones  |  No comments

5/10/2018 12:11:00 a. m. Share:

lunes, 7 de mayo de 2018

Deshabilitar o Habilitar todos los triggers de la base de datos sql server

A continuación muestro un procedimiento almacenado que permite habilitar o deshabilitar todos los triggers de una base de datos, de acuerdo al parámetro booleano: HABILITAR
--
--

CREATE PROCEDURE [dbo].[PROC_HABILITAR_DESHABILITAR_TRIGGERS_BASE]
@HABILITAR bit = 1
AS

 DECLARE @string VARCHAR(8000)
 DECLARE @NombreTabla NVARCHAR(500)
 DECLARE @NombreEsquema NVARCHAR(500)
 DECLARE @instruccion NVARCHAR(500)
 SET @instruccion = CASE WHEN @HABILITAR = 1 THEN 'ENABLE' ELSE 'DISABLE' END

 DECLARE cur CURSOR
 FOR SELECT DISTINCT  sch.name AS nombre_esquema, ta.name as 'nombre_tabla'
 FROM    sys.objects tr
 INNER JOIN sys.schemas sch ON tr.schema_id = sch.schema_id
 inner join  sys.objects ta on tr.parent_object_id = ta.object_id
 where tr.type = 'TR'
 order by sch.name, ta.name

 
 OPEN cur
 FETCH next FROM cur INTO @NombreEsquema, @NombreTabla 
 WHILE @@fetch_status = 0
 BEGIN
 SET @string ='Alter table '+ @NombreEsquema + '.'+@NombreTabla + ' ' + @instruccion + ' trigger all'
 EXEC (@string)
 FETCH next FROM cur INTO @NombreEsquema, @NombreTabla 
 END
 CLOSE cur
 DEALLOCATE cur 
GO


Posted by InfoTacticas Soluciones  |  No comments

5/07/2018 01:55:00 p. m. Share:

sábado, 5 de mayo de 2018

Scripts utiles para listar triggers, procedimientos, esquemas

A continuación mostramos varias instrucciones en SQL SERVER que pueden resultar útiles para listar triggers, procedimientos almacenados, vistas, esquemas, etc. Las pruebas siguientes se realizan sobre la base de datos ADVENTUREWORKS.
  • Listar las tablas que tienen triggers
    --
    --
    SELECT name AS tbname, * 
    FROM sysobjects WHERE id IN(SELECT parent_obj FROM sysobjects WHERE xtype='tr')
    
    -- o
    SELECT ta.name AS tbname, * 
    FROM sys.objects ta
    inner join sys.objects tr on ta.object_id = tr.parent_object_id
    WHERE tr.type = 'TR'
    
    

  • Obtener metadata con la definición del esquema de una tabla.
    --
    --
    select * 
    from Information_schema.Columns
    where table_name = 'WorkOrder'
    
    

  • Listar el esquema, la tabla y sus triggers.
    --
    --
    SELECT   sch.name AS nombre_esquema, ta.name as 'nombre_tabla', tr.name as nombre_trigger, tr.object_id, *
    FROM    sys.objects tr
    INNER JOIN sys.schemas sch ON tr.schema_id = sch.schema_id
    inner join  sys.objects ta on tr.parent_object_id = ta.object_id
    where tr.type = 'TR'
    order by sch.name, ta.name
    
    

  • Listar los triggers y si están deshabilitados o no.
    --
    --
    
    SELECT  
           TAB.name as Table_Name 
         , TRIG.name as Trigger_Name
         , TRIG.is_disabled  
    FROM [sys].[triggers] as TRIG 
    inner join sys.tables as TAB on TRIG.parent_id = TAB.object_id 
    --where TRIG.is_disabled = 1
    --t.name in ('WorkOrder', 'Vendor');
    

  • La definición de los triggers de unas tablas.
    --
    --
    
    select so.name, text
    from sysobjects so, syscomments sc
    where type = 'TR'
    and so.id = sc.id
    and so.name like '%WorkOrder%'
    
    

  • Listar los nombres de tablas y su esquema de base de datos.
    --
    --
    SELECT  o.name AS tbname, s.name AS schema_name
    FROM    sys.objects o 
    INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
    WHERE type='U' ORDER BY schema_name,o.name
    
    

  • Listado de objetos según su tipo.
    --
    --
    SELECT schema_Name(schema_id)  as  Nombre_Esquema,
           [name] as Nombre_Objeto,  --  Nombre de la tabla, procedimiento almacenado, vista o función
           [type] as Tipo_Objeto              --  'V' para Vistas, 'U' para Tablas, 'P' para Procedimientos Almacenados, 'FN' para funciones
    FROM sys.objects 
    WHERE [type_desc] IN ( 'USER_TABLE', 'SQL_STORED_PROCEDURE', 'VIEW', 'SQL_SCALAR_FUNCTION')
    AND [name] NOT LIKE 'sp_%'
    AND [name] NOT LIKE 'fn_%'
    ORDER BY 3 DESC,        --  primero el tipo de objeto
            1 ASC,          --  luego el esquema
            2 ASC           --  luego el nombre de la tabla /  función
    
    

  • Listado de triggers y su definición.
    --
    --
    SELECT * FROM SYS.SYSCOMMENTS 
    WHERE TEXT LIKE '%CREATE TRIGGER%'
    
    

  • Listado los indices de todas las tablas de una base de datos.
    --
    --
    SELECT 
          s.name,tab.name as tablename,
                ind.name as indexname  
    FROM 
         sys.indexes ind 
    INNER JOIN 
         sys.tables tab ON ind.object_id = tab.object_id
    INNER JOIN sys.schemas s on tab.schema_id = s.schema_id
    ORDER BY  s.name,tab.name
    
    

sql server
Posted by InfoTacticas Soluciones  |  No comments

5/05/2018 01:59:00 p. m. Share:

Listado de Procedimientos Almacenados creados o modificados en cierta fecha

Para listar los procedimientos almacenados listados o modificados a partir de cierta fecha se debe usar el siguiente script:
--
--
SELECT name, o.create_date, o.modify_date, * 
FROM AdventureWorks2012.sys.objects o
WHERE type = 'p' AND name NOT LIKE 'sp_%'
and (convert(date, modify_date) >= '2012-02-01'
or convert(date, create_date) >= '2012-02-01')
ORDER BY o.modify_date DESC


Y si lo que se quiere listar son las vistas, entonces habrá que cambiar type='p' por type='v', y para listar funciones escalares usar type = 'fn' y para funciones de tabla: type = 'tf'
sql server
Posted by InfoTacticas Soluciones  |  No comments

5/05/2018 08:22:00 a. m. Share:
back to top