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.