{"id":1253,"date":"2012-05-29T11:04:13","date_gmt":"2012-05-29T10:04:13","guid":{"rendered":"http:\/\/soci.hu\/blog\/?p=1253"},"modified":"2012-05-29T11:04:13","modified_gmt":"2012-05-29T10:04:13","slug":"sql-server-2012-ujdonsagok-5-a-throw-parancs","status":"publish","type":"post","link":"https:\/\/soci.hu\/blog\/index.php\/2012\/05\/29\/sql-server-2012-ujdonsagok-5-a-throw-parancs\/","title":{"rendered":"SQL Server 2012 \u00fajdons\u00e1gok &#8211; 5. A THROW parancs"},"content":{"rendered":"<p>Az SQL Server 2005-ben bevezetett TRY\/CATCH hibakezel\u00e9s \u00f3ri\u00e1si el\u0151rel\u00e9p\u00e9st jelentett az \u00e1tl\u00e1that\u00f3 TSQL hibakezel\u00e9s ter\u00e9n. M\u00e1s nyelvekhez viszony\u00edtva egy valami azonban hi\u00e1nyzott a k\u00e9pb\u0151l, a THROW, amivel ki lehet v\u00e1ltani egy kiv\u00e9telt (exceptiont). Volt persze egy hasonl\u00f3, a RAISERROR, \u00e1m ez kicsit m\u00e1s, mint a t\u00f6bbi programnyelv throw-ja. A throw ugyanis \u00e1ltal\u00e1ban k\u00e9tf\u00e9le dolgot tud. Az egyik, hogy feldob egy kiv\u00e9telt, a m\u00e1sik, hogy egy elkapott kiv\u00e9telt tov\u00e1bbdob. Ez ut\u00f3bbi re-thrownak h\u00edvj\u00e1k, \u00e9s az\u00e9rt nagyon hasznos, mert try-catch blokkban le tudjuk kezelni az eredeti hib\u00e1t, pl. visszag\u00f6rgetj\u00fck a tranzakci\u00f3t, napl\u00f3zunk vagy b\u00e1rmi egy\u00e9b akci\u00f3t hajtunk v\u00e9gre, majd a catch \u00e1g v\u00e9g\u00e9n \u00fajra feldobhatjuk az eredeti hib\u00e1t. \u00cdgy a kliens alkalmaz\u00e1s vagy SQL h\u00edv\u00f3 pontosan megkapja az eredeti hiba r\u00e9szleteit, p\u00e9ld\u00e1ul a kiv\u00e9tel sora nem a catch \u00e1gba rakott (re)throw-ra mutat, hanem az eredeti hib\u00e1t kiv\u00e1lt\u00f3 SQL sorra.<br \/>\nA THROW teh\u00e1t hasonl\u00f3 helyeken haszn\u00e1latos, mint a RAISERROR, de van k\u00f6z\u00f6tt\u00fck p\u00e1r fontos k\u00fcl\u00f6nbs\u00e9g. A legfontosabbak: a THROW nem tud rendszer kiv\u00e9teleket gener\u00e1lni (SQL Server bels\u0151 hiba\u00fczeneteket), nem haszn\u00e1lja a sys.messages t\u00e1bl\u00e1t (ebben vannak az el\u0151re defini\u00e1lt hiba\u00fczenetek) \u00e9s mindig 16-os severity level\u0171 kiv\u00e9teleket dob.<br \/>\nAz al\u00e1bbi p\u00e9ld\u00e1ban egy update az, ami hib\u00e1t dobhat, ha bele\u00fctk\u00f6zik egy idegen kulcsba. A kiv\u00e9telt elkapjuk, lelogoljuk, majd \u00fajradobjuk a kliens r\u00e9sz\u00e9re. A re-throw miatt a hibanapl\u00f3z\u00f3 logika nem sz\u00f3l bele a kliens \u00e1ltal kapott hibar\u00e9szletekbe.<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nBEGIN TRY\r\n\t--Ez hib\u00e1zhat\r\n\tupdate HumanResources.Employee \r\n\tset BusinessEntityID = -1 \r\n\twhere BusinessEntityID = 2;\r\nEND TRY\r\nBEGIN CATCH\r\n\t--Napl\u00f3zzuk a hib\u00e1t\r\n\tINSERT INTO \r\n\t&#x5B;dbo].&#x5B;ErrorLog]\r\n    (&#x5B;ErrorTime]\r\n    ,&#x5B;UserName]\r\n    ,&#x5B;ErrorNumber]\r\n    ,&#x5B;ErrorSeverity]\r\n    ,&#x5B;ErrorState]\r\n    ,&#x5B;ErrorProcedure]\r\n    ,&#x5B;ErrorLine]\r\n    ,&#x5B;ErrorMessage])\r\n\tVALUES(SYSDATETIME(), \r\n\tSUSER_NAME(),\r\n\tERROR_NUMBER(),\r\n\tERROR_SEVERITY(), \r\n\tERROR_STATE(), \r\n\tERROR_PROCEDURE(), \r\n\tERROR_LINE(), \r\n\tERROR_MESSAGE());\r\n  \r\n  --\u00dajradobjuk a kiv\u00e9telt a kliens r\u00e9sz\u00e9re\r\n  THROW;\r\n\r\nEND CATCH\r\n<\/pre>\n<p>A kliens ezt kapja:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nMsg 547, Level 16, State 0, Line 3\r\nThe UPDATE statement conflicted with the REFERENCE constraint &quot;FK_EmployeeDepartmentHistory_Employee_BusinessEntityID&quot;. The conflict occurred in database &quot;AdventureWorks2012&quot;, table &quot;HumanResources.EmployeeDepartmentHistory&quot;, column &#039;BusinessEntityID&#039;.\r\n<\/pre>\n<p>L\u00e1that\u00f3, hogy ez az eredeti hiba, a 3. sorra hivatkozik, nem a 29.-re, ahol val\u00f3j\u00e1ban a THROW van. Az errorlog t\u00e1bl\u00e1nkba ugyanez az inform\u00e1ci\u00f3 ker\u00fcl be:<\/p>\n<p><a href=\"http:\/\/soci.hu\/blog\/wp-content\/uploads\/2012\/05\/errorlog.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/soci.hu\/blog\/wp-content\/uploads\/2012\/05\/errorlog.png\" alt=\"\" title=\"Error Log\" width=\"499\" height=\"20\" class=\"aligncenter size-full wp-image-1254\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2012\/05\/errorlog.png 976w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2012\/05\/errorlog-600x25.png 600w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2012\/05\/errorlog-300x12.png 300w\" sizes=\"auto, (max-width: 499px) 100vw, 499px\" \/><\/a><\/p>\n<p>Nyilv\u00e1n nem csak \u00fajradob\u00e1sra j\u00f3 a THROW, hanem olyan helyeken is, ahol eddig RAISERROR-ral dobtunk fel saj\u00e1t hib\u00e1t.<br \/>\nEz:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">RAISERROR(N&#039;Az alkalmazott nem t\u00f6r\u00f6lhet\u0151, mert vannak hozz\u00e1 kapcsolt \u00e9l\u0151 feladatok&#039;, 16, 1);\r\n<\/pre>\n<p>\u00edgy n\u00e9z ki THROW-val:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nTHROW 50000, N&#039;Az alkalmazott nem t\u00f6r\u00f6lhet\u0151, mert vannak hozz\u00e1 kapcsolt \u00e9l\u0151 feladatok&#039;, 1;\r\n<\/pre>\n<p>A h\u00edv\u00f3 mindk\u00e9t esetben ezt kapja:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nMsg 50000, Level 16, State 1, Line 1\r\nAz alkalmazott nem t\u00f6r\u00f6lhet\u0151, mert vannak hozz\u00e1 kapcsolt \u00e9l\u0151 feladatok\r\n<\/pre>\n<p>\u00d6sszegezve, ha saj\u00e1t hib\u00e1kat szeretn\u00e9nk a kliensek fel\u00e9 k\u00f6zvet\u00edteni, illetve, ha meg kell tartani az eredeti hib\u00e1r\u00f3l sz\u00f3l\u00f3 inform\u00e1ci\u00f3kat, akkor a THROW-t \u00e9rdemes haszn\u00e1lni. Speci\u00e1lis esetekben, pl. nem 16-os szint\u0171 hib\u00e1khoz, vagy ha a sys.messagesben el\u0151re defini\u00e1lt hiba\u00fczenetet kell feldobni, akkor tov\u00e1bbra is el\u00e9rhet\u0151 a RAISERROR.<br \/>\nEgy\u00e9bk\u00e9nt az a t\u00e9ny, hogy a THROW nem haszn\u00e1lja a sys.messages t\u00e1bl\u00e1t igen fontos l\u00e9p\u00e9s, mert \u00edgy k\u00f6nnyebb k\u00f6lt\u00f6ztetni az adatb\u00e1zist m\u00e1sik szerverre, nem kell \u00e1tvinni egyedi hiba\u00fczeneteket a master t\u00e1bl\u00e1k k\u00f6z\u00f6tt. Ez kapcsol\u00f3dik az itt nem t\u00e1rgyalt, SQL 2012 \u00fajdons\u00e1g Contained Databases \u00faj\u00edt\u00e1shoz is.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Az SQL Server 2005-ben bevezetett TRY\/CATCH hibakezel\u00e9s \u00f3ri\u00e1si el\u0151rel\u00e9p\u00e9st jelentett az \u00e1tl\u00e1that\u00f3 TSQL hibakezel\u00e9s ter\u00e9n. M\u00e1s nyelvekhez viszony\u00edtva egy valami azonban hi\u00e1nyzott&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,4,30,78],"tags":[],"class_list":["post-1253","post","type-post","status-publish","format-standard","hentry","category-adatbazisok","category-szakmai-elet","category-sql-server","category-sql-server-2012"],"_links":{"self":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/1253","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=1253"}],"version-history":[{"count":1,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/1253\/revisions"}],"predecessor-version":[{"id":1255,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/1253\/revisions\/1255"}],"wp:attachment":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=1253"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=1253"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=1253"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}