SQL címkéhez tartozó bejegyzések

SSL TDS alá, avagy az SQL kapcsolat titkosítása

Ha az SQL klienseink (például a fejlesztők Management Studioi) és az SQL szervereink nem egymás közelében helyezkednek el, akkor praktikus, ha az SQL Server által használt tabular data stream (TDS) protokoll alá SSL-t teszünk.

Első lépésként természetesen egy érvényes tanúsítványra lesz szükségünk. Fontos, hogy a tanúsítványon szereplő névnek pontosan meg kell egyeznie a szerver nevével. Az egyezést az SQL Server DNS lekérdezéssel ellenőrzi, ezért lehetőleg ne bonyolítsuk az életünket DNS aliasokkal vagy DNS utótag bűvészkedéssel. A másik fontos dolog, hogy a tanúsítvány megbízható kiadótól származzon, amiben a szerver és a kliens is megbízik.

A kész tanúsítványt importáljuk be a Local Computer account Personal Certificates tárába. Ezt legegyszerűbben úgy tehetjük meg, ha elindítjuk az MMC-t, hozzáadjuk a Certificates snap-int és a hozzáadáskor kapott kérdésre azt választjuk, hogy a Computer account érdekel minket. Ezek után a Personal\Certificates ágon a helyi menüben találjuk az Import menüpontot (katt a teljes képért):

sql-ssl-import

A következő lépés, hogy az SQL Servert futtató felhasználói fióknak jogot adunk a tanúsítvány elérésére. Ehhez a jobb oldali panelen jelöljük ki a tanúsítványt, majd a helyi menüben válasszuk a All Tasks –> Manage Private Keys… menüpontot:

sql-ssl-acl

Eredményül egy szokásos ACL konfiguráló ablakot kapunk. Kattintsunk az Add gombra és válasszuk ki azt a fiókot, akinek a nevében az SQL Server instance-ünk fut. Az SQL Server 2012 már alapértelmezés szerint saját service account nevében fut, ezt NT Service\MSSQL$instanceneve formában adhatjuk meg, majd adjunk neki Read jogot (nem kell Full control!):

sql-ssl-ace

Indítsuk el az SQL Server Configuration Managert és navigáljunk el az SQL Server Network Configuration –> Protocols for [instance neve] ágig, majd nyissuk meg a hozzá tartozó Properties ablakot:

sql-ssl-properties

Kattintsunk át a második, Certificate fülre és válasszuk ki a használni kívánt tanúsítványt:

sql-ssl-properties-certificate

Ha nem jelenik meg a tanúsítvány a listában, akkor gond van, ellenőrizzük a tanúsítványt, a névfeloldást és a jogosultságokat.

Visszalépve az első, Flags fülre, a Force Enryption kapcsoló Yes-re állításával kikényszeríthetjük a titkosítást:

sql-ssl-properties-force-encryption

Ebben az esetben csak azok a kliensek tudnak majd a szerverhez kapcsolódni, akiknél a connection stringben szerepel az Encrypt=True; beállítás. Amennyiben a kliens SQL Server Management Studio, a titkosítást a Connection Properties fülön az Encrypt connection kapcsoló bejelölésével engedélyezhetjük:

sql-ssl-ssms-encrypt

A titkosítás működését ellenőrizhetjük Wiresharkkal, de akár az SQL Servertől is megkérdezhetjük, hogy melyik kapcsolat van titkosítva. Ehhez a sys.dm_exec_connections view encrypt_option oszlopa a hiteles forrás. Ezzel a lekérdezéssel a kapcsolat legfontosabb paramétereit tekinthetjük át:

SELECT session_id, net_transport, client_net_address, local_net_address, 
       local_tcp_port, auth_scheme, encrypt_option 
FROM sys.dm_exec_connections

Ha az encrypt_option oszlopban TRUE-t látunk, megnyugodhatunk.

 

Technorati-címkék: ,,,
Reklámok

Ingyenes SQL kurzusok a Pluralsighttól

Májusban írtam arról, hogy a Pluralsight 30 napig ingyenesen kínálta az ASP.NET tananyagait. Most hasonló a helyzet, csak éppen SQL témában.

Az SQLskills csapat (élén a  Paul S. Randal és Kimberly L. Tripp házaspár) ugyanis leszerződött a Pluralsighttal és a közeljövőben online fogják ontani magukból az adatbázisos bölcsességeket. Jelenleg ezek a kurzusok érhetők el (mindegyik több, mint 4 órányi online anyag):

  • SQL Server: Performance Tuning Using Wait Statistics
  • SQL Server: Transact-SQL Basic Data Retrieval
  • SQL Server: Collecting and Analyzing Trace Data

És ami még az év végéig jön:

  • SQL Server: Understanding Logging, Recovery, and the Transaction Log
  • SQL Server: Database Design Mistakes and Solutions
  • SQL Server: Extended Events Basics
  • SQL Server: Transact-SQL Basic Data Modification
  • Server Hardware Fundamentals
  • SQL Server: Benchmarking and Baselining

Bevezetésként most 30 napig ingyenesen érhető el az első három tananyag. Ehhez nem kell mást tenni, mint:

  1. Feliratkozni az @sqlskills követésére a Twitteren.
  2. Feliratkozni a @pluralsight követésére a Twitteren.
  3. Ellátogatni a http://pluralsight.com/training/TwitterOffer/sqlskills oldalra és megadni a saját Twitter azonosítókat.
  4. A postaládánkba érkező válaszban kapott kódot felhasználva belépni és megnézni az előadásokat.

A címek és a korábbi előadásaik alapján én biztos vagyok benne, hogy megéri.

További információ: SQLskills training goes online worldwide (and free in September!)

 

Technorati-címkék: ,,,

Gyakori PowerShell kérdések

Nem írok sűrűn PowerShell szkripteket, ezért van néhány olyan probléma, amibe gyakran belefutok. Íme a megoldásuk, hátha más is hasznát veszi:

Kommentezés

# Egysoros komment kettőskereszt után
<#
  Ez egy
  több soron 
  átnyúló megjegyzés
#>

Leírás

A Get-Help cmdlet által kiírandó leírás tartalmát a szkript elejére tett komment blokkban adhatjuk meg az alábbi formában:

<#
.SYNOPSIS
    Rövid leírás...    
.DESCRIPTION
    Hosszú leírás... 
.PARAMETER MyParam1
    A MyParam1 paraméter leírása...
.PARAMETER MyParam2
    A MyParam2 paraméter leírása...
.EXAMPLE
    C:\PS> .\MyScript.ps1 –MyParam1 "egy"  
Az első példa leírása... .EXAMPLE C:\PS> .\MyScript.ps1 –MyParam2 2012 A második példa leírása... .NOTES Egyéb megjegyzés, például szerző, dátum...
Author: György Balássy Date: 2012.07.11. #>

Bemeneti paraméterek

Egy szkript vagy függvény bemeneti paramétereit a Param kulcsszóval definiálhatjuk. A paramétereknek adhatunk alapértéket is:

Param(
    $MyParam1,
    $MyParam2 = 10
)

Paraméter validálás

A paramétereknél a .NET-es attribútumokhoz hasonló szintakszissal megadhatunk típust, illetve néhány kényszert is:

Param(
    [parameter(Mandatory=$true)]  
[string]
[ValidateScript({Test-Path $_ -PathType 'Container'})] $MyParam1, [parameter(Mandatory=$false)]
[int]
[ValidateRange(-1, 31)] $MyParam2 = 10 )

Ezeken az attribútumokon kívül van még ValidateLength, ValidateCount, ValidatePattern, ValidateNotNull, ValidateNotNullOrEmpty is.

Mappa létezésének ellenőrzése

A Test-Path cmdlet segítségével ellenőrizhetjük, hogy egy vagy több mappa vagy fájl (általánosabban: útvonal) létezik-e, vagy akár csak azt, hogy a megadott útvonal érvényes-e (ld. –IsValid kapcsoló). A cmdlet $true értékkel tér vissza, ha az adott útvonal létezik:

if( $myPath -ne $null -and ( Test-Path $myPath ) -eq $true )
{
    Remove-Item $myPath -Recurse
}

Szkript leállítása

Egy futó szkript leállítására használhatjuk az exit kulcsszót, ami után tetszőleges hibakódot megadhatunk. Ha hibajelzéssel akarjuk leállítani a szkriptet, akkor jobb a throw kulcsszót használni, ami után megadhatunk egy szöveges hibaüzenetet és ami 1 hibakóddal állítja le a szkript futását. Normál esetben a szkript 0 hibakóddal fejeződik be.

if( ( Test-Path $cmd ) -eq $false ) 
{
throw "A $cmd értéke nem megfelelő!"
}

Színes betűk a konzolra

Ha jobban el akarjuk különíteni a szkriptünk által kiírt üzeneteket a felhasznált cmdletek vagy külső programok üzeneteitől, akkor írhatunk színesen a konzolra:

Write-Host "Valami történik..." -ForegroundColor Green

Dátum formázása

Néha szükségünk van a mai dátumra, méghozzá valamilyen formátumban, amit előállíthatunk például így:

$now = Get-Date -format yyyyMMdd_HHmmss;

Kimenet elhallgattatása

A kimenet “némítására” parancssorban általában a >null átirányítást szoktuk használni, de tapasztalataim szerint ez egy PowerShell szkriptben nem mindig azt csinálja, amit szeretnénk. Ez esetben bátran használhatjuk az Out-Null cmdletet:

mkdir $targetDir | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("MyAssembly") | Out-Null

Module vagy snap-in betöltése

Találkoztam olyan PowerShell bővítménnyel, amit PowerShell 1.0 alatt snapinként, 2.0 alatt pedig modulként kellett betölteni. Szerencsére le tudjuk kérdezni a PowerShell verziószámát és megifelhetjük a betöltést:

if( $PSVersionTable.PSVersion.Major -ge 2 )
{
  Import-Module MyModule
}
else
{
   Add-PSSnapin MyModule
}

Lásd Using Modules and Snap-Ins.

SQL adatbázis mentése

SMO segítségével így menthetünk SQL adatbázist:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum")

$s = New-Object ("Microsoft.SqlServer.Management.Smo.Server") "(local)" 
$b = New-Object ("Microsoft.SqlServer.Management.Smo.Backup") $b.Action = "Database" $b.BackupSetDescription = "Full Northwind backup" $b.BackupSetName = "Northwind backup" $b.Database = "Northwind"
$b.MediaDescription = "Disk" $b.Devices.AddDevice("C:\Backup\MyBackup.bak", "File") $b.SqlBackup($s)

IIS konfiguráció mentése

Az IIS konfiguráció mentéséhez használhatjuk az IIS  PowerShell Snap-Int:

Import-Module WebAdministration   # vagy  Add-PSSnapin
Backup-WebConfiguration "MyBackupName"

Szövegfájl sorainak feldolgozása

Get-Content $filePath | Foreach-Object
{ 
  # Sor feldolgozása a $_ változóval
}

 

A PowerShell megismeréséhez nagyon hasznos forrás Soós Tibor Windows PowerShell 2.0 rendszergazdáknak c. könyve.

 

Technorati-címkék: ,,,

Régebbi Technet tananyagok

Többen írtak nekem, hogy a régebbi cikkekben szereplő Technet oldalakra mutató hivatkozások egy része nem érhető már el, ezért összeszedtem a legfontosabb tartalmak új helyét:

A videók többsége megtalálható a videótárban és a Technetklub TV oldalon is, az e-bookok pedig a PDF-ek között.

 

Technorati-címkék: ,,,,,

SQL mit ír ki

Code review közben akadtam rá az alábbi érdekes mintára, természetesen sokkal bonyolultabb formában. A kérdés a szokásos: mit ír ki?

DECLARE @condition int = 0
DECLARE @new int

IF @condition = 1
BEGIN
    DECLARE @old int = 5
END    

SET @new = @old

SELECT @new

 

 

Technorati-címkék: ,

A Connect igenis működik

Időnként én is szoktam szapulni a Microsoft Connect szolgáltatását, hiszen nem egyszer előfordul, hogy az ember beküld egy hibajelenséget, amire visszajön a By Design, Won’t fix, Postponed vagy valami hasonló válasz. De legyünk őszinték, ki nem állított még be hasonló választ a saját bug trackerében? És akkor egyszer csak jön egy Closed as Fixed válasz, ami elsöpör minden korábbi kellemetlen élményt.

November elején írtam arról, hogy milyen szomorú, hogy az IIS ApplicationPooldentity nem lehet SQL Server Agent job owner, mert elbukik a felhasználói fiók ellenőrzésén. Akkor be is küldtem ezt a hibát a Connectre, hogy legalább nyoma maradjon. Egy héten belül jött a standard “thank you – we are investigating” válasz, majd kértek további infókat, aztán a szokásos csönd, el is felejtettem a dolgot. Aztán most kapom a szívderítő választ:

Hey György
I just wanted to update you that the issue was fixed and you should see it in next major release, you actually can test it on SQL12 RC0 pre-release.
Thanks
Alex Grach [MSFT]

Mindezt úgy, hogy mindössze heten szavaztak erre a hibára (köszönöm mindenkinek). Like!

Szóval íme, itt az élő példa, hogy a Connect != /dev/null. Ha hibát találtok, küldjétek be!

 

Technorati-címkék: ,,

MSG 8624: The query processor could not produce a query plan

Érdekes hibába futottunk bele már nem először: adott egy INSERT szkript, ami nagyon nem akar lefutni, az alábbi hibával örvendezteti meg a gazdáját:

Msg 8624, Level 16, State 1, Line 13
Internal Query Processor Error: The query processor could not produce a query plan. For more information, contact Customer Support Services.

Na ez az, amire az ember azt mondja, hogy könyörgöm, ez csak egy sima insert, mi ebben olyan nehéz? Úgy tűnik, hogy a probléma az idegen kulcsok és a persisted oszlopok környékén lehet, legalábbis erre utal az alábbi két Connect bug:

A hiba évek óta ismert, de azért még mindig sikerül reprodukálni, tessék csak szavazni rá, hátha egyszer megjavítják.

Szerencsére van workaround (én nem hívnám megoldásnak, de működik):

SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET CONCAT_NULL_YIELDS_NULL ON
SET NUMERIC_ROUNDABORT OFF
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON

Az utolsó csak akkor kell, ha az adatbázis 80-as kompatibilitási módban van.

Remélem sikerült ezzel megkímélni másokat is pár órányi debuggolástól.