Press "Enter" to skip to content

1 – SQL Server Nozioni base

Come si crea un database in SQL Server 2005 usando solo il codice SQL, come usare le opzioni che abbiamo già visto da SQL Management Studio, qual’è il loro uso e quali sono i motivi per sceglierle.

Usare solo codice SQL

SQL Significa Structured Query Language, ovvero linguaggio strutturato per le interrogazioni, ma ovviamente creare database, tabelle, vincoli, indici, viste, stored procedure, user defined function non può essere qualcosa legato solo ad una interfaccia programmatica come SQL Management Studio, pertanto in SQL una parte del linguaggio detta DDL (Data Definition Language) Permette di generare i database e ciò che contengono. Il DDL ha alcune porzioni standard, ma ovviamente essendo legato all’ RDBMS per cui è progettato, ve ne sono vari dialetti, quello che noi usiamo è valido per SQL Server, probabilmente per Oracle è simile ma ha parametri personalizzati, simile sarà anche quello di altri RDBMS come Informix oppure DB2 ecc.

L’equivalente della generazione del database preoccupandoci di dare solo il nome allo stesso in codice SQL è ottenuta eseguendo la seguente Query:

CREATE DATABASE [goofy]

Altrettanto semplice è cancellare un database.

DROP DATABASE [goofy]

Attenzione che non sono richieste conferme e tutto sparisce senza rimedio. Fortunatamente, per esegire questo tipo di script è necessario che l’utente appartenga al gruppo dei Sysadmin di SQL Server, pertanto, se sappiamo fare il nostro lavoro, i normali utenti non potranno mai usare simili script.

Possiamo verificare se il database esiste prima di crearlo:

IF NOT EXISTS 
    (SELECT * FROM sys.databases 
        WHERE name = 'goofy')
    BEGIN
        CREATE DATABASE [goofy]
        PRINT 'Il database goofy è stato generato con successo'
    END
ELSE
    PRINT 'Il database goofy esiste già!'

Questa query così come CREATE DATABASE o DROP DATABASE vanno eseguite sul database Master, che tiene nota di tutti gli oggetti database creati in SQL Server (oltre a memorizzare molte altre informazioni strutturali sull’installazione di SQL Server). La vista di sistema sys.databases fornisce la lista di tutti i database che sono ospitati dal server RDBMS. Se siete curiosi e vi guardate dentro, troverete tutte le informazioni che abbiamo visto nella maschera di creazione database oltre ad una serie di altre informazioni tecniche.

Tutte le informazioni che abbiamo visto nella maschera di generazione database, possono essere specificate anche in SQL, vediamo come:

USE [master]
GO
CREATE DATABASE [goofy] 
    ON  PRIMARY 
    ( NAME = N'goofy'
    , FILENAME = N'D:\sql.dir\data\goofy.mdf' 
    , SIZE = 5MB 
    , MAXSIZE = 10000MB
    , FILEGROWTH = 10MB )
LOG ON 
    ( NAME = N'goofy_log'
    , FILENAME = N'D:\sql.dir\data\goofy_log.LDF' 
    , SIZE = 2MB 
    , MAXSIZE = 5000MB 
    , FILEGROWTH = 10%)
COLLATE Latin1_General_CI_AS
GO

EXEC dbo.sp_dbcmptlevel @dbname=N'goofy', @new_cmptlevel=90
GO
ALTER DATABASE [goofy] SET RECOVERY FULL 
GO
ALTER DATABASE [goofy] SET  MULTI_USER 
GO

Come possiamo vedere nello script, possiamo specificare:

  • ON PRIMARY, indica qual’è il filegroup in cui inserire il file dati creato.
  • Nome logico del database e del file di log (parametro NAME)
  • Path completo del file di database e del file di log (parametro FILENAME)
  • La dimensione iniziale  (parametro SIZE) che ammette varie unità di misura fra cui KB=Kilobyte, MB=Megabyte, GB=Gigabyte.
  • La dimensione massima ammissibile (parametro MAXSIZE) con la possibilità di specificare UNLIMITED se non si vuole mettere limiti alla dimensione, tenendo conto delle eventuali controindicazioni.
  • Il metodo di crescita automatica (parametro FILEGROWTH) che può essere in valore (KB,MB,GB) o in percentuale.
  • COLLATE indica qual’è il tipo di organizzazione è usata per l’ordinamento e la comparazione delle stringhe, in questo caso Lettere e numeri Latini, Generico, Case Insensitive, Accent Sensitive.

La prima porzione dello script, che va  fino al primo GO termina qui, vi sono poi altri 3 comandi, ciascuno con un GO singolo perché si tratta di operazioni che non possono essere eseguite in un unica query.

  • L’esecuzione di sp_dbcmptlevel serve a indicare il livello di compatibilità, sostituisce la combobox sulla finestra opzioni.
  • SET RECOVERY indica al database il tipo di recovery model (Full, Simple, Bulk Logged).
  • SET MULTI_USER, indica che il database è operativo, si potrebbe usare il SINGLE_USER in caso di operazioni di straordinaria manutenzione per impedire agli utenti di cercare di accedere al database.

Tutti gli script, di creazione database, come già detto, devono essere eseguiti sul database Master e l’utente che li esegue deve appartenere al ruolo Server di SYSAdmin, oppure DBCreator. Attenzione che i diritti amministrativi su SQL Server non sono la stessa cosa dei diritti amministrativi su WINDOWS, se non per alcuni particolari utenti.

Prendete nota, del fatto che è VIETATISSIMO dare agli utenti che utilizzano un database il ruolo di Sysadmin, tanto quanto è VIETATISSIMO togliere la password all’utente SA o utilizzarlo come utente per far connettere una vostra applicazione.

Tabella delle collation standard

Siccome non è facile trovarla nei meandri della documentazione di SQL Server, riporto la lista delle collation che possono essere utilizzate in SQL Server, ovunque si possa utilizzare il comando COLLATE. La prima tabella indica alcune collation che sono state modificate recentemente.

Old collation name New collation name
Japanese Japanese_901
Chinese Chinese_PRC_90
Chinese_PRC_Stroke Chinese_PRC_Stroke_90
Chinese_Taiwan_Bopomofo Chinese_Taiwan_Bopomofo_90
Chinese_Taiwan_Stroke Chinese_Taiwan_Stroke_90
Korean Korean_90
Hindi (deprecated in this release) Indic_General_90_CI_AS (Unicode only)

 

Windows System Locale LCID (Locale ID) Default SQL Collation Code page
Afrikaans 0x436 Latin1_General_CI_AS 1252
Albanian 0x41c Albanian_CI_AS 1250
Arabic (Algeria) 0x1401 Arabic_CI_AS 1256
Arabic (Bahrain) 0x3c01 Arabic_CI_AS 1256
Arabic (Egypt) 0xc01 Arabic_CI_AS 1256
Arabic (Iraq) 0x801 Arabic_CI_AS 1256
Arabic (Jordan) 0x2c01 Arabic_CI_AS 1256
Arabic (Kuwait) 0x3401 Arabic_CI_AS 1256
Arabic (Lebanon) 0x3001 Arabic_CI_AS 1256
Arabic (Libya) 0x1001 Arabic_CI_AS 1256
Arabic (Morocco) 0x1801 Arabic_CI_AS 1256
Arabic (Oman) 0x2001 Arabic_CI_AS 1256
Arabic (Qatar) 0x4001 Arabic_CI_AS 1256
Arabic (Saudi Arabia) 0x401 Arabic_CI_AS 1256
Arabic (Syria) 0x2801 Arabic_CI_AS 1256
Arabic (Tunisia) 0x1c01 Arabic_CI_AS 1256
Arabic (U.A.E.) 0x3801 Arabic_CI_AS 1256
Arabic (Yemen) 0x2401 Arabic_CI_AS 1256
Armenian (Republic of Armenia) 0x42b Latin1_General_CI_AS Unicode
Azeri-Cyrillic (Azerbaijan)1 0x82c Azeri_Cyrillic_90_CI_AS 1251
Azeri-Latin (Azerbaijan)1 0x42c Azeri_Latin_90_CI_AS 1254
Basque 0x42d Latin1_General_CI_AS 1252
Belarusian 0x423 Cyrillic_General_CI_AS 1251
Bulgarian 0x402 Cyrillic_General_CI_AS 1251
Catalan 0x403 Latin1_General_CI_AS 1252
Chinese (Hong Kong S.A.R.)1 0xc04 Chinese_Hong_Kong_Stroke_90_CI_AS 950
Chinese (Macau S.A.R.)2 0x1404 Chinese_PRC_90_CI_AS 950
Chinese (PRC)2 0x804 Chinese_PRC_CI_AS 936
Chinese (PRC) 0x20804 Chinese_PRC_Stroke_CI_AS 936
Chinese (Singapore) 0x1004 Chinese_PRC_90_CI_AS 936
Chinese (Taiwan) 0x404 Chinese_Taiwan_Stroke_CI_AS 950
Chinese (Taiwan) 0x30404 Chinese_Taiwan_Bopomofo_CI_AS 950
Croatian 0x41a Croatian_CI_AS 1250
Czech 0x405 Czech_CI_AS 1250
Danish 0x406 Danish_Norwegian_CI_AS 1252
Divehi1 0x465 Divehi_90_CI_AS (Unicode only) Unicode
Dutch (Belgium) 0x813 Latin1_General_CI_AS 1252
Dutch (Netherlands) 0x413 Latin1_General_CI_AS 1252
English (Australia) 0xc09 Latin1_General_CI_AS 1252
English (Belize) 0x2809 Latin1_General_CI_AS 1252
English (Canada) 0x1009 Latin1_General_CI_AS 1252
English (Caribbean) 0x2409 Latin1_General_CI_AS 1252
English (Hong Kong S.A.R.) 0x3c09 Latin1_General_CI_AS 1252
English (India) 0x4009 Latin1_General_CI_AS 1252
English (Indonesia) 0x3809 Latin1_General_CI_AS 1252
English (Ireland) 0x1809 Latin1_General_CI_AS 1252
English (Jamaica) 0x2009 Latin1_General_CI_AS 1252
English (Malaysia) 0x4409 Latin1_General_CI_AS 1252
English (New Zealand) 0x1409 Latin1_General_CI_AS 1252
English (Philippines) 0x3409 Latin1_General_CI_AS 1252
English (Singapore) 0x4809 Latin1_General_CI_AS 1252
English (South Africa) 0x1c09 Latin1_General_CI_AS 1252
English (Trinidad) 0x2c09 Latin1_General_CI_AS 1252
English (United Kingdom) 0x809 Latin1_General_CI_AS 1252
English (United States) 0x409 SQL_Latin1_General_CP1_CI_AS 1252
English (Zimbabwe) 0x3009 Latin1_General_CI_AS 1252
Estonian 0x425 Estonian_CI_AS 1257
Faeroese 0x438 Latin1_General_CI_AS 1252
Farsi 0x429 Arabic_CI_AS 1256
Finnish 0x40b Finnish_Swedish_CI_AS 1252
French (Belgium) 0x80c French_CI_AS 1252
French (Canada) 0xc0c French_CI_AS 1252
French (France) 0x40c French_CI_AS 1252
French (Luxembourg) 0x140c French_CI_AS 1252
French (Monaco) 0x180c French_CI_AS 1252
French (Switzerland) 0x100c French_CI_AS 1252
Galician (Spain) 0x456 Latin1_General_CI_AS 1252
Georgian 0x437 Latin1_General_CI_AS Unicode
German (Austria) 0xc07 Latin1_General_CI_AS 1252
German (Germany) 0x407 Latin1_General_CI_AS 1252
German (Liechtenstein) 0x1407 Latin1_General_CI_AS 1252
German (Luxembourg) 0x1007 Latin1_General_CI_AS 1252
German (Phone Book Sort) 0x10407 German_PhoneBook_CI_AS 1252
German (Switzerland) 0x807 Latin1_General_CI_AS 1252
Greek 0x408 Greek_CI_AS 1253
Gujarati (India)3 0x447 Indic_General_90_CI_AS (Unicode only) Unicode
Hebrew 0x40d Hebrew_CI_AS 1255
Hindi3 0x0439 Indic_General_90_CI_AS (Unicode only) Unicode
Hungarian 0x40e Hungarian_CI_AS 1250
Hungarian (Technical) 0x104e Hungarian_Technical_CI_AS 1250
Icelandic 0x40f Icelandic_CI_AS 1252
Indonesian 0x421 Latin1_General_CI_AS 1252
Italian (Italy) 0x410 Latin1_General_CI_AS 1252
Italian (Switzerland) 0x810 Latin1_General_CI_AS 1252
Japanese 0x411 Japanese_CI_AS 932
       
Kannada (India)3 0x44b Indic_General_90_CI_AS (Unicode only) Unicode
Kazakh (Kazakstan)1 0x43f Kazakh_90_CI_AS 1251
Konkani (India)3 0x457 Indic_General_90_CI_AS (Unicode only) Unicode
Korean (Extended Wansung) 0x0412 Korean_Wansung_CI_AS 949
Kyrgyz-Cyrillic (Republic of Kyrgyztan) 0x440 Cyrillic_General_CI_AS 1251
Latvian 0x426 Latvian_CI_AS 1257
Lithuanian 0x427 Lithuanian_CI_AS 1257
Macedonian (FYROM) 0x42f Macedonian_FYROM_90_CI_AS 1251
Malay (Brunei Darussalam) 0x83e Latin1_General_CI_AS 1252
Malay (Malaysia) 0x43e Latin1_General_CI_AS 1252
Marathi (India)3 0x44e Indic_General_90_CI_AS (Unicode only) Unicode
Mongolian-Cyrillic (Mongolia) 0x450 Cyrillic_General_CI_AS 1251
Norwegian (Bokmal) 0x414 Danish_Norwegian_CI_AS 1252
Norwegian (Nynorsk) 0x814 Danish_Norwegian_CI_AS 1252
Polish 0x415 Polish_CI_AS 1250
Portuguese (Brazil) 0x416 Latin1_General_CI_AS 1252
Portuguese (Portugal) 0x816 Latin1_General_CI_AS 1252
Punjab-Gurmuhki (India)3 0x446 Indic_General_90_CI_AS (Unicode only) Unicode
Romanian 0x418 Romanian_CI_AS 1250
Russian 0x419 Cyrillic_General_CI_AS 1251
Sanskrit (India)3 0x44f Indic_General_90_CI_AS (Unicode only) Unicode
Serbian (Cyrillic) 0xc1a Cyrillic_General_CI_AS 1251
Serbian (Latin) 0x81a Cyrillic_General_CI_AS 1250
Slovak 0x41b Slovak_CI_AS 1250
Slovenian 0x424 Slovenian_CI_AS 1250
Spanish (Argentina) 0x2c0a Modern_Spanish_CI_AS 1252
Spanish (Bolivia) 0x400a Modern_Spanish_CI_AS 1252
Spanish (Chile) 0x340a Modern_Spanish_CI_AS 1252
Spanish (Colombia) 0x240a Modern_Spanish_CI_AS 1252
Spanish (Costa Rica) 0x140a Modern_Spanish_CI_AS 1252
Spanish (Dominican Republic) 0x1c0a Modern_Spanish_CI_AS 1252
Spanish (Ecuador) 0x300a Modern_Spanish_CI_AS 1252
Spanish (El Salvador) 0x440a Modern_Spanish_CI_AS 1252
Spanish (Guatemala) 0x100a Modern_Spanish_CI_AS 1252
Spanish (Honduras) 0x480a Modern_Spanish_CI_AS 1252
Spanish (International Sort) 0xc0a Modern_Spanish_CI_AS 1252
Spanish (Mexico) 0x80a Modern_Spanish_CI_AS 1252
Spanish (Nicaragua) 0x4c0a Modern_Spanish_CI_AS 1252
Spanish (Panama) 0x180a Modern_Spanish_CI_AS 1252
Spanish (Paraguay) 0x3c0a Modern_Spanish_CI_AS 1252
Spanish (Peru) 0x280a Modern_Spanish_CI_AS 1252
Spanish (Puerto Rico) 0x500a Modern_Spanish_CI_AS 1252
Spanish (Traditional Sort) 0x40a Traditional_Spanish_CI_AS 1252
Spanish (Uruguay) 0x380a Modern_Spanish_CI_AS 1252
Spanish (Venezuela) 0x200a Modern_Spanish_CI_AS 1252
Swahili 0x441 Latin1_General_CI_AS 1252
Swedish 0x41d Finnish_Swedish_CI_AS 1252
Swedish (Finland) 0x81d Finnish_Swedish_CI_AS 1252
Syriac (Syria)1 0x45a Syriac_90_CI_AS (Unicode only) Unicode
Tamil (India)1 0x449 Indic_General_90_CI_AS (Unicode only) Unicode
Tatar (Tatarstan)1 0x444 Tatar_90_CI_AS 1251
Telugu (India)1 0x44a Indic_General_90_CI_AS (Unicode only) Unicode
Thai 0x41e Thai_CI_AS 874
Turkish 0x41f Turkish_CI_AS 1254
Ukrainian 0x422 Ukrainian_CI_AS 1251
Urdu 0x420 Arabic_CI_AS 1256
Uzbek (Latin)1 0x443 Uzbek_Latin_90_CI_AS 1254
Uzbek-Cyrillic (Republic of Uzbeckistan) 0x843 Cyrillic_General_CI_AS 1251
Vietnamese 0x42a Vietnamese_CI_AS 1258

 

Conclusioni

In questo breve articolo abbiamo presentato la creazione di un database SQL Server cercando di mostrare a coloro che stanno iniziando ad usarlo che non è uno strumento banale ma anche che è necessario porsi delle domande precise sullo scenario dell’applicazione quando si crea delle basi dati e i programmi che le utilizzeranno.

Proseguiremo le nozioni di base su SQL Server nella prossima puntata parlando di come generare le tabelle di un database.

Per Vedere come creare il Database da SQL Management studio, potete leggere la prima parte di questo articolo disponibile QUI

Per qualsiasi Feedback, Ulteriore domanda, Chiarimento, oppure se trovate qualche errore usate direttamente il form dei commenti in calce a questo articolo.