Ok, mi piace mettere il naso dentro SQL Server e questo si sapeva... ;-)
Ora che la nuova versione sta per uscire mi è venuta voglia di (ri)mettere la mani dentro il database di sistema "nascosto" System Resource (per chi non ne conoscesse l'esistenza consiglio di leggere questo mio post di qualche tempo fa).
L'idea è: voglio vedere se e quali differenze ci sono tra il db di SQL Server 2005 SP2 e quello che è attualmente nella CTP 6 di SQL Server 2008 (attenzione: parliamo di CTP non di RTM, quindi le cose potrebbero (potranno?) cambiare in futuro).
- primo step: fermo i servizi dell'istanza SQL 2005 e SQL 2008 e copio i file, rinominandoli a piacere, in una mia dir di lavoro
- faccio ripartire l'istanza 2008 (la 2005 non mi serve) e collego i db appena copiati con un'istruzione simile a:
USE [master]
GO
CREATE DATABASE [myMSSQLSystemResource2005] ON
( FILENAME = N'C:\myFolder\mssqlsystemresource_SQL2005.mdf' ),
( FILENAME = N'C:\myFolder\mssqlsystemresource_SQL2005.ldf' )
FOR ATTACH
GO
CREATE DATABASE [myMSSQLSystemResource2008] ON
( FILENAME = N'C:\myFolder\mssqlsystemresource_SQL2008.mdf' ),
( FILENAME = N'C:\myFolder\mssqlsystemresource_SQL2008.ldf' )
FOR ATTACH
GO
Due prime considerazioni:
1) nella versione 2008 il db ha cambiato la sua location. Non si trova più nella cartella DATA, quella di default per i database, ma si trova nella cartella BINN.
Perchè questa scelta?
Perchè è a tutti gli effetti questo db viene considerato come un contenitore di binari, alla stregua di una DLL (infatti non è possibile vederlo, salvarlo, navigarlo, ...)
2) le dimensioni, ovvero lo storage occupato dalle due versioni è notevolmente diverso (in effetti, qualcosa di nuovo ce lo aspettavamo no? Fosse altro per gestire tutte le nuove caratteristiche, Change Data Capture in primis)
Ora che ho a disposizione i due database, liberamente accessibili dal Management Studio,
voglio, per prima cosa, contare gli oggetti presenti all'interno:
select count(*) from myMSSQLSystemResource2005.INFORMATION_SCHEMA.ROUTINES
select count(*) from myMSSQLSystemResource2008.INFORMATION_SCHEMA.ROUTINES
- SQL Server 2005: 2.180
- SQL Server 2008: 2.411
A questo punto creo due db che possano contenere una semplice tabella dove poter inserire, per ogni oggetto, tipo, schema, nome e script.
use master
go
create database system2005
go
create database system2008
go
use system2005
create table tableDifference
(
_type varchar(100),
_schema varchar(100),
_name varchar(100),
_definition varchar(max)
)
go
use system2008
create table tableDifference
(
_type varchar(100),
_schema varchar(100),
_name varchar(100),
_definition varchar(max)
)
go
Quindi popolo le tabelle con i dati provenienti dalla vista di sistema INFORMATION_SCHEMA.ROUTINES:
-- Inserisco le informazioni di SQL 2008
-- (2.411 righe)
use system2008
go
insert tableDifference
select routine_type, specific_schema, specific_name, routine_definition
from myMSSQLSystemResource2008.INFORMATION_SCHEMA.ROUTINES
-- Inserisco le informazioni di SQL 2005
-- (2.180 righe)
use system2005
go
insert tableDifference
select routine_type, specific_schema, specific_name, routine_definition
from myMSSQLSystemResource2005.INFORMATION_SCHEMA.ROUTINES
A questo punto posso utilizzare un qualsiasi strumento di data compare per fare un raffronto tra le due tabelle dei due database (2005 e 2008) ed analizzare / mettere il naso nei nuovi oggetti e, soprattutto, vedere e capire che cosa è stato modificato rispetto alla versione precedente.
Ad esempio, per la stored procedure di sistema sp_who2:
Una nota di colore: comincio a vedere, qua e là, commenti degli sviluppatori anche divertenti... :-)