lunes, 24 de diciembre de 2018

Mensaje de error Visual Studio 2012: configuring web for asp.net 4.5 failed you must manually configure

Tuve un problema en Visual Studio 2012 al intentar crear un nuevo proyecto MVC 4, me mostraba un mensaje de error donde indicaba que había problemas en la configuración web para asp.net 4.5 y que debía configurar manualmente el sitio:

"configuring web for asp.net 4.5 failed you must manually configure this site for ASP.net 4.5. ... "



Yo descargué una actualización para solucionar el problema del Microsoft Visual Studio 2012, la actualización es KB3002339, http://support.microsoft.com/kb/3002339. El enlace para la descara directa es: http://download.microsoft.com/download/A/0/2/A02C37E0-77F7-448A-BD5C-F66AB1F78DBC/VS11-KB3002339.exe
Posted by InfoTacticas Soluciones  |  No comments

12/24/2018 04:40:00 p. m. Share:

0 comentarios:

domingo, 9 de diciembre de 2018

Insertar varias filas con una sola consulta

Puede hacerse de alguna de las siguientes maneras:

--
--
INSERT INTO tabla (campo1, campo2) VALUES ('f1c1', 'f1c2'), ('f2c1', 'f2c2'),('f3c1', 'f3c2');



--
--
INSERT INTO MyTable (FirstCol, SecondCol)
SELECT 'f1c1' , 'f1c2'
UNION ALL
SELECT 'f2c1' , 'f2c2'
UNION ALL
SELECT 'f3c1' , 'f3c2'
UNION ALL
SELECT 'f4c1' , 'f4c2'
UNION ALL
SELECT 'f5c1' , 'f5c2'
GO


Posted by InfoTacticas Soluciones  |  No comments

12/09/2018 03:34:00 p. m. Share:

0 comentarios:

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:

2 comentarios:

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:

0 comentarios:

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:

0 comentarios:

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:

0 comentarios:

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:

0 comentarios:

Crear Bases de Datos, Modificar y Adjuntar

  1. Crear la base de datos Marketing ubicada en D:\SQL SERVER - practicas, con dos archivos Marketing.mdf y Marketing.ldf
    --
    --
    create database Marketing
    on primary
    (Name= ‘Marketing′, Filename=’D:\SQL SERVER - practicas\Marketing.mdf’,
    Size= 4Mb, MaxSize= 30MB, FileGrowth=10%)
    log on
    (Name=’Marketing_LDF’, Filename=’D:\SQL SERVER - practicas\Marketing.ldf’,
    Size= 4Mb, MaxSize= 30MB, FileGrowth=10%)
    go
    

  2. Crear la base de datos AdventureWorks2012 adjuntando los archivos mdf y ldf
    --
    --
    -- Crear una base de datos AdventureWorks2012 en base al archivo AdventureWorks2012_Data.MDF y AdventureWorks2012_Log.LDF
    
    CREATE DATABASE [AdventureWorks2012] ON (FILENAME = N'D:\SQL SERVER - practicas\BD_AdventureWorks\AdventureWorks2012_Data.mdf') 
    LOG ON (FILENAME = [D:\SQL SERVER - practicas\BD_AdventureWorks\AdventureWorks2012_Log.ldf]) FOR ATTACH
    
    

  3. Cambiar el nombre lógico de un archivo mdf o ldf
    --
    --
    -- Cambiar el nombre lógico de un archivo
    
    ALTER DATABASE AdventureWorks2012  MODIFY FILE
    (NAME='AdventureWorks2012_Data', NEWNAME='AdventureWorks_Data')
    GO
    
    ALTER DATABASE AdventureWorks2012  MODIFY FILE
    (NAME='AdventureWorks2012_Log', NEWNAME='AdventureWorks_Log')
    GO
    

sql server
Posted by InfoTacticas Soluciones  |  No comments

5/05/2018 06:27:00 a. m. Share:

0 comentarios:

PONER OFFLINE Y ONLINE UNA BASE DE DATOS SQL SERVER

Para colocar OFFLINE una base de datos hacer lo siguiente:
--
-- 

alter database AdventureWorks set restricted_user with rollback IMMEDIATE

alter database AdventureWorks set MULTI_USER

alter database AdventureWorks set offline with rollback immediate


Para colocar ONLINE una base de datos hacer lo siguiente:
--
--
alter database AdventureWorks set online


sql server
Posted by InfoTacticas Soluciones  |  No comments

5/05/2018 06:21:00 a. m. Share:

0 comentarios:

viernes, 4 de mayo de 2018

Listar las tablas y las columnas identity de una base de datos sql server

Cuando necesitamos saber cuáles tablas de una base de datos tienen campos identity y cuáles son esos campos, podemos usar el siguiente script:
--
--
SELECT
distinct TABLE_SCHEMA,TABLE_NAME,COLUMN_Name
FROM INFORMATION_SCHEMA.COLUMNS,
sys.Objects so
WHERE
--TABLE_SCHEMA = 'dbo' and
 COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1 and
so.Type = 'U' 
ORDER BY TABLE_NAME
sql server
Posted by InfoTacticas Soluciones  |  No comments

5/04/2018 02:30:00 p. m. Share:

0 comentarios:

Revisar contenido de archivos Backup de SQL SERVER

SQL Server ofrece algunos comandos que puedes utilizar con los archivos de copia de seguridad de base de datos para determinar su contenido. Estas opciones incluyen HEADERONLY, FILELISTONLY y LABELONLY.
A continuaciòn se muestra como usar estos comandos para ver el contenido del archivo de backup: AdventureWorksDW2012.bak.
--
--

RESTORE HEADERONLY FROM DISK='D:\SQL SERVER - practicas\BD_AdventureWorks\AdventureWorksDW2012.bak'

RESTORE FILELISTONLY FROM DISK='D:\SQL SERVER - practicas\BD_AdventureWorks\AdventureWorksDW2012.bak'

RESTORE LABELONLY FROM DISK='D:\SQL SERVER - practicas\BD_AdventureWorks\AdventureWorksDW2012.bak'


Se puede utilizar la salida de FILELISTONLY para determinar donde podrían estar las ubicaciones por defecto para los archivos de datos y de registro, los valores de LogicalName y PhysicalName muestran el directorio donde se almacena la base de datos que por defecto puede ser el directorio "C:\Program Files\Microsoft SQLServer\MSSQL.1\MSSQL\Data\". Si el directorio no existe o si deseas especificar otro directorio o nombre de archivo, necesitas utilizar la opción WITH MOVE del comando RESTORE. Esto se puede hacer de la siguiente manera:
--
--
RESTORE DATABASE AdventureWorksDW2012 FROM DISK='D:\SQL SERVER - practicas\BD_AdventureWorks\AdventureWorksDW2012.bak'
WITH FILE = 1,
RECOVERY,
MOVE 'AdventureWorksDW2012' TO 'D:\SQL SERVER - practicas\DATA\AdventureWorksDW2012.mdf',
MOVE 'AdventureWorksDW2012_log' TO 'D:\SQL SERVER - practicas\DATA\AdventureWorksDW2012_Log.ldf'

Para más detalle se puede consultar el siguiente enlace:
http://blog.jmacoe.com/gestion_ti/base_de_datos/que-hay-dentro-archivos-copia-seguridad-sql-server/
sql server
Posted by InfoTacticas Soluciones  |  No comments

5/04/2018 02:17:00 p. m. Share:

0 comentarios:

viernes, 27 de abril de 2018

Reorganizar y volver a generar índices - optimizar la consulta de datos - PARTE 2

En mi entrada: http://infotacticassoluciones.blogspot.pe/2018/02/reorganizar-y-volver-generar-indices.html muestro como reorganizar o reconstruir todos los indices de una tabla determinada de manera automática, sin tener que escribir indice por indice y con la posibilidad de que si se agregan más indices, se tenga que editar el script que reorganiza los indices para incluir los nuevos.
En esta oportunidad, extiendo esta funcionalidad para considerar un conjunto de tablas dadas y que el script se encargue de reorganizar o reconstruir, según sea el caso, todos los índices que posea.
--
--
create procedure PROC_REINDEXA_TABLAS
as
begin

set nocount on

-- Reduce el tamaño de los archivos de datos y de registro de la base de datos especificada.
DBCC SHRINKDATABASE(N'tempdb')

CREATE TABLE #tablas_reindexar (
  ID smallint identity,
  Nombre_Tabla varchar(200)
) 

insert into #tablas_reindexar values('dbo.cta_corriente')
insert into #tablas_reindexar values('dbo.transaccion')
insert into #tablas_reindexar values('dbo.descuento_cta')
insert into #tablas_reindexar values('dbo.decremento_cta')
insert into #tablas_reindexar values('dbo.DOCUMENTO')
insert into #tablas_reindexar values('dbo.DETALLE_DOCUMENTO')
insert into #tablas_reindexar values('dbo.PAGO')
insert into #tablas_reindexar values('dbo.DETALLE_PAGO')
insert into #tablas_reindexar values('dbo.RESOLUCION')
insert into #tablas_reindexar values('dbo.PERSONA')
insert into #tablas_reindexar values('dbo.INTERES')

CREATE TABLE #reorganizar_reindexar (
 Id int identity,
 Index_ID int,
 NOMBRE_INDICE varchar(200),
 NOMBRE_TABLA varchar(200),
 PORCENTAJE_FRAGMENTACION decimal(10,2),
 ACCION varchar(2)
)

DECLARE @DB_NAME nvarchar(100) = ( select DB_NAME() )



-- LLENAR a la tabla #reorganizar_reindexar los indices de las tablas especificadas, 
-- el porcentaje de fragmentación y la acción que corresponde de REORGANIZAR O RECONSTRUIR
DECLARE @nombre_tabla varchar(200) = null
DECLARE @id_tabla smallint = 0

SELECT TOP 1 @id_tabla = ID, @nombre_tabla = nombre_tabla 
from #tablas_reindexar
where ID > @id_tabla 
order by ID


WHILE @nombre_tabla is not null
BEGIN
 
 insert into #reorganizar_reindexar (Index_ID, NOMBRE_INDICE, NOMBRE_TABLA, PORCENTAJE_FRAGMENTACION, ACCION)
 SELECT a.index_id, name as nombre_indice, OBJECT_name(a.object_id) as nombre_tabla,
 avg_fragmentation_in_percent as porcentaje_fragmentacion, 
 case when avg_fragmentation_in_percent <= 30 then 'RO' -- REORGANIZAR
 else 'RI' -- REINDEXAR 
 END as 'ACCION'
 FROM sys.dm_db_index_physical_stats (DB_ID(@DB_NAME), OBJECT_ID(@nombre_tabla), NULL, NULL, NULL) AS a
  JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id
 where avg_fragmentation_in_percent >= 5 
 and name <> ''

 set @nombre_tabla = null

 SELECT TOP 1  @id_tabla = ID, @nombre_tabla = nombre_tabla from #tablas_reindexar
 where ID > @id_tabla 
 order by ID

 --Print 'ID = ' + convert(varchar, isnull(@id_tabla,0)) + ', ' + @nombre_tabla
END

DECLARE @i int = 1
declare @nombre_indice varchar(200), @accion varchar(10)
declare @sql nvarchar(200)=''

set @nombre_tabla = null

select top 1 @i = ID, @nombre_tabla = nombre_tabla, @nombre_indice = nombre_indice, @accion = accion
from #reorganizar_reindexar
order by ID


while @nombre_tabla is not null
begin
 --RAISERROR(@i, 0, 1) WITH NOWAIT
 Print @i
 RAISERROR(N'', 0, 1) WITH NOWAIT

 if @accion = 'RO'
 begin
  set @sql = 'ALTER INDEX ' + @nombre_indice + ' ON dbo.' + @nombre_tabla + ' REORGANIZE'
 end 
 else
 begin
  set @sql = 'ALTER INDEX '+  @nombre_indice + ' ON dbo.' + @nombre_tabla + ' REBUILD' + ' WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON)'
 end
 
 --RAISERROR(@sql, 0, 1) WITH NOWAIT
 Print @sql
 RAISERROR(N'', 0, 1) WITH NOWAIT
 execute sp_executesql @sql
  
 set @nombre_tabla = null

 select top 1 @i = ID, @nombre_tabla = nombre_tabla, @nombre_indice = nombre_indice, @accion = accion
 from #reorganizar_reindexar
 where ID > @i
 order by ID

end

set nocount off

drop table #reorganizar_reindexar
drop table #tablas_reindexar
end


Finalmente, para saber a que grupo de archivos de base de datos pertenecen los índices de una tabla, por ejemplo para la tabla Department del esquema HumanResources de la base de datos AdventureWorks2012, entonces se necesita usar el siguiente script:
--
--
use AdventureWorks2012
GO;

-- https://www.lawebdelprogramador.com/foros/SQL/615668-Como-ver-en-que-filegroup-esta-la-tabla.html
select si.name, sf.fileid, sf.name as 'nombre file', sfg.groupid, sfg.groupname 
from sysindexes si inner join sysfiles sf on si.groupid = sf.groupid 
inner join sysfilegroups sfg on sf.groupid = sfg.groupid 
where si.id = object_id('HumanResources.Department')


indices sql server
Posted by InfoTacticas Soluciones  |  No comments

4/27/2018 07:48:00 a. m. Share:

0 comentarios:

lunes, 12 de marzo de 2018

Procesar SSAS desde jobs SQL Server Agent

Construí un paquete SSIS que llenaba los datos a las tablas de dimensiones y de hechos, y como paso final actualizaba el cubo, cuando lo ejecutaba desde el proyecto SSIS funcionaba bien, pero cuando trabajé con una tarea SQL programada que ejecutara este paquete de datos, no se realizaba el último paso que actualizaba el cubo y mostraba el error: "Either the 'NT Service\SQLSERVERAGENT' user does not hav eperimission to process the '' object, or the object does not exist."
Según la información que encontré, es necesario agregar el usuario: 'NT SERVICE\SQLSERVERAGENT' a los roles de procesamiento de SSAS. Para hacer esto debemos seguir los siguientes paso:
  • En el SQL Server Management Studio, conectarse a la instancia de Analysis Services, abrir el folder de base de datos, y seleccionar una base de datos.
  • Click derecho en Roles, Nuevo Rol. Ingresar un nombre y una descripción (o usar el rol actual)
  • En el panel General, seleccionar el checkbox Procesar base de datos. Además, seleccionar Leer Definición para habilitar también el procesamiento interactivo através de una de las herramientas de SQL Server como el SQL Server Management Studio.
  • En el panel Pertenencias, añade el usuario de Windows y añadir las cuentas que tiene permisos para procesar algún objeto en la base de datos: NT AUTORITHY\SERVICE.
  • Click en OK para completar la definición del Rol.
Leer:
https://social.msdn.microsoft.com/Forums/Windowsdesktop/en-US/67736093-360e-4dab-b7bf-d74f2477efa4/process-ssas-from-sql-server-agent?forum=sqlanalysisservices

https://docs.microsoft.com/en-us/sql/analysis-services/instances/schedule-ssas-administrative-tasks-with-sql-server-agent

https://docs.microsoft.com/en-us/sql/ssms/agent/configure-sql-server-agent
sql server SSAS
Posted by InfoTacticas Soluciones  |  No comments

3/12/2018 02:49:00 p. m. Share:

0 comentarios:

jueves, 8 de febrero de 2018

Cambiar Autenticación windows, cambiar contraseña de usuario sa cuando no se puede conectar a través del Usuario de Windows

Me pasó que cuando instalé SQL SERVER 2012 en el trabajo, lo hice en modo de autenticación mixta, pero como más uso el Management Studio para conectarme a un Servidor de SQL SERVER remoto, entonces con el tiempo olvidé la clave del usuario sa, y lo que es peor no se porqué no podía conectarme con la autenticación de Windows. Entonces googleando, seguí unos pasos de una y otra fuente y llegue a resolver mi problema A continuación les indico que realicé para volver a habilitar el modo de autenticación mixta y cambiar la contraseña al usuario sa.
  1. Conectarse a SQL Server cuando los administradores no tienen acceso
  2. En este enlace detallan como hacer para Iniciar la instancia de SQL Server en modo de usuario único usando las opciones -m, para luego habilitar el modo de autenticación mixto y cambiar la contraseña al usuario sa.
    https://docs.microsoft.com/es-es/sql/database-engine/configure-windows/connect-to-sql-server-when-system-administrators-are-locked-out
    Para esto se tiene que cerrar Management Studio y luego acceder al Administrador de configuración de SQL Server . En el Administrador de configuración de SQL Server, en el panel izquierdo, seleccione Servicios de SQL Server. En el panel derecho, busque la instancia de SQL Server. Haga clic con el botón derecho en la instancia de SQL Server y, después, haga clic en Propiedades. En la pestaña Parámetros de inicio, en el cuadro Especifique un parámetro de inicio, escriba -m y, después, haga clic en Agregar. Haga clic en Aceptar y, después del mensaje para reiniciar, haga clic con el botón derecho en el nombre del servidor; luego, haga clic en Reiniciar. Después de que SQL Server se haya reiniciado, el servidor se encontrará en modo de usuario único.
    A continuación se debe iniciar el Management Studio como administrador.
  3. Cambiar el Modo de Autenticación de Seguridad y Habilitar el Inicio de Sesión sa
  4. En el siguiente enlace se detalla que pasos seguir: https://msdn.microsoft.com/es-es/library/ms188670(v=sql.120).aspx o en: https://es.slideshare.net/KevinFD/habilitacion-de-autentificaion-de-sql?next_slideshow=1
    Sin embargo, resumiré los pasos a seguir:
    Para Cambiar el Modo de Autenticación de Seguridad
    • En el Explorador de objetos de SQL Server Management Studio , haga clic con el botón derecho en el servidor y, después, haga clic en Propiedades.
    • En la página Seguridad , bajo Autenticación de servidor, seleccione el nuevo modo de autenticación del servidor y haga clic en Aceptar.
    • En el cuadro de diálogo SQL Server Management Studio , haga clic en Aceptar para confirmar el requisito de reiniciar SQL Server.
    • En el Explorador de objetos, haga clic con el botón derecho en el servidor y, después, haga clic en Reiniciar. Si el Agente SQL Server se está ejecutando, también debe reiniciarse.

    Para Habilitar el Inicio de Sesión sa
    • En el Explorador de objetos, expanda Seguridad, expanda Inicios de sesión, haga clic con el botón derecho en sa y después haga clic en Propiedades.
    • En la página General , quizás tenga que crear y confirmar una contraseña para el inicio de sesión.
    • En la página Estado , en la sección Inicio de sesión , haga clic en Habilitado y, a continuación, en Aceptar.

    Ambas acciones de Cambiar el Modo de Autenticación de Seguridad y Habilitar el Inicio de Sesión sa también se pueden realizar a través de TRANSACT SQL de la siguiente manera:
    --
    --
    ALTER LOGIN sa ENABLE ;  
    GO  
    ALTER LOGIN sa WITH PASSWORD = '' ;  
    GO  
    

  5. Cambiar SQL Server al modo multiusuario

  6. Primero es necesario Cerrar el Management Studio. Luego tenemos que abrir el Administrador de configuración de SQL Server. En el Administrador de configuración de SQL Server, en el panel izquierdo, seleccione Servicios de SQL Server. En el panel derecho, haga clic con el botón derecho en la instancia de SQL Server y, después, haga clic en Propiedades. En la pestaña Parámetros de inicio, en el cuadro Parámetros existentes, seleccione -m y, después, haga clic en Quitar. Luego, Haga clic con el botón derecho en el nombre del servidor y, después, haga clic en Reiniciar. Ahora debe poder conectarse normalmente con una de las cuentas que es miembro del rol fijo de servidor sysadmin .
Posted by InfoTacticas Soluciones  |  No comments

2/08/2018 09:51:00 a. m. Share:

0 comentarios:

martes, 6 de febrero de 2018

Devolver las entidades que hacen referencia a una entidad determinada, aunque se encuentre en SQL Dinámico

Para devolver las entidades que hacen referencia a una entidad determinada, como una tabla, se utiliza sp_depends en T-SQL. SP_DEPENDS muestra las dependencias de los objetos de la base de datos, tales como las vistas y procedimientos que dependen de una tabla o de una vista, y las tablas y vistas de las que depende la vista o el procedimiento. Las referencias a objetos que no se encuentran en la base de datos actual no se notifican. Sin embargo, se recomienda usar, en lugar de SP_DEPENDS, sys.dm_sql_referencing_entities y sys.dm_sql_referenced_entities.
En mi experiencia prefiero usar las vistas del sistema: syscomments y sysobjects para buscar los objetos que hacen referencia a una tabla o vista en cuestión, la ventaja de hacerlo de este modo es que encuentra las dependencias incluso si estas están en citadas en cadenas de texto a ser usadas en SQL Dinámico.
A continuación muestro ejemplos y resultados de usar las 3 alternativas mencionadas, para encontrar referencias a la tabla sp_depends MIGRACION_INCREMENTAL_TABLAS:
Usando sp_depends
--
--
sp_depends MIGRACION_INCREMENTAL_TABLAS

El Resultado:

Usando sys.dm_sql_referencing_entities
--
--
SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent
FROM sys.dm_sql_referencing_entities ('dbo.MIGRACION_INCREMENTAL_TABLAS', 'OBJECT');
GO


El Resultado:


Usando las vistas syscomments y sysobjects
--
--
select name, c.id, c.text, o.xtype, o.crdate
from syscomments c 
join sysobjects o on c.id = o.id 
where c.TEXT like '%MIGRACION_INCREMENTAL_TABLAS%' 


El Resultado:

Además, se puede apreciar que sp_depends no lista todos los procedimientos almacenados que dependen de la tabla de ejemplo, he tenido que borrar el procedimiento almacenado y volverlo a generar para que lo reconozca, como en el caso del procedimiento: PROC_MIGRACION_INCREMENTAL_CONSULTAR. El Procedimiento Almacenado: proc_prueba no es listado por sp_depends porque la referencia a la tabla está en una variable de texto.
--
--
create procedure proc_prueba
as
begin
 DECLARE @VARIABLE nvarchar(2000)
 set @VARIABLE = 'select * from MIGRACION_INCREMENTAL_TABLAS'
end 

Posted by InfoTacticas Soluciones  |  No comments

2/06/2018 06:09:00 a. m. Share:

0 comentarios:

domingo, 4 de febrero de 2018

Reorganizar y volver a generar índices - optimizar la consulta de datos - PARTE 1

Los indices de una tabla, por ejemplo la tabla Department del esquema HumanResources de la base de datos AdventureWorks2012, se pueden listar con la siguiente instrucción:
--
--
use AdventureWorks2012
GO;

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
where tab.name = 'Department' and s.name = 'HumanResources'
ORDER BY  s.name,tab.name

Cada vez que se realizan operaciones de inserción, actualización o eliminación de los datos de una tabla, el motor de base de datos de SQL Server da mantenimiento a los indices de dicha tabla. Sin embargo, con el tiempo la información del índice se dispersa por la base de datos, es decir, se fragmenta, ocasionando que la ordenación lógica que está basada en el valor de clave no coincida con la ordenación física dentro del archivo de datos. Cuando los índices están muy fragmentados hay mayor probabilidad de que las consultas a los datos de la tabla sean lentas. La fragmentación del índice se soluciona reorganizándolo o volviéndolo a generar. El proceso de volver a generar un índice quita y vuelve a crear el índice. Para saber si los índices de una tabla están fragmentados podemos usar la siguiente consulta:
--
--
SELECT a.index_id, name as nombre_indice, avg_fragmentation_in_percent  as porcentaje_fragmentacion
FROM sys.dm_db_index_physical_stats (DB_ID(N'BD_TRIBUTACION'), 
      OBJECT_ID(N'dbo.Cta_Corriente'), NULL, NULL, NULL) AS a  
JOIN sys.indexes AS b 
      ON a.object_id = b.object_id AND a.index_id = b.index_id;   
GO  

-- o en AdventureWorks2012
SELECT a.index_id, name, avg_fragmentation_in_percent  
FROM sys.dm_db_index_physical_stats (DB_ID(N'AdventureWorks2012'), 
      OBJECT_ID(N'HumanResources.Department'), NULL, NULL, NULL) AS a  
    JOIN sys.indexes AS b 
      ON a.object_id = b.object_id AND a.index_id = b.index_id;   
GO  



Para reorganizar un índice en una tabla se debe emplear la siguiente instrucción:
--
--
ALTER INDEX [NombreDelIndice] ON [schema].[TablaDondeEstaElIndice] REORGANIZE

Para reconstruir un índice en una tabla se debe emplear la siguiente instrucción:
--
--
ALTER INDEX [NombreDelIndice] ON [schema].[TablaDondeEstaElIndice] REBUILD

Para volver a reconstruir todos los índices de una tabla determinada usar:
--
--
USE BD_TRIBUTACION; 
GO
-- Reorganizar todos los índices de la tabla dbo.Cta_corriente.
ALTER INDEX ALL ON dbo.Cta_corriente
REBUILD; 
GO

Para obtener información más técnica acerca de la fragmentación de los índices, puede consultar el siguiente enlace: https://technet.microsoft.com/es-es/library/ms189858(v=sql.110).aspx. En esta página se menciona que la decisión de si se reorganiza o se reconstruye un índice de una tabla depende del porcentaje de fragmentación, si está entre un 5% y 30% es mejor REORGANIZARLO, en caso sea mayor al 30% de fragmentación entonces es mejor RECONSTRUIRLO, si es menor a un 5% no es conveniente aplicarle ningún tratamiento. A continuación he elaborado un script que permite reorganizar reconstruir o dejar intacto los índices de una tabla dada en función a la recomendación mencionada del porcentaje de fragmentación.
--
--

SELECT a.index_id, name as nombre_indice, OBJECT_name(a.object_id) as nombre_tabla,
avg_fragmentation_in_percent as porcentaje_fragmentacion, 
case when avg_fragmentation_in_percent <= 30 then 'RO' -- REORGANIZAR
else 'RI' -- REINDEXAR 
END as 'ACCION'
into #reorganizar_reindexar
FROM sys.dm_db_index_physical_stats (DB_ID('N'BD_TRIBUTACION'), OBJECT_ID(N'dbo.cta_corriente'), NULL, NULL, NULL) AS a
    JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id
where avg_fragmentation_in_percent >= 5 

--select * from #reorganizar_reindexar

DECLARE @i int = 1, @ix int
declare @nombre_indice varchar(200), @nombre_tabla varchar(200), @accion varchar(10)
declare @sql nvarchar(200)=''


select top 1 @i = index_id, @nombre_tabla = nombre_tabla, @nombre_indice = nombre_indice, @accion = accion
from #reorganizar_reindexar
order by index_id

while @i is not null
begin
 --RAISERROR(@i, 0, 1) WITH NOWAIT
 Print @i
 RAISERROR(N'', 0, 1) WITH NOWAIT

 if @accion = 'RO'
 begin
  set @sql = 'ALTER INDEX ' + @nombre_indice + ' ON dbo.' + @nombre_tabla + ' REORGANIZE' --WITH (ONLINE = ON);
 end 
 else
 begin
  set @sql = 'ALTER INDEX '+  @nombre_indice + ' ON dbo.' + @nombre_tabla + ' REBUILD' --WITH (ONLINE = ON);;
 end
 
 --RAISERROR(@sql, 0, 1) WITH NOWAIT
 Print @sql
 RAISERROR(N'', 0, 1) WITH NOWAIT
 execute sp_executesql @sql

 set @ix = null
 select top 1 @ix = index_id, @nombre_tabla = nombre_tabla, @nombre_indice = nombre_indice, @accion = accion
 from #reorganizar_reindexar
 where index_id > @i
 order by index_id

 set @i = @ix
 
end

drop table #reorganizar_reindexar


Utilizo RAISERROR tan solo para ver los mensajes durante la ejecución del WHILE, porque de otra manera los mensajes se muestran al final del while o después de cierto tiempo, por ello el RAISEERROR muestra el mensaje inmediatamente.
indices sql server
Posted by InfoTacticas Soluciones  |  No comments

2/04/2018 04:30:00 p. m. Share:

0 comentarios:

Get updates in your email box
Complete the form below, and we'll send you the best coupons.

Deliver via FeedBurner
back to top