SqlServer: Recuperar contraseña password de administrador en SQL Server 2016

Si por algún motivo, cuando trabajamos con muchas base de datos en distintos proyectos y no recordamos la contraseña del usuario administrador (sa) de algunos de los servidores SQL Server, es posible recuperarla de una forma muy simple.

Primero de todo, comentar que es válido para estas versiones SQL que he probado:

  • SQL Server 2008
  • SQL Server 2012
  • SQL Server 2014
  • SQL Server 2016

Segundo, muestro 3 formas de poder recuperar el password que me han funcionado en determinadas ocasiones:

  • Entrando como Windows Authentication
  • Consola de Comandos en modo Administrador
  • Microsoft SysInternals Tools al rescate

A) Entrando como Windows Authentication

La forma más rápida, es iniciar nuestro Windows Server como administrador y entrando a SQL Server Management Studio al «Database Engine» con «Windows Authentication», una vez dentro de SQL, ir a seguridad y resetear el password de nuestra cuenta «sa» o  «system administrator» que tengamos definido.

Nota: Si los usuarios administradores han cambiado por politicas de empresa, o hemos  perdido los password de cuentas con las que instalamos SQL Server, esta solución no funcionará y debemos probar con las siguientes.

B) Consola de Comandos en modo Administrador

Si esto no funciona, tenemos un planB que nos ayuda en estos casos. La solución pasa por ejecutar estos pasos directamente en la máquina Windows con SQL Server y permisos de Administrador.

Para ello, deberemos acceder al cmd como administrador y ejecutar lo siguiente:

c:\>net stop MSSQLSERVER 
c:\>net start MSSQLSERVER -m"SQLCMD"
c:\>sqlcmd
1>CREATE LOGIN newuser WITH PASSWORD='newpassword'
2>GO
1>SP_ADDSRVROLEMEMBER newuser, 'SYSADMIN'
2>GO
1>EXIT
c:\>net stop MSSQLSERVER
c:\>net start MSSQLSERVER

Aqui vemos capturada la pantalla con los pasos realizados y los mensajes obtenidos.

SQLServer2016-pasos-recuperar-login

Y listo, una vez ejecutados los pasos, si no aparecen errores, abrimos Management Studio y accederemos con el nuevo usuario creado para trabajar como administrador dentro de SQL Server y podremos reestablecer el password al usuario «sa».

C) Microsoft SysInternals Tools al rescate

Por último, si la solución anterior tampoco funciona, tenemos un PlanC, como explican estos pasos que encontre en un blog de MSDN en ingles:

  1. Run the SQL Server Management Studio as the system account. This can be done easily with the PsExec program. Download PsExec from Sysinternals website.
  2. Open an elevated Command Prompt and run:
    C:\PsExec.exe -s -i "C:\Program Files (x86)\Microsoft SQL Server\140\Tool\Binn\ManagementStudio\Ssms.exe"
  3. It will start SQL Server Management Studio as the system account. You’ll see that the username is shown as «NT AUTHORITY\SYSTEM». Simply choose the Windows Authentication mode and click on the Connect button.
  4. Once you connect, you can reset SA password.

If this also doesn’t work, the last resort is try some third-party software such as SQL Server Password Changer, or reinstall your SQL Server.

 

Bonus Extra SQL Management Studio

A pesar que esto no tiene que ver directamente con recuperar la contraseña, lo dejo por si encontrais alguna vez que desde SQL Studio no podeis acceder a las tablas porque vuestro usuario local no tiene permisos en el dominio para acceder a la base de datos.

Con este comando, podemos cambiar el usuario para entra a las tablas de SQL:

c:\> runas /netonly /user:DOMINIO\usuario “C:\Program Files (x86)\Microsoft SQL Server\140\Tools\Binn\ManagementStudio\Ssms.exe” (despues pide password)

Espero que sea de utilidad!!

SqlServer: No se admite la ejecución de CLR con agrupación ligera

sql-server-logoEs una puesta en producción después de hacer una migración a SQLServer 2014, nos encontramos con este problema: «Common Language Runtime (CLR) execution is not supported under lightweight pooling. Disable one of two options: clr enabled or lightweight pooling”. Después de buscar, leer, mirar documentación encontré un post con la solución que dejo aquí para compartirla.

Exception : System.Data.SqlClient.SqlException

Message (ingles) : Common language runtime (CLR) execution is not supported under lightweight pooling. Disable one of two options: «clr enabled» or «lightweight pooling».

Message (castellano): No se admite la ejecución de CLR con agrupación ligera. Deshabilite una de las dos opciones: «clr enabled» o «lightweight pooling».

Nuestro problema era que estamos usando: SELECT FORMAT(…) con lightweight pooling activado,  el FORMAT, SQL lo resuelve haciendo un llamada al CLR con lo cual esto provoca el conflicto. Una opción es quitar la llamada al FORMAT y cambiarlo por CAST o una función propia si no queremos tocar configuración de SQL Server sobretodo en entornos de producción, la otra es la que explico más abajo.

CLR Integration and Lightweight Pooling Conflict

I thought I am CLR Integration Guru in Sql Server but this morning I came to know that there are lots of things left to grab. While I was moving the local database on the new live server I run some CLR Procedure which Says these procedures required CLR Integration enabled. So to get that done.

I went on SQL Server Surface Area Configuration -> Surface Area configuration for features -> Enable CLR Integration. till here, every thing seems fine I encounter no error.

After that when I re-execute the same query I get a new error:

“Invalid connection (Common language runtime (CLR) execution is not supported under lightweight pooling.
Disable one of two options: “clr enabled or “lightweight pooling”.

I really have no idea what the light weight pooling is but the need of the time is to disable it. After googling for a bit I get this link. but still no use as the query written in this page is not working infact it is giving error.

  1.  sp_configure ’show advanced options’, 1;
  2.  GO
  3.  sp_configure ‘lightweightpooling’, 0;
  4.  GO
  5.  RECONFIGURE;
  6.  GO
Error: The configuration option ‘lightweightpooling’ does not exist, or it may be an advanced option.

To find what is going wrong, I quried on sys.configurations because this table contain database configuration.

   select * from sys.configurations where name like ‘%light%’

Finally, after running the above query I came to know that there is a space in ‘lightweightpooling’. It means it is ‘lightweight pooling. Now when I diagnose the problem I execute the following query which make my sql server CLR Integrated.

  1. USE master
  2. GO
  3. EXEC sp_configure ’show advanced options’, 1
  4. GO
  5. RECONFIGURE WITH OVERRIDE
  6. GO
  7. EXEC sp_configure ‘lightweight pooling’, 0
  8. GO
  9. EXEC sp_configure ‘clr enabled’, 1
  10. GO
  11. RECONFIGURE WITH OVERRIDE
  12. GO
  13. EXEC sp_configure ’show advanced options’, 0
  14. GO

After executing the query, we might need to restart the SQL Services to make it work.

Recomendación

Como siempre con estos temas, se recomienda realizar primero la prueba en un entorno separado para confirmar que se soluciona el problema detectado y no provoca efectos colaterales, ya que en este caso afecta a la base de datos «master».

Fuente: https://weblogs.asp.net/aghausman/clr-integration-and-lightweight-pooling-conflict
MSDN: https://docs.microsoft.com/en-us/sql/relational-databases/policy-based-management/disable-lightweight-pooling

 

SqlServer: Analizando Bloqueos, DeadLocks y Select Costosas

sql-server-logoUno de los problemas más complicados que podemos sufrir en nuestras aplicaciones es sin duda el tema de lentitud, timeouts, bloqueos, deadLocks,etc para buscar y encontrar como se han producido en nuestro sistema.

Para entenderlo de forma simple, Microsoft lo explica muy bien aqui: ms178104 y nos da información de como detectarlos, controlarlos y minimizarlos.

Por mi experiencia, en varias aplicaciones, utilizo las siguientes SELECTs que me van muy bien para ver lo que esta pasando en un entorno real de SQL en producción antes de llegar a utilizar SQL Profiler.

Información general de databases, sessions y procesos

SELECT * FROM sys.dm_exec_sessions where login_name <> 'sa';

SELECT * FROM sys.sysprocesses where blocked > 0;

SELECT name, is_read_committed_snapshot_on FROM sys.databases;

Información general de los posibles bloqueos en conexiones y peticiones

SELECT Blocker.text , Blocker.*, *
FROM sys.dm_exec_connections AS Conns
INNER JOIN sys.dm_exec_requests AS BlockedReqs
    ON Conns.session_id = BlockedReqs.blocking_session_id
INNER JOIN sys.dm_os_waiting_tasks AS w
    ON BlockedReqs.session_id = w.session_id
CROSS APPLY sys.dm_exec_sql_text(Conns.most_recent_sql_handle) AS Blocker

Información sobre transacciones activas SQL-server

SELECT  L.request_session_id AS SPID,
    DB_NAME(L.resource_database_id) AS DatabaseName,
    O.Name AS LockedObjectName,
    P.object_id AS LockedObjectId,
    L.resource_type AS LockedResource,
    L.request_mode AS LockType,
    ST.text AS SqlStatementText,       
    ES.login_name AS LoginName,
    ES.host_name AS HostName,
    TST.is_user_transaction as IsUserTransaction,
    AT.name as TransactionName,
    CN.auth_scheme as AuthenticationMethod
FROM    sys.dm_tran_locks L
    JOIN sys.partitions P ON P.hobt_id = L.resource_associated_entity_id
    JOIN sys.objects O ON O.object_id = P.object_id
    JOIN sys.dm_exec_sessions ES ON ES.session_id = L.request_session_id
    JOIN sys.dm_tran_session_transactions TST ON ES.session_id = TST.session_id
    JOIN sys.dm_tran_active_transactions AT ON TST.transaction_id = AT.transaction_id
    JOIN sys.dm_exec_connections CN ON CN.session_id = ES.session_id
    CROSS APPLY sys.dm_exec_sql_text(CN.most_recent_sql_handle) AS ST
WHERE   resource_database_id = db_id()
ORDER BY L.request_session_id

Información para análisis de Deaklock Graph XEvent

SELECT XEvent.query('(event/data/value/deadlock)[1]') AS DeadlockGraph
FROM ( SELECT XEvent.query('.') AS XEvent
       FROM ( SELECT CAST(target_data AS XML) AS TargetData
              FROM sys.dm_xe_session_targets st
              JOIN sys.dm_xe_sessions s
              ON s.address = st.event_session_address
              WHERE s.name = 'system_health'
               AND st.target_name = 'ring_buffer'
              ) AS Data
              CROSS APPLY TargetData.nodes
                   ('RingBufferTarget/event[@name="xml_deadlock_report"]')
              AS XEventData ( XEvent )
      ) AS src;

Ultimas select ejecutadas sin necesidad de Profiler

SELECT TOP (50) * 
FROM(SELECT COALESCE(OBJECT_NAME(s2.objectid),'Ad-Hoc') AS ProcName,
 execution_count,s2.objectid,
 (SELECT TOP 1 SUBSTRING(s2.TEXT,statement_start_offset / 2+1 ,
 ( (CASE WHEN statement_end_offset = -1
 THEN (LEN(CONVERT(NVARCHAR(MAX),s2.TEXT)) * 2)
ELSE statement_end_offset END)- statement_start_offset) / 2+1)) AS sql_statement,
 last_execution_time
FROM sys.dm_exec_query_stats AS s1
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2 ) x
WHERE sql_statement NOT like 'SELECT TOP 50 * FROM(SELECT %'
ORDER BY last_execution_time DESC

Ultimas 50 Select más costosas ejecutadas

SELECT TOP (50)
    q.text, s.total_elapsed_time, s.max_elapsed_time, s.min_elapsed_time,
    s.last_elapsed_time, s.execution_count, last_execution_time, *
FROM sys.dm_exec_query_stats as s
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS q
WHERE s.last_execution_time > DateAdd(mi , -1500 , GetDate()) -- solo las recientementes
AND text not like '%sys.%' -- eliminar consulta sys
ORDER BY s.total_elapsed_time DESC

Las 100 Select ejecutadas que consumen más tiempo en segundos

SELECT TOP 100
  qs.total_elapsed_time / qs.execution_count / 1000000.0 AS average_seconds,
  qs.total_elapsed_time / 1000000.0 AS total_seconds,
  qs.execution_count,
  SUBSTRING ( qt.text,qs.statement_start_offset/2,
  ((CASE WHEN qs.statement_end_offset = -1
  THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
  ELSE qs.statement_end_offset
  END ) - qs.statement_start_offset) / 2 ) AS individual_query,
  o.name AS object_name,
  DB_NAME(qt.dbid) AS database_name
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
LEFT OUTER JOIN sys.objects o ON qt.objectid = o.object_id
WHERE qt.dbid = DB_ID()
ORDER BY average_seconds DESC;

Las 25 Select ejecutadas que consumen más IO (logical reads/writes)

SELECT TOP 25
  (total_logical_reads+total_logical_writes) / qs.execution_count AS average_IO,
  (total_logical_reads+total_logical_writes) AS total_IO,
   qs.execution_count AS execution_count,
   SUBSTRING (qt.text,qs.statement_start_offset/2,
   ((CASE WHEN qs.statement_end_offset = -1
   THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
   ELSE qs.statement_end_offset END) - qs.statement_start_offset)/2) AS indivudual_query,
   o.name AS object_name,
   DB_NAME(qt.dbid) AS database_name
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
LEFT OUTER JOIN sys.objects o ON qt.objectid = o.object_id
WHERE qt.dbid = DB_ID()
ORDER BY average_IO DESC;

Los 25 StoredProcs que consumen más IO (total_physical_reads)

SELECT TOP(25) p.name AS [SP Name],qs.total_physical_reads AS [TotalPhysicalReads],
qs.total_physical_reads/qs.execution_count AS [AvgPhysicalReads], qs.execution_count,
qs.total_logical_reads,qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count
AS [avg_elapsed_time], qs.cached_time
FROM sys.procedures AS p WITH (NOLOCK)
INNER JOIN sys.dm_exec_procedure_stats AS qs WITH (NOLOCK)
ON p.[object_id] = qs.[object_id]
WHERE qs.database_id = DB_ID()
AND qs.total_physical_reads > 0
ORDER BY qs.total_physical_reads DESC, qs.total_logical_reads DESC OPTION (RECOMPILE);

Con esto veremos el uso de los indices en nuestra BBDD

SELECT OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME], I.[NAME] AS [INDEX NAME], USER_SEEKS, USER_SCANS, USER_LOOKUPS, USER_UPDATES
FROM SYS.DM_DB_INDEX_USAGE_STATS AS S 
INNER JOIN SYS.INDEXES AS I 
ON I.[OBJECT_ID] = S.[OBJECT_ID] 
AND I.INDEX_ID = S.INDEX_ID
WHERE OBJECTPROPERTY(S.[OBJECT_ID],'IsUserTable') = 1
ORDER BY OBJECT_NAME(S.[OBJECT_ID])

Con esto veremos la memoria RAM que consume cada BBDD

Si lanzamos la query podemos ver el consumo concreto de una base de datos. Y si esta consulta la ejecutamos de forma regular podemos observar si el consumo fluctúa o no.

SELECT database_id, COUNT (*) * 8 / 1024 AS MB_EN_USO 
FROM sys.dm_os_buffer_descriptors
GROUP BY database_id ORDER BY COUNT (*) * 8 / 1024 DESC

Como siempre, espero que os sea de utilidad!!

SqlServer: Buenas practicas en consultas SQL para developers

Si desarrollamos aplicaciones de negocio y empresariales con tecnologías Microsoft y .NET seguramente utilizaremos SQL Server para guardar y recuperar la información desde la base de datos y T-SQL para escribir el codigo.

Ciclo de vida de consultas SQL

Es importante recordar como piensa el motor de SQL Server para ejecutar las consultas,  primero analiza (parse), segundo realiza optimizaciones (optimize) y por ultimo Ejecuta (execute) la consulta:

Si como desarrolladores estáis empezando con este tipo de aplicaciones, el ciclo de vida SQL es fundamental entenderlo para lograr la ejecución más optima posible y obtener el mejor rendimiento, lo más normal, es que a veces se olvide la forma correcta de proceder a la hora de programar los mantenimientos CRUD y acceso a datos para obtener la información y mostrarla en la interfaz de usuario.

El objetivo de este articulo es que sirva de guía de consulta para saber cuales son las mejores practicas cuando trabajamos con consultas SQL desde desarrollo, aunque algunas son muy obvias, no esta de más recordarlas de vez en cuando 🙂

Buenas practicas con consultas SQL

  1. No utilizar SELECT * FROM tabla
  2. No utilizar SQL dinámico en código fuente para evitar SQL injections
  3. No usar subconsultas SELECT col1,col2, SELECT… col3
  4. Evitar subconsultas anidadas SELECT … FROM SELECT…
  5. Evitar el uso de Wilcards en LIKE como «%valor%»
  6. Evitar usar IN es mejor EXISTS.
  7. Evitar usar CURSORES en SQL siempre que sea posible.
  8. Evitar usar TRIGGERS solo como ultimo recurso o para temas puntuales.
  9. Todas las tablas deberian tener una PK con un index de tipo cluster.
  10. Usar CONSTRAINT para mantener la integridad de los datos.
  11. Usar indices en las columnas de búsquedas para mejorar performance.
  12. Usar GROUP BYORDER BY, or DISTINCT en querys solo cuando sea absolutamente necesario
  13. Usar SET NOCOUNT ON con operaciones CRUD para no contar el nº de filas afectadas y ganar rendimiento sobre todo en tablas con muchos registros.

Hasta el próximo post!!

Libro Gratis: SQL Server 2012 R2

sql-server-logo

Nuevo libro gratuito «Introducing Microsoft SQL Server 2012»,  publicado por Microsoft Press para conocer de primera mano la nueva versión de  SQL Server 2012.

El libro esta dividido en esto 10 capítulos (en ingles):

PART I   DATABASE ADMINISTRATION

1.   SQL Server 2012 Editions and Engine Enhancements

2.   High-Availability and Disaster-Recovery Enhancements

3.   Performance and Scalability

4.   Security Enhancements

5.   Programmability and Beyond-Relational Enhancements

PART II   BUSINESS INTELLIGENCE DEVELOPMENT

6.   Integration Services

7.   Data Quality Services

8.   Master Data Services

9.   Analysis Services and PowerPivot

10.   Reporting Services

Descarga Gratis:  Introducing SQL Server 2012 en Pdf

Tutorial de instalación de SQL Server 2008 R2



Desde la web de Microsoft han publicado esta guia de instalación de SQL Server 2008 R2 paso a paso que os dejo comentada aqui, la instalación de SQL Server 2008 R2 es algo en lo que Microsoft como viene siendo habitual, ha puesto un marcado énfasis para producir un sistema claro y sencillo que nos lleve al éxito con un mínimo esfuerzo.

Esta guía de instalación está centrada en el proceso de instalación de nuevas instancias del motor relacional de SQL Server 2008 R2 de una forma gráfica y rápida.

Para el proceso de instalación, si el entorno de producción involucra un Windows Server 2008, y desde las herramientas del propio sistema operativo se han creado las particiones, este apartado no hace falta validarlo puesto que en forma predeterminada realiza un alineamiento de particiones de 1Mb ref: http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/Perf-tun-srv.docx (página 30, sección DISKPART)

Si por el contrario, el entorno de producción involucra un Windows Server 2000 o Windows Server 2003, o el subsistema de discos ha sido particionado bajo las herramientas administrativas de un Sistema Operativo previo, se recomienda realizar un alineamiento de las particiones donde se albergarán los ficheros .mdf y .ldf de las Bases de datos utilizando diskpart.

Contenidos de la guia en castellano

Más informacion (en ingles)

Para ampliar mas detalles del proceso de instalación, se recomienda seguir el artículo oficial de los libros en pantalla de SQL Server 2008 R2 que puede encontrar aquí: http://msdn.microsoft.com/en-us/library/ms143219.aspx

Lanzamiento SQL Server 2008 R2

Ya tenemos fecha de lanzamiento para SQL Server 2008 R2 que Microsoft presentará mediante un Tour Digital en Barcelona 10 de junio y Madrid 14 de junio, ya ha empezado a presentarlo por todo el mundo y en el enlace podeis ver los videos.

La presentación nos hablará de estos temas y podeis verlo en los videos:

  • Plataforma de Aplicaciones de Microsoft con SQL Server 2008 R2
  • Novedades tecnológicas para potenciar la inteligencia de Negocio: PowerPivot, Report Builder y Master Data Management
  • Nuevos servidores HP ProLiant G7: La mejor plataforma para SQL Server 2008 R2.
  • Unisys: Escalabilidad en entornos virtuales de Misión Crítica.
  • Mejoras para administradores de bases de datos: Application y MultiServer Magament, SQL Datacenter, Hyper-v Live Migration, Compresion y Parallel Data Warehouse
  • Soluciones para Optimizar SQL Server con NetApp, SafeNet y EMC
  • SQL Azure: Alta disponibilidad y flexibilidad de los datos en la nube

Ademas, Microsoft han publicado una web para presentar las nuevas carateristicas (en ingles):

What’s New in SQL Server 2008 R2 Editions

Built on SQL Server 2008, SQL Server 2008 R2 delivers higher mission-critical scale, more efficient IT, and expanded reporting and analytics through self-service business intelligence. SQL Server 2008 R2 introduces two new premium editions to meet the needs of large scale datacenters and data warehouses.

  • SQL Server 2008 R2 Datacenter
  • SQL Server 2008 R2 Parallel Data Warehouse

New Premium Editions

Datacenter

Built on SQL Server 2008 R2 Enterprise, SQL Server 2008 R2 Datacenter is designed to deliver a high-performing data platform that provides the highest levels of scalability for large application workloads, virtualization and consolidation, and management for an organization’s database infrastructure. Datacenter helps enable organizations to cost effectively scale their mission-critical environment.

Key features new to Datacenter:

  • Application and Multi-Server Management for enrolling, gaining insights and managing over 25 instances
  • Highest virtualization support for maximum ROI on consolidation and virtualization
  • High-scale complex event processing with SQL Server StreamInsight™
  • Supports more than 8 processors and up to 256 logical processors for highest levels of scale
  • Supports memory limits up to OS maximum

Parallel Data Warehouse

SQL Server 2008 R2 Parallel Data Warehouse is a highly scalable data warehouse appliance-based solution. Parallel Data Warehouse delivers performance at low cost through a massively parallel processing (MPP) architecture and compatibility with hardware partners – scale your data warehouse to tens and hundreds of terabytes.

Key features new to Parallel Data Warehouse:

  • 10s to 100s TBs enabled by MPP architecture
  • Advanced data warehousing capabilities like Star Join Queries and Change Data Capture
  • Integration with SSIS, SSRS, and SSAS
  • Supports industry standard data warehousing hub and spoke architecture and parallel database copy

Investments in Core Editions

SQL Server 2008 R2 Enterprise

SQL Server 2008 R2 Enterprise delivers a comprehensive data platform that provides built-in security, availability, and scale coupled with robust business intelligence offerings—helping enable the highest service levels for mission-critical workloads.

The following capabilities are new to Enterprise:

  • PowerPivot for SharePoint to support the hosting and management of PowerPivot applications in SharePoint
  • Application and Multi-Server Management for enrolling, gaining insights and managing up to  25 instances
  • Master Data Services for data consistency across heterogeneous systems
  • Data Compression now enabled with UCS-2 Unicode support
  • High-scale complex event processing with SQL Server StreamInsight™

SQL Server 2008 R2 Standard

SQL Server 2008 R2 Standard delivers a complete data management and business intelligence platform for departments and small organizations to run their applications—helping enable effective database management with minimal IT resources.

The following capabilities are new to Standard:

  • Backup Compression to reduce data backups by up to 60% and help reduce time spent on backups *
  • Can be managed instance for Application and Multi-Server Management capabilities
  • High-scale complex event processing with SQL Server StreamInsight™

Fuentes: Technet , Microsoft y Tour Digital

Microsoft SQL Server 2008 R2 Libro Gratis

Continuando con los libros gratis, aqui tenies, otro más, sobre SQL Server 2008 R2, tambien publicado por Microsoft, donde nos enseña por un lado la parte de Administracion y por otro la Parte de Business Inteligent.

El libro esta dividido en 10 capitulos:

CHAPTER 1   SQL Server 2008 R2 Editions and Enhancements 3
CHAPTER 2   Multi-Server Administration 21
CHAPTER 3   Data-Tier Applications 41
CHAPTER 4   High Availability and Virtualization Enhancements 63
CHAPTER 5   Consolidation and Monitoring 85

CHAPTER 6   Scalable Data Warehousing 109
CHAPTER 7   Master Data Services 125
CHAPTER 8   Complex Event Processing with StreamInsight 145
CHAPTER 9   Reporting Services Enhancements 165
CHAPTER 10   Self-Service Analysis with PowerPivot 189

Los enlaces para descargar son estos:

Descargar versión PDF

Descargar versión XPS

Que lo disfruteis.