SQL

Generalităţi, documentaţie

Ce este: SQL
Documentaţie SQL: Microsoft
Documentaţie SQL: Oracle

Programe, unelte, servicii

Microsoft SQL Server Management Studio
Microsoft SQL Operations Studio
Modelarea bazelor de date: ERM.
Optimizarea interogărilor: Plan Explorer, Paste The Plan.
Amazon RDS: SQL Server.

Materiale on-line

Cursuri de SQL (free):
MVA

Varii tutoriale/articole:
DBDebunk Fabian Pascal.
ORM Terry Halpin.
SQLServer Pro.
SQLAuthority Pinal Dave.
SimpleTalk SQL.
FunctionX SQL Server 2012.
SQL Coffee.
T-SQL Tuesdays.
SQL ServerCentral.com.

Teorii

Normalizarea bazelor de date:
A relational model of data for large shared data banks: Edgar F. Codd (pdf).
A simple guide to five normal forms in relational database theory: William Kent.
Primele trei forme normale: Microsoft.

The third manifesto:
C.J. Date, Hugh Darwen: TTM.
RelDB: Dave Voorhis.

Script-uri de administrare

Manevre cu serviciile SQL, folosind PowerShell:

Descărcaţi codulPentru vizualizare, folosiţi scrollbar-ul din josul blocului de cod.
<#
    Manevre cu serviciile Microsoft SQL (fara Reporting si Analysis).
    1) Cautam serviciile FARA DEPENDENTE, care RULEAZA, si le oprim.
#>
Get-Service -Name *SQL* `
| Where-Object {$_.Status -eq "Running" -and $_.DependentServices -and $_.Name -ne "MySQL"} `
| ForEach-Object {$_.DependentServices} | Where-Object {$_.Status -eq "Running"} `
| ForEach-Object -Process {NET STOP $_.Name}

<#
    2) Cautam RESTUL serviciilor care RULEAZA si le oprim.
#>
Get-Service -Name *SQL* `
| Where-Object {$_.Status -eq "Running" -and $_.Name -ne "MySQL"} `
| ForEach-Object -Process {NET STOP $_.Name}


<#
    Reluarea activitatii.
    3) Cautam serviciile FARA DEPENDENTE, care AU FOST OPRITE, si le pornim.
#>
Get-Service -Name *SQL* `
| Where-Object {$_.Status -eq "Stopped" -and $_.DependentServices -and $_.Name -ne "MySQL"} `
| ForEach-Object {$_.DependentServices} | Where-Object {$_.Status -eq "Stopped"} `
| ForEach-Object -Process {NET START $_.Name}

<#
    4) Cautam RESTUL serviciilor care AU FOST OPRITE si le pornim.
#>
Get-Service -Name *SQL* | Where-Object {$_.Status -eq "Stopped" -and $_.Name -ne "MySQL"} `
| ForEach-Object -Process {NET START $_.Name}

Diverse baze de date

Lecţii de SQL

Fazele logice ale unei interogări.

Containere Docker: Microsoft SQL Server 2017

Avem nevoie de un calculator cu configuraţie modernă. De exemplu, eu folosesc sistemul de operare Microsoft Windows 10 Professional (x64), Creators Update, pe o maşină cu procesor Intel® Core™ i7 4720HQ (4 nuclee şi 8 procesoare logice la frecvenţa de 2.6 GHz), cu memorie RAM de 8 GB şi cu stocare HDD de 1 TB. Virtualizarea Hyper-V este activată (vezi Control Panel > Programs > Programs and Features > Turn Windows features on or off).

Serverul de baze de date va funcţiona ca un container Docker-pentru-Linux într-o maşină virtuală Linux (Alpine, LinuxKit, vezi şi aici): MobyLinuxVM.

Ca să instalăm Docker for Windows, ne trebuie un cont Docker (gratuit). Descărcăm varianta stable a Docker Community Edition for Windows (CE) şi o instalăm urmând paşii de aici. La momentul revizuirii acestui material (2 august 2018), versiunea în cauză a programului este 18.06.0-ce.

Impunem, via Docker (din Taskbar) > Settings > Advanced, dimensiuni ale memoriei RAM de cel puţin 4GB pentru maşina virtuală Linux. Vezi aici, respectiv aici.


(Opţional) Le permitem containerelor Docker să folosească drive-ul C.

Containerul serverului de baze de date se instalează fie din consola CMD (Win + R > cmd, Run as administrator) fie dintr-o fereastră PowerShell (Win + X, A, vezi aici), dar nu din PowerShell ISE.

Mai întâi, descărcăm imaginea serverului, folosind scriptul următor (vezi aici):

docker pull microsoft/mssql-server-linux:2017-latest

Apoi, rulăm comanda de mai jos în fereastra PowerShell:

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=caruta_Acuflori" -e "MSSQL_PID=Developer" --cap-add SYS_PTRACE -p 19991:1433 -d microsoft/mssql-server-linux:2017-latest

Detaliile comenzii run (-e, –cap-add, -p, -d) sunt discutate aici.

Parola trebuie să conţină: litere mici şi mari, caractere non-literă. În caz contrar, containerul se va închide!

Portul maşinii virtuale, corespunzător containerului, a primit o valoare nestandard: 19991. Portul serverului este cel tipic al instanţei default (vezi rubrica EXPOSE de aici). Valorile porturilor sunt disponibile aici.

Containerul funcţionează! Dacă am ajuns până în acest punct…

Găsim id-ul (db74d5087fd8), respectiv numele (gifted_chandrasekhar) containerului (vezi aici):

docker ps -a

Ne vom conecta la serverul de baze de date folosind interpretorul de comenzi (shell-ul) bash (introducem numele containerului):

docker exec -it gifted_chandrasekhar "bash"

Suntem root!

Manevrele în server vor fi realizate via sqlcmd. Astfel, din ferestra PowerShell, rulăm scriptul:

/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'caruta_Acuflori'

De îndată ce ne-am conectat la serverul de baze de date, putem introduce instrucţiunile T-SQL de mai jos:

SELECT @@VERSION AS [versiunea], SUSER_NAME() AS [cine sunt]

Nu uitaţi să adăugaţi GO pe o linie separată, în sqlcmd, pentru a porni execuţia interogării! Ieşim din sesiunea sqlcmd cu comanda exit. De asemeni, închidem shell-ul cu instrucţiunea exit 0.

Un script interesant:

USE [master] SELECT * FROM master.sys.all_objects AS a CROSS JOIN (SELECT * FROM master.sys.all_objects) AS b ORDER BY a.name DESC OFFSET 0 ROWS FETCH NEXT 1000000 ROWS ONLY

Sistemul de operare care constituie stratul de bază al imaginii containerului (la revizuirea acestui text, în august 2018) este Ubuntu 16.04.4 LTS (Xenial Xerus). După pornirea containerului, versiunea de Ubuntu poate fi găsită rulând următorul script bash:

cat /etc/*-release

Tot via bash, putem actualiza sistemul de operare (mai precis, user space-ul, userland-ul), respectiv instala un editor de text:

apt-get update
apt-get install vim

Dacă preferăm o interfaţă grafică, atunci putem interacţiona cu serverul de baze de date prin intermediul Microsoft SQL Operations Studio.


Conectarea la maşina virtuală în care rulează containerul se realizează folosind protocolul TCP. Pentru aceasta avem nevoie de IP-ul maşinii virtuale (10.0.75.2), vezi aici, şi de porturile corespunzătoare. IP-ul poate fi găsit la regulile Inbound din firewall (Win + R > WF.msc).

Reconstruim şirul de conectare în caseta grafică. Numele serverului de baze de date este IP-ul maşinii virtuale,numărul portului.