<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rollback &#187; sql2005</title>
	<atom:link href="http://blog.rollback.hu/tag/sql2005/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.rollback.hu</link>
	<description>SQL, üzemeltetés kicsiknek és nagyoknak.</description>
	<lastBuildDate>Thu, 17 Nov 2011 16:38:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CTE = Common Table Expression</title>
		<link>http://blog.rollback.hu/2011/05/cte-common-table-expression/</link>
		<comments>http://blog.rollback.hu/2011/05/cte-common-table-expression/#comments</comments>
		<pubDate>Sun, 01 May 2011 14:21:48 +0000</pubDate>
		<dc:creator>Erik</dc:creator>
				<category><![CDATA[Magyar]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[sql2005]]></category>
		<category><![CDATA[T-SQL]]></category>

		<guid isPermaLink="false">http://blog.rollback.hu/?p=330</guid>
		<description><![CDATA[Általános jelenség scriptelés közben, hogy valahol felbukkan egy subquery, pl. a &#8220;minden számla, ahol a vevő budapesti&#8221; típusú kérdésre. Ez lehet join vagy subquery, általában mindegy, a query optimizer ugyanazt a végrehajtási tervet produkálja belőlük. 

-- a subquery
SELECT * FROM Szamlak
WHERE
   vevoid in
   (SELECT vevoid FROM Vevo Where varos = 'Budapest')
-- [...]]]></description>
			<content:encoded><![CDATA[<p>Általános jelenség scriptelés közben, hogy valahol felbukkan egy subquery, pl. a &#8220;minden számla, ahol a vevő budapesti&#8221; típusú kérdésre. Ez lehet join vagy subquery, általában mindegy, a query optimizer ugyanazt a végrehajtási tervet produkálja belőlük. </p>
<pre class="brush: sql;">
-- a subquery
SELECT * FROM Szamlak
WHERE
   vevoid in
   (SELECT vevoid FROM Vevo Where varos = 'Budapest')
-- a join
SELECT s.* FROM Szamlak s
   JOIN Vevo v
   ON v.vevoid = s.vevoid
   WHERE v.varos = 'Budapest'
</pre>
<p>És vannak esetek, amikor még ez sem elég, azokra a nehéz napokra ott van a CTE, vagyis Common Table Expression. Mielőtt belemennék, hogy mi is ez, nézzük meg a fenti példát CTE-vel, ami teljesen értelmetlen, de legalább a szintaktikát felismerjük:</p>
<pre class="brush: sql;">
WITH BpVevok (vevoid)
AS (
   SELECT vevoid FROM Vevo Where varos = 'Budapest'
)
SELECT s.* FROM Szamlak s
   JOIN BpVevok
   ON BpVevok.vevoid = s.vevoid
</pre>
<p>Semmivel nem tűnik egyszerűbbnek, nem is gyorsabb, akkor meg mire jó? A CTE nem más, mint tuljadonképpen egy ideiglenes nézet, egy olyan view, amit a query elején a WITH clause-zal definiálunk, aztán a queryben meg felhasználjuk, akár többször is. Ez az egyik előnye, hogy újrahasznosítható, és akkor viszont már egyszerűség meg gyorsaság is felbukkan. Viszont amiért én pénteken hozzányúltam, az valami egészen más tulajdonsága: szereti a rekurziót is, és lehet &#8220;rekurzív nézeteket&#8221; definiálni benne. Ez nagyon jól jön például hierarchikus adatoknál, amikor van egy rekordazonosító meg egy szülőazonosító oszlop. De nézzük inkább, hogy én mire használtam, az talán jobb, mintha értekeznék.</p>
<p>Adott egy tábla, amiben fájlszerverről szóló adatok vannak, többek között: objektumazonosító; fájl, illetve könyvtárnév; projekt; lejárati idő; plusz a szülő könyvtár azonosítója. minta:<br />
<strong>id|fajlnev|projektid|lejarat|szuloid</strong><br />
12234|feladatok.doc|4334|2011-12-31|3654<br />
3654|output|4334|2012-01-31|1111<br />
1111|teszt|4334|2020-01-20|NULL</p>
<p>A teljes feladathoz pedig az egyik részfeladat az, hogy minden fájlnak kell a teljes elérési útvonala is, amit subquerykben/joinokban kell majd használni, tehát pl.<br />
12234|feladatok.doc|\teszt\output\feladatok.doc|4334|2011-12-31|3654</p>
<p>Akár a gyökérelem azonosítóját is hozzáadhatnánk, nem bonyolítjuk a helyzetet. Transact-SQL-ben ez egy érdekes feladat lenne CTE nélkül, írhatnék rekurzív függvényt például, de a CTE sokkal cukibb:</p>
<pre class="brush: sql;">
WITH FileCTE (id, fajlnev,eleresiut,projektid,lejarat,szuloid)
AS (
  SELECT id, fajlnev, '\' + fajlnev AS eleresiut, projektid, lejarat, szuloid
  FROM filetabla
   WHERE szuloid IS NULL
   UNION ALL
   SELECT f.id, f.fajlnev, c.eleresiut + '\' + f.fajlnev AS eleresiut, f.projektid, f.lejarat, f.szuloid
   FROM filetabla f
     JOIN FileCTE c
     ON c.id = f.szuloid
)
-- itt jön az igazi kelérdezés
SELECT f.id, f.projektid
FROM filetabla f
JOIN FileCTE c
ON f.id = c.id
-- join meg egy csomo minden...
WHERE c.eleresiut LIKE '%penzugyi terv%xls'
</pre>
<p>Hát erre jó a CTE. (Meg arra, hogy maga a kveri már átlátható, mert a szörnyű subquery-k ki vannak emelve az elejére&#8230; :)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rollback.hu/2011/05/cte-common-table-expression/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SQL 2005 SP3 install és elmozgatott rendszeradatbázisok</title>
		<link>http://blog.rollback.hu/2009/09/sql-2005-sp3-install-es-elmozgatott-rendszeradatbazisok/</link>
		<comments>http://blog.rollback.hu/2009/09/sql-2005-sp3-install-es-elmozgatott-rendszeradatbazisok/#comments</comments>
		<pubDate>Sun, 27 Sep 2009 21:43:42 +0000</pubDate>
		<dc:creator>Erik</dc:creator>
				<category><![CDATA[Magyar]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[sql2005]]></category>
		<category><![CDATA[üzemeltetés]]></category>

		<guid isPermaLink="false">http://blog.rollback.hu/?p=116</guid>
		<description><![CDATA[Épp eszembe jutott, és gondoltam megosztom mindenkivel: pár hónapja SP3-at installáltunk a SQL-re, és azt találtuk, hogy elfrakkol az install. Újrakezdve is elfrakkolt. Meg kellett nézni a logot (programkönyvtár\Setup Bootstrap könyvtárban laknak ezek az izék), és kiderült a hiba: a distmodel.mdf fájl hiányzott a drágámnak, mert ott kereste, ahol a master.mdf volt, de mi átmozgattuk [...]]]></description>
			<content:encoded><![CDATA[<p>Épp eszembe jutott, és gondoltam megosztom mindenkivel: pár hónapja SP3-at installáltunk a SQL-re, és azt találtuk, hogy elfrakkol az install. Újrakezdve is elfrakkolt. Meg kellett nézni a logot (programkönyvtár\Setup Bootstrap könyvtárban laknak ezek az izék), és kiderült a hiba: a distmodel.mdf fájl hiányzott a drágámnak, mert ott kereste, ahol a master.mdf volt, de mi átmozgattuk máshova időközben. Úgyhogy baráti jótanács: ha elmozgatjátok a rendszeradatbázisokat, mozgassátok az összes adatfájlt együtt :) Kicsit deja vu érzésem van &#8211; lehet, hogy ezt már megírtam egyszer?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rollback.hu/2009/09/sql-2005-sp3-install-es-elmozgatott-rendszeradatbazisok/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Deprecation warningok</title>
		<link>http://blog.rollback.hu/2009/05/deprecation-warningok/</link>
		<comments>http://blog.rollback.hu/2009/05/deprecation-warningok/#comments</comments>
		<pubDate>Sat, 16 May 2009 12:28:01 +0000</pubDate>
		<dc:creator>Erik</dc:creator>
				<category><![CDATA[Magyar]]></category>
		<category><![CDATA[kütyü]]></category>
		<category><![CDATA[sql2005]]></category>
		<category><![CDATA[sql2008]]></category>
		<category><![CDATA[üzemeltetés]]></category>

		<guid isPermaLink="false">http://blog.rollback.hu/?p=89</guid>
		<description><![CDATA[(mostanság nem volt időm írni, mivel dolgozom :), ha nem a munkahelyemen, akkor pedig egy menedzsment adatbázist reszelek, ami reményeim szerint tök kényelmessé teszi a DBA életét)
Az SQL 2005 profilerben megjelent egy érdekes eseménycsalád, a Deprecation, azaz elavulás. Ez mutatja meg, hogy milyen dolgokat használunk az SQL Serverben azokból, amik meg lesznek szüntetve. Két esemény [...]]]></description>
			<content:encoded><![CDATA[<p>(mostanság nem volt időm írni, mivel dolgozom :), ha nem a munkahelyemen, akkor pedig egy menedzsment adatbázist reszelek, ami reményeim szerint tök kényelmessé teszi a DBA életét)</p>
<p>Az SQL 2005 profilerben megjelent egy érdekes eseménycsalád, a Deprecation, azaz elavulás. Ez mutatja meg, hogy milyen dolgokat használunk az SQL Serverben azokból, amik meg lesznek szüntetve. Két esemény van benne: a Deprecation Announcement, ami azt mondja, hogy vigyázz, mert ezt rátettük a halállistára, és a Deprecation Final Support, ami azt mondja, hogy ez a lista tetején van, és a következő major release-ben már kiveszik. A következő major release SQL 2005-nél a 2008, 2008-nál pedig a 2008 R2.</p>
<p>Könnyű kipróbálni: indítsunk el egy profilert a Deprecation eseményekre (ha bepipáljuk a show all events boxot, akkor biztos meglesz), és nyissunk egy query window-t a profilerezett SQL szerveren! (Amennyiben a szervert használjuk másra is, mint játékra, akkor szűrjük le a profilert a query window spidjére, amit a status baron megtalálunk a felhasználónevünk után zárójelben.) Abba pedig írjuk bele a következőt:</p>
<pre class="brush: sql;">
SELECT name FROM msdb.dbo.sysjobs (NOLOCK)
</pre>
<p>Majd nézzük meg a profilert!</p>
<blockquote><p>Specifying table hints without using a WITH keyword is a deprecated feature and will be removed in a future version.</p></blockquote>
<p>Tehát működik. A haszna nyilvánvaló: migráció előtt látja az ember, hogy mivel lehet probléma, de én egy kicsit továbbmegyek ennél: éppen most készülök bedobni azt, hogy nem veszünk át olyan adatbázist vagy módosítást, ahol deprecation warning van. Javítsák ki most, ne legyen még egy csontváz a szekrényben, az már így is tele van&#8230;</p>
<p>Szerintem érdemes időnként futtatni egy kicsit, és megnézni, hogy miket kap el. Nálam a master, msdb és AdventureWorks adatbázisokat :) Szóval érdemes szűrni felhasználói adatbázisokra (databaseid > 4) éles üzemben, a Microsoft meg majd rendet tesz a rendszeradatbázisokban.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rollback.hu/2009/05/deprecation-warningok/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL Server Standard Edition és Lock Pages in memory 64 biten</title>
		<link>http://blog.rollback.hu/2009/04/sql-server-standard-edition-es-lock-pages-in-memory-64-biten/</link>
		<comments>http://blog.rollback.hu/2009/04/sql-server-standard-edition-es-lock-pages-in-memory-64-biten/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 16:05:10 +0000</pubDate>
		<dc:creator>Erik</dc:creator>
				<category><![CDATA[Magyar]]></category>
		<category><![CDATA[mssql]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[sql2005]]></category>
		<category><![CDATA[sql2008]]></category>
		<category><![CDATA[üzemeltetés]]></category>

		<guid isPermaLink="false">http://blog.rollback.hu/?p=83</guid>
		<description><![CDATA[Ha az ember egy erősebb vason SQL Server Standard Editiont futtat, akkor találkozhat a kedves hibaüzenettel az errorlogban:
A significant part of sql server process memory has been paged out. This may result in performance degradation
Ez kellemetlen lehet, a oprendszer kitalálja, hogy neki másra (is) kell memória, és kiülteti az SQL-t a kispadra, aminek a teljesítménye [...]]]></description>
			<content:encoded><![CDATA[<p>Ha az ember egy erősebb vason SQL Server Standard Editiont futtat, akkor találkozhat a kedves hibaüzenettel az errorlogban:<br />
A significant part of sql server process memory has been paged out. This may result in performance degradation<br />
Ez kellemetlen lehet, a oprendszer kitalálja, hogy neki másra (is) kell memória, és kiülteti az SQL-t a kispadra, aminek a teljesítménye tényleg leromolhat ilyenkor, nem viccel az errorlog. </p>
<p>Enterprise Edition esetén ez nem probléma, mivel az rendelkezik a mágikus &#8220;Lock pages in memory&#8221; képességgel (feltéve, hogy a futtató user megkapta a szükséges OS-szintű jogot), de a standardon bizony sokat szívtak ezzel emberek, beleértve engemet is. Éppen ezért örülök nagyon annak, hogy végre kivették ezt a bosszantó korlátozást, pontosabban kiveszik hamarosan. Még pontosabban egy trace flag segítségével be lehet majd kapcsolni azt, hogy lehessen lockolni a memóriába a lapokat. A várható szállítási idők:</p>
<ul>
<li>SQL 2008 SP1 CU 2 &#8211; 2009 május</li>
<li>SQL 2005 SP3 CU 4 &#8211; 2009 június</li>
</ul>
<p>Én már felírtam a naptáramba :) A PSS blogon az eredeti post <a href="http://blogs.msdn.com/psssql/archive/2009/04/24/sql-server-locked-pages-and-standard-sku.aspx">itt olvasható</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rollback.hu/2009/04/sql-server-standard-edition-es-lock-pages-in-memory-64-biten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Az légy, aki lenni akarsz</title>
		<link>http://blog.rollback.hu/2009/04/az-legy-aki-lenni-akarsz/</link>
		<comments>http://blog.rollback.hu/2009/04/az-legy-aki-lenni-akarsz/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 22:14:01 +0000</pubDate>
		<dc:creator>Erik</dc:creator>
				<category><![CDATA[Magyar]]></category>
		<category><![CDATA[mssql]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[sql2005]]></category>
		<category><![CDATA[T-SQL]]></category>

		<guid isPermaLink="false">http://blog.rollback.hu/?p=79</guid>
		<description><![CDATA[A cím nem a személyiségfejlődéshez, inkább a más accountok megszemélyesítéséhez kapcsolódik. Az SQL Server ugyanis lehetőséget ad arra, hogy egy megfelelő jogosultságokkal rendelkező login alól egy másik loginra (vagy userre) váltsunk át, és annak a nevében futtassunk lekérdezéseket. Ez különösen hasznos lehet például hibakeresésnél vagy ha vissza akarunk élni a hatalmunkkal.
SQL 2000 alatt már megvolt [...]]]></description>
			<content:encoded><![CDATA[<p>A cím nem a személyiségfejlődéshez, inkább a más accountok megszemélyesítéséhez kapcsolódik. Az SQL Server ugyanis lehetőséget ad arra, hogy egy megfelelő jogosultságokkal rendelkező login alól egy másik loginra (vagy userre) váltsunk át, és annak a nevében futtassunk lekérdezéseket. Ez különösen hasznos lehet például hibakeresésnél vagy ha vissza akarunk élni a hatalmunkkal.</p>
<p>SQL 2000 alatt már megvolt a SETUSER nevű parancs, ami átváltott egy megadott user alá, és viszonylag lehetett használni, de az igazi boldog élet a 2005-tel köszöntött be, ő hozta el az EXECUTE AS utasítást. Itt már megmondhatjuk, hogy database user vagy server login szinten akarunk imperszonálni, lehet ezt a privilégiumot bárkinek megadni (SETUSER csak sysadmin vagy dbo joggal megy), illetve lehet több szint mélyre lemászni, és onnan visszajönni.<br />
<span id="more-79"></span><br />
Az EXECUTE AS parancs kiváló huncutkodásokra ad lehetőséget, de persze azért van mód megtudni, hogy ki vagyok én valójában:</p>
<pre class="brush: sql;">
-- nézzük meg, hogy ki vagyunk
SELECT SUSER_NAME() [login], USER_NAME() [user]
-- legyünk sa
EXECUTE AS LOGIN = 'sa'
GO
SELECT SUSER_NAME() [login], USER_NAME() [user]
-- de honnan tudom, hogy ki voltam?
SELECT ORIGINAL_LOGIN()
-- menjünk vissza
REVERT
</pre>
<p>Hát ennyi. Illetve&#8230; van itt még valami: definiálhatunk UDF-et, SP-t sőt triggert is EXECUTE AS clause-zal, ami meghatározza, hogy kinek a nevében fog lefutni a lefutnivaló. Az alábbi SP-t egy user adatbázisban hoztam létre, ahol a mytestdbuser nevű SQL loginhoz mappelt azonos nevű db user lakik, mindenféle jog nélkül:</p>
<pre class="brush: sql;">
CREATE PROCEDURE uspKivagyok
WITH EXECUTE AS 'mytestdbuser'
AS
BEGIN
SELECT SUSER_NAME(), ORIGINAL_LOGIN()
END
</pre>
<p>Ez nagyon jó, de mi a haszna? Még finomabban tudom hangolni a jogosultságokat, ott is, ahol egyébként nem tudnám. Pl. nem lehet a TRUNCATE TABLE jogot delegálni &#8211; ha egy SP-be csomagolom, az SP-re annak adok jogot, akinek akarok, az SP pedig fut egy dbo nevében.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rollback.hu/2009/04/az-legy-aki-lenni-akarsz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

