siquellando

...scoperte e considerazioni Sql di uno sviluppista
(un po' sviluppatore e un po' sistemista)
La licenza SqlServer consente piu' istanze

Il modello di licenza di Sql2008 rispetto a quello della versione 2005 presenta un interessante modifica: ora anche nella versione Standard (e persino nella Workgroup) si e' autorizzati ad installare piu' istanze sullo stesso server utilizzando un unica licenza.

Infatti il documento recuperabile dalla seguente pagina  http://www.microsoft.com/sqlserver/2008/en/us/licensing-faq.aspx recita:

"Workgroup and Standard editions now allow you to run any number of instances of the server software in one physical or virtual operating system environment on the licensed server at a time. Previously, only the Enterprise edition of the Server license allowed multi-instancing. This is a great incentive for customers to adopt the Server/CAL model."

Personalmente la ritengo una gran bella novita' Drinks

       Franco

Posted: ott 11 2009, 03.49 by orsocurioso | with no comments
Filed under:
Virtual PC che non appare (2° puntata: Vista)

In un precedente post http://community.ugiss.org/blogs/orsocurioso/archive/2008/05/13/virtual-pc-che-non-appare.aspx avevo illustrato come risolvere un fastidioso bug di Virtual PC.

Le cose dette allora valevano per XP, ma se vi trovate su Vista il percorso in cui trovare il file Options.xml cambia ed e' il seguente: C:\Users\__Name_Of_Your_Windows_Account__\AppData\Roaming\Microsoft\Virtual PC

Questo in quanto su Vista il folder C:\Documents and Settings in realta' non esiste, viene visualizzato solo per compatibilita' con le precedenti versioni del S.O., ma non e' accessibile.

Di seguito la corrispondenza tra alcuni folder XP e quelli Vista:


Documents & Settings -> \Users
My Documents -> \Users\youraccount\Documents
My Music -> \Users\youraccount\Music
Application Data -> \Users\youraccount\AppData

Transparent Data Encryption e tempdb

Come e' noto SQL 2008 ha aggiunto (solo nell'edizione Enterprise) la Transparent Data Encryption (TDE) tra le possibilita' a disposizione di chi deve cifrare i dati presenti nel database.

Come spiegato anche da Luca ( http://community.ugiss.org/blogs/lbianchi/archive/2008/06/25/transparent-data-encryption.aspx ) l'attivita' di cifratura e' trasparente alle applicazioni in quanto e' SqlServer che si preoccupa di cifrare i dati all'atto della scrittura su disco e di decifrarle nel momento che vengono caricati in memoria.

Ovviamente l'attivita' continua di encryption aggiunge un carico di lavoro che va tenuto presente nel momento che scegliamo di utilizzare tale feature. A questo proposito si puo' essere indotti a pensare che il sovraccarico di lavoro di CPU sia generato solamente dalle query che utilizzano il database protetto tramite TDE... Ma non e' cosi' Surprise

Se tra i database dell'istanza ve ne e' almeno uno con il TDE abilitato allora viene criptato anche il tempdb e questo significa che tutte le operazioni che coinvolgono il tempdb genereranno un attivita' di encryption, anche se il database oggetto di query non e' cifrato... Basta saperlo Wink

Limitare i permessi solo ad uno schema

Una volta fatto si dimostra ovvio e banale, ma siccome ci ho messo un po' di tempo per trovare come fare... Lo posto caso mai possa servire a qualcun altro.

La funzionalita' da implementare e' la seguente: su un database Sql2005 poter consentire ad alcuni utenti il pieno controllo su uno schema, inclusa la creazione, e la modifica delle tabelle, mentre sugli oggetti degli altri schema non devono poter operare in alcun modo (neanche leggere).

La soluzione consiste nel non assegnare all'utente alcun ruolo e dargli esplicitamente (tramite grant) il controllo dello schema su cui possono operare.

Supponendo che lo user alfa debba poter agire indisturbato solo sullo schema A1, le istruzioni saranno:

-- tolgo l'user da tutti i ruoli

exec sp_droprolemember 'db_owner', 'alfa'

exec sp_droprolemember 'db_accessadmin', 'alfa'

exec sp_droprolemember 'db_backupoperator', 'alfa'

exec sp_droprolemember 'db_datareader', 'alfa'

exec sp_droprolemember 'db_datawriter', 'alfa'

exec sp_droprolemember 'db_ddladmin', 'alfa'

exec sp_droprolemember 'db_securityadmin', 'alfa'

-- gli do' pieni diritti sullo schema A1

GRANT CONTROL ON SCHEMA::A1 TO Alfa ;

Il potere delle istanze di SqlServer (off topics, forse)

Non sapevo bene come titolare questo post... Ma sento che devo rendere pubblica 'sta cosa.. Ieri sono stato in un azienda che affida a SqlServer anche la possibilita' di uscire dalla stanza Surprise

Funziona cosi': sei in ufficio, devi uscire, la porta e' chiusa, passi il badget, i dati vengono letti e spediti ad un istanza SqlServer che registra le informazioni su un db e, dopo da il consenso all'apertura ... MICIDIALE !!

Non avevo mai visto una cosa simile... Credo sia il punto piu' alto di sqlcontrollo in cui mi sono imbattuto.. Pensa se ti "scappa" e la query va in deadlock !!! Big Smile

O, ragazzi, guardate che questo e' vero SQLPower ...

SQL Server® 2008 T-SQL Fundamentals (ITZIK)

Sto leggendo l'ultimo libro pubblicato di Itzik "SQL Server 2008 T-SQL Fundamentals ( http://www.amazon.com/Microsoft%C2%AE-Server%C2%AE-T-SQL-Fundamentals-PRO-Developer/dp/0735626014/ref=pd_bbs_sr_1?ie=UTF8&s=books&qid=1226247770&sr=8-1 ) e lo consiglio davvero !!

Rispetto ai suoi precedenti libri questo e' piu' semplice (come e' giusto che sia visto il titolo "Fundamentals"), ma cio' non toglie nulla al valore del libro che e' di una chiarezza esemplare oltre che di altissimo rigore.

E' basato sulla versione 2008, ma la quasi totalita' delle informazioni, degli esempi e dei concetti espressi sono validi anche per le precedenti release di Sql Server.

Colma un vuoto che finora avevo riscontrato nell'editoria: non c'era un libro valido che si ponesse sopra i manuali eccessivamente elementari e inutili Wink  e i molti testi ricchi di internals, interessantissimi, ma poco adatti a chi sta facendosi le osse.

Beh adesso, grazie ad Itzik, questo spazio e' stato colmato.

Lo raccomamdo a tutti e, per quanto mi riguarda, e' senz'altro il testo che d'ora in avanti consisgliero' a chi vuole seriamente approcciare ed approfondire TSql.

   Franco 

 

Libro High Availability

Che gli scenari di disaster recovery (ed alta disponibilita') mi interessino credo risulti chiaro dagli argomenti piu' gettonati dei miei post... Smile

In questi giorni sto' leggendo un libro relativamente a questi argomenti che trovo fatto bene e piuttosto utile, anche se poteva risparmiarsi un bel po' di pagine di screen shot di SSMS.

Pertanto lo consiglio.

"Pro Sql Server 2005 High Availability" di Allan Hirt, Apress editore.

http://www.amazon.com/Pro-Server-2005-High-Availability/dp/159059780X/ref=sr_1_7?ie=UTF8&s=books&qid=1220916185&sr=8-7

Buona lettura.

 

 

Copiare anche l'intestazione delle colonne da SSMS

Non so a voi, ma e' capitato un bel po' di volte di fare un veloce "copia - incolla" della griglia dei risultati di una query per metterla in excel e, con tristezza, non mi metteva mai il nome dei campi Sad

La conseguenza e' che il veloce "copia - incolla" diventa un lento scrivi (sbagliando) i nomi delle colonne... ARRGH!

Beh, oggi sono incappato in questo post  http://www.sqlservercentral.com/articles/SQL+Server+2005/63184/  che mi ha dato una soluzione semplice semplice.. ovvero settare la relativa opzione nella finestra di settaggio di Sql Server Management Studio.... Ma perche' non ci ho pensato prima ??!!?? Embarrassed

Per chi non vuole andare al post la soluzione e':

Aprire la finestra dell'opzione voluta (Tools - Options -Query Results - Sql Server - Results to grid) e flaggare "Include colums headers when copyng or saving the results"

Facile no ?

 

 

Piccoli cambiamenti al backup-restore in Sql2008

Oltre alle grosse, e piu' volte citate, novita' che Sql2008 porta al backup (compressione, encryption) ci sono altri piccoli cambiamenti che puo' essere utile segnalare.

 

Una prima modifica la troviamo nell'istruzione BACKUP LOG da cui e' stata "finalmente"  eliminata l'opzione TRUNCATE_ONLY, il cui uso era gia' deprecato in Sql2005.

Infatti ora, se nel backup viene specificata l'opzione TRUNCATE_ONLY, Sql Server risponde con il seguente errore:

Per cui adesso (come gia' bisognava fare in Sql2005) per  effettuare un truncate del log senza backupparlo (ma siamo sicuri di cio' che stiamo facendo ?? Huh? ) dobbiamo portare il recovery model a SIMPLE, e poi eventualmente riportarlo a FULL.

 

Proseguiamo...

Gli amanti dell'interfaccia grafica adesso trovano, all'interno della finestra di back up, l'opzione per effettuare il COPY_ONLY, ovvero per effettuare un backup del database senza interrompere la catena dei log files di restore.

(per chi si fosse perso le puntate sul COPY_ONLY alcune info su questo argomento le trovate qui http://community.ugiss.org/blogs/sgainz/archive/2007/07/25/a-proposito-di-backup-e-restore.aspx )

 L'opzione la trovate nel riquadro rosso di questo screen shot

 

 

E, sempre all'interno del SqlServer Management Studio, tra le opzioni del backup e' stata aggiunta quella relativa al Tail-Log backup, ovvero al backup del Transaction Log lasciando il database in stato di recovery.

L'opzione la vedete, sullo screen shot che segue, nel riquadro rosso,

 

 

E con queste ulteriori aggiunte neanche i fanatici del tutto guidato hanno piu' scampo dal lavorare bene Big Smile

Posted: ago 23 2008, 04.26 by orsocurioso | with no comments
Filed under: ,
Elenco build Sql2005

Segnalo che sul "sempre ottimo" sito http://www.sqlservercentral.com/ ieri e' stato pubblicato un elenco delle build di Sql 2005, una di quelle cose che, quando ne ho bisogno, non ricordo mai dove trovare Sad

L'elenco lo trovate qui: http://www.sqlservercentral.com/articles/Administration/2960/

 

Feature "SAS like" in Sql2008

Buone news per i Sassisti in ascolto che lavorano in SqlServer: nella versione Sql2008 saranno presenti due funzionalita' che ricordano molto da vicino cio' che si ha (da illore tempo) a disposizione in SAS.

Mi riferisco allo statement MERGE che consente, in un singola operazione atomica, di effettuare Insert, Delete ed Update su una tabella target sulla base dei dati presenti in una tabella source.

E' qualcosa che consente facilmente in Sql di effettuare quelle operazioni di aggiornamento che si fanno in un data step SAS  con lo statement merge [stesso nome, appunto Smile] e l'opzione IN dei dataset.

Ecco un esempio di come aggiornare le informazioni presenti nella tabella Attivita sulla base di quelle presenti nella tabella UpdAttivita

/* setup test */
use tempdb
go


create table dbo.Attivita (Id int, Label varchar(20),Durata int);
go
create table dbo.UpdAttivita (Id int, Label varchar(20),Durata int);
go

insert into dbo.Attivita values (1,'Alfa',120),(2,'Beta',200),(3,'Gamma',80);

insert into dbo.UpdAttivita values (4,'Echo',10),(2,'Beta',210),(3,'GammaNew',801);


/* applico le variazioni */
merge into dbo.Attivita AS TGT
 using dbo.UpdAttivita AS SRC
 
 on TGT.id = SRC.id

when MATCHED then

  update set
    TGT.label = SRC.label,
    TGT.durata = SRC.durata

when NOT MATCHED then

  insert (id, label, durata)
  values (SRC.id, SRC.label, SRC.durata)

when SOURCE NOT MATCHED then
 delete
;

/* verifica */
select * from dbo.Attivita;

 Per i curiosi in SAS, in questo caso, bastava scrivere:

data Attivita;

merge Attivita (in=a) UpdAttivita(in=b);

by Id;

if a and not b then delete;

run;

 Che in effetti e' un po' piu' compatto Stick out tongue

 

L'altra funzionalita' introdotta e' quella dei GROUPING SETS che ci fanno ritrovare praticamente "pari pari" la Proc Summary all'interno di SqlServer.

Appoggiandosi a tale funzionalita' possiamo ottenere, con un unica query, piu' raggruppamenti, uno per ogni combinazione dei campi indicati nell'istruzione  Grouping Sets del Group By che diviene l'equivalente dell'istruzione CLASS della Proc Summary.

Ad esempio se volessimo, in un colpo solo, la somma delle vendite della tabella Vendite sia per IdProdotto che per PuntoVendita insieme alle somme per ogni combinazione di PuntoVendita e IdProdotto ed anche il Totalone con i Grouping Sets possiamo scrivere:

use tempdb
go

-- creazione tabella di esempio
if OBJECT_ID ('dbo.Vendite') is not null drop table dbo.Vendite;

create table dbo.Vendite (
 PuntoVendita varchar(20),
 IdProdotto  int,
 Quantita  int
 );
go

-- inserimento dati esempio
insert into dbo.Vendite (PuntoVendita,IdProdotto,Quantita)
Values
('Milano',1,120),
('Milano',2,124),
('Milano',3,210),
('Roma',1,300),
('Roma',2,155),
('Roma',3,38),
('Napoli',2,35)
;

/* calcolo i vari totali */


select  PuntoVendita, IdProdotto, SUM(Quantita) as Quantita
 from dbo.Vendite
 group by
 GROUPING Sets(
 (),
 (PuntoVendita ),
 (IdProdotto),
 (PuntoVendita,IdProdotto )
 )
 order by PuntoVendita , IdProdotto
 ;

Per gli interessati l'equivalente SAS sarebbe:

proc Summary data = Vendite print sum;

var Quantita;

class PuntoVendita  IdProdotto ;

run;

 

Mi piacciono, si mi piacciono veramente molto queste nuove possibilita' di Sql2008 Drinks


 

Posted: giu 26 2008, 01.58 by orsocurioso | with no comments
Filed under: ,
Virtual PC che non appare

Ieri ho litigato con Virtual PC (versione 6.0) che, senza una ragione apparente, non presentava piu' la finestra di console: l'icona stava "comodamente" funzionante nella system tray, ma se cliccavo due volte o chiedevo di vedere la console... Nisba Sad 

Roba da non crederci!!

Dopo un po' di fatica (e la solita mezz'ora buttata) con santo Google la soluzione mi e' stata fornita da questo post http://marcellotonarelli.wordpress.com/2007/06/02/show-microsoft-virtual-pc-2007-console/ di Marcello Tonarelli (GRAZIE).

Pari pari dal suo blog riporto la soluzione al fastidioso problema:

Dare un occhio al file di configurazione

C:\Documents and Settings\__Name_Of_Your_Windows_Account__\Application\Data\Microsoft\Virtual PC\Options.xml

e verificare che i valori delle dimensioni e della posizione per la sezione <console> "abbiano senso" (io mi ritrovavo la left e right position con valori stellari invece di un sano 0).

Buoni valori sono ad esempio:

<console>
<height type=”integer”>575</height>
<left_position type=”integer”>0</left_position>
<top_position type=”integer”>0</top_position>
<visible type=”boolean”>true</visible>
<width type=”integer”>359</width>
</console>

 

Morale (la solita):

in rete c'e' un mucchio di gente che ti da una mano e ci consente di sopravvivere con le bizze  del software Smile

 

 

Posted: mag 13 2008, 06.50 by orsocurioso | with 1 comment(s)
Filed under:
Nested Transition ... attenzione, non ci sono

In questi giorni parlando con vari utenti ho realizzato che, a volte, c'e' un po' di confusione in merito alla possibilita' di avere transazioni annidate in Sql Server.

Forse vale la pena di fare un po' di chiarezza: SqlServer NON supporta "Transazioni Annidate".

In altre parole per ciascuna connessione puo' esistere solo una transazione attiva.

E il fatto che sia possibile (almeno sintatticamente) sottomettere piu' statement BEGIN TRANSACTION complica e confonde le cose Huh?

In realta' ogni volta che viene sottomesso un BEGIN TRAN SqlServer semplicemente incrementa un contatore interno il cui valore e' recuperabile con una select sulla funzione @@trancount.

Ad ogni commit il valore di @@trancount diminuisce di un unita' e solo l'ultimo commit (che riporta @@trancount a zero) committa realmente la transazione.

In compenso qualunque rollback provoca l'annullamento di tutte le operazioni a partire dal primo begin tran (ovvero viene annullata la transazione piu' esterna).

Pertanto sottomettendo il seguente codice:

begin tran;

insert into Test values (1);

begin tran;

insert into Test values (2);

- rolback di tutto (anche l'insert col valore 1)

rollback;

-- questo commit da errore: la transazione e' chiusa

commit;

Nella tabella Test non verra' inserito alcun valore, in quanto il primo rollback cancella tutte le attivita' iniziate con la transazione piu' esterna.

 

Inoltre, per committare davvero, bisogna prestare attenzione a sottomettere un numero di COMMIT uguale al numero di BEGIN TRAN  (@@trancount) altrimenti si rischia di lasciare aperta la transazione con tutti i pericoli di lock che seguono. 

 

Attenzione che ci sono situazioni (ad esempio se l'utente ha dato un cancel) in cui, anche se viene generato un errore, non viene chiusa la transazione Surprise  Pertanto e' buona norma verificare se ci sono transazioni attive prima di risottomettere nuovamente un BEGIN TRAN e trovarsi con qualche "parentesi non chiusa" Smile

 

Sql 2008 le mie Top 5 +1

Mi accodo anch'io al post di Andrea e riporto la mia top five: forse non sono le novita' piu' eclatanti, ma ripensando alla mia attivita' in Sql degli ultimi tempi quelle che seguono sono le cose che piu' mi mancavano...

  1. Statement MERGE
  2. Date & Time datatypes
  3. Table-Valued parameters
  4. Grouping Sets
  5. Transparent Data Encryption

e la 5 + 1 e' il Change Data Capture

e la 6 +1 e' il Resource Governor ... e la 7 +1 ... Big Smile

 

Nuovo sito dedicato a Sql

Come comunicato nel blog della Delaney http://sqlblog.com/blogs/kalen_delaney/archive/2008/01/19/did-you-know-a-terrific-new-community-website.aspx in rete e' nato un nuovo sito dedicato a risorse tips & tricks per Sql Server.

Il sito e' questo: http://www.sqlcommunity.com

Da un primo occhio mi sembra valido, vediamo se col tempo manterra' le promesse.

Posted: gen 23 2008, 04.46 by orsocurioso | with 2 comment(s)
Filed under:
More Posts Next page »