{"id":462,"date":"2008-04-09T10:26:11","date_gmt":"2008-04-09T09:26:11","guid":{"rendered":"http:\/\/soci.hu\/blog\/?p=462"},"modified":"2008-04-09T10:26:11","modified_gmt":"2008-04-09T09:26:11","slug":"sql-server-2008-ujdonsagok-34-megbizhato-fuggosegek","status":"publish","type":"post","link":"https:\/\/soci.hu\/blog\/index.php\/2008\/04\/09\/sql-server-2008-ujdonsagok-34-megbizhato-fuggosegek\/","title":{"rendered":"SQL Server 2008 \u00fajdons\u00e1gok 34. &#8211; Megb\u00edzhat\u00f3 f\u00fcgg\u0151s\u00e9gek"},"content":{"rendered":"<p>H\u00e1t igen, f\u00fcgg\u0151s\u00e9gek. Ez az a t\u00e9ma, amivel ki lehet kergetni a vil\u00e1gb\u00f3l egy SQL Server DBA-t. Mindenki tudja, hogy az SQL Server 2005-ben f\u00fcgg\u0151s\u00e9gek kezel\u00e9se sz\u00e1nalmas, egy\u00e1ltal\u00e1n nem megb\u00edzhat\u00f3.<\/p>\n<p>Egy egyszer\u0171 p\u00e9ld\u00e1val vil\u00e1g\u00edtom meg.<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\ncreate view dbo.VA\r\nas\r\n  select * from Production.Product\r\ngo\r\n\r\ncreate view dbo.VB\r\nas\r\n  select * from VA\r\ngo\r\n<\/pre>\n<p>VB f\u00fcgg VA-t\u00f3l, tiszta \u00fcgy. A gond az, hogy megalterezve VA-t elt\u0171nik az az inf\u00f3, hogy VB f\u00fcgg VA-t\u00f3l.<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nalter view dbo.VA\r\nas\r\n  select * from Production.Product\r\n<\/pre>\n<p>Ez eszement dolog, de \u00edgy van (nem tudom ellen\u0151rizni, mert nincs a k\u00f6zelemben SQL 2005, ha valaki tudja valid\u00e1lni, k\u00e9rem tegye meg). <\/p>\n<p>2008-ban m\u00e1r norm\u00e1lisan mennek a f\u00fcgg\u0151s\u00e9gek. Ennek az az oka, hogy nem csak id szerint t\u00e1rolj\u00e1k \u0151ket, hanem n\u00e9v szerint is. A r\u00e9gebbi verzi\u00f3k csak id-t haszn\u00e1ltak, \u00edgy nem tudt\u00e1k let\u00e1rolni a k\u00e9sleltetett n\u00e9vfelold\u00e1s miatt id\u0151legesen hi\u00e1nyz\u00f3 f\u00fcgg\u0151s\u00e9geket (mondjuk ez nem menti fel \u0151ket az el\u0151bbi p\u00e9lda eset\u00e9ben).<\/p>\n<p>2008-ban a f\u00fcgg\u0151s\u00e9geket a sys.sql_expression_dependencies rendszert\u00e1bla t\u00e1rolja, \u00e9s k\u00e9t f\u00fcggv\u00e9ny seg\u00edt lek\u00e9rdezni bel\u0151l\u00fck.<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\ndrop view dbo.VA\r\ndrop view dbo.VB\r\ndrop proc dbo.PA\r\ndrop proc dbo.PB\r\ngo\r\n\r\ncreate view dbo.VA\r\nas\r\n  select * from Production.Product\r\ngo\r\n\r\nselect OBJECT_NAME(referencing_id), referenced_entity_name, referenced_id\r\nfrom sys.sql_expression_dependencies\r\nwhere referencing_id = OBJECT_ID(&#039;dbo.VA&#039;)\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nreferencing_object             referenced_entity_name         referenced_id\r\n------------------------------ ------------------------------ -------------\r\nVA                             Product                        1461580245\r\n<\/pre>\n<p>Sz\u00e9pen van n\u00e9v \u00e9s id is, hisz l\u00e9tezett a Product t\u00e1bla. Eddig ok.<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\ncreate view dbo.VB\r\nas\r\n  select * from VA\r\ngo\r\n\r\nselect OBJECT_NAME(referencing_id) referencing_object, referenced_entity_name, referenced_id\r\nfrom sys.sql_expression_dependencies\r\nwhere referencing_id in (OBJECT_ID(&#039;dbo.VA&#039;), OBJECT_ID(&#039;dbo.VB&#039;))\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nreferencing_object             referenced_entity_name         referenced_id\r\n------------------------------ ------------------------------ -------------\r\nVA                             Product                        1461580245\r\nVB                             VA                             992722589\r\n<\/pre>\n<p>Ez is rendben van. Most j\u00f6n a r\u00e9gi probl\u00e9m\u00e1s pont:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nalter view dbo.VA\r\nas\r\n  select * from Production.Product\r\ngo\r\n\r\nselect OBJECT_NAME(referencing_id) referencing_object, referenced_entity_name, referenced_id\r\nfrom sys.sql_expression_dependencies\r\nwhere referencing_id in (OBJECT_ID(&#039;dbo.VA&#039;), OBJECT_ID(&#039;dbo.VB&#039;))\r\n<\/pre>\n<p>\u00c9s a kimenet j\u00f3!<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n------------------------------ ------------------------------ -------------\r\nVA                             Product                        1461580245\r\nVB                             VA                             992722589\r\n<\/pre>\n<p>J\u00f6het a k\u00e9seltetett n\u00e9vfelold\u00e1s tesztje.<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\ncreate proc dbo.PA\r\nas\r\n  exec dbo.PB\r\ngo\r\n\r\nselect OBJECT_NAME(referencing_id) referencing_object, referenced_entity_name, referenced_id\r\nfrom sys.sql_expression_dependencies\r\nwhere referencing_id in (OBJECT_ID(&#039;PA&#039;))\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nThe module &#039;PA&#039; depends on the missing object &#039;dbo.PB&#039;. The module will still be created; however, it cannot run successfully until the object exists.\r\nreferencing_object             referenced_entity_name         referenced_id\r\n------------------------------ ------------------------------ -------------\r\nPA                             PB                             NULL\r\n<\/pre>\n<p>L\u00e1that\u00f3, hogy a referenced_id NULL, mert m\u00e9g nem l\u00e9tezik PB, de n\u00e9v alapj\u00e1n felvett\u00e9k a f\u00fcgg\u0151s\u00e9get. Kiv\u00e1l\u00f3! Mikor lesz kit\u00f6ltve az id?<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\ncreate proc dbo.PB\r\nas\r\ngo\r\n\r\nselect OBJECT_NAME(referencing_id) referencing_object, referenced_entity_name, referenced_id\r\nfrom sys.sql_expression_dependencies\r\nwhere referencing_id in (OBJECT_ID(&#039;PA&#039;))\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nreferencing_object             referenced_entity_name         referenced_id\r\n------------------------------ ------------------------------ -------------\r\nPA                             PB                             1040722760\r\n<\/pre>\n<p>A reference_id most m\u00e1r j\u00f3, mert l\u00e9tezik a hivatkozott objektum.<\/p>\n<p>N\u00e9zz\u00fck a n\u00e9zeteket. Kire hivatkozik egy ojjektum? sys.dm_sql_referenced_entities n\u00e9zet:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nselect OBJECT_NAME(referenced_id) referenced_object, * from sys.dm_sql_referenced_entities(&#039;dbo.PA&#039;, &#039;OBJECT&#039;)\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nreferenced_object              referencing_minor_id referenced_server_name         referenced_database_name       referenced_schema_name         referenced_entity_name         referenced_minor_name          referenced_id referenced_minor_id referenced_class referenced_class_desc          is_caller_dependent is_ambiguous\r\n------------------------------ -------------------- ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------- ------------------- ---------------- ------------------------------ ------------------- ------------\r\nPB                             0                    NULL                           NULL                           dbo                            PB                             NULL                           1040722760    0                   1                OBJECT_OR_COLUMN               0                   0\r\n<\/pre>\n<p>L\u00e1that\u00f3, hogy PA PB-re hivatkozik.<\/p>\n<p>Ki hivatkozik PB-re? sys.dm_sql_referencing_entities f\u00fcggv\u00e9ny:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nselect * from sys.dm_sql_referencing_entities(&#039;dbo.PB&#039;, &#039;OBJECT&#039;)\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nreferencing_schema_name        referencing_entity_name        referencing_id referencing_class referencing_class_desc         is_caller_dependent\r\n------------------------------ ------------------------------ -------------- ----------------- ------------------------------ -------------------\r\ndbo                            PA                             1024722703     1                 OBJECT_OR_COLUMN               0\r\n<\/pre>\n<p>Pontos lista, <a href=\"http:\/\/technet.microsoft.com\/en-us\/library\/ms345449(SQL.100).aspx\">milyen f\u00fcgg\u0151s\u00e9geket t\u00e1rol a szerver<\/a>.<\/p>\n<p>N\u00e9ha nem egy\u00e9rtelm\u0171 egy f\u00fcgg\u0151s\u00e9g. Az al\u00e1bbi p\u00e9ld\u00e1ban:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nCREATE PROCEDURE dbo.p1 AS \r\nSELECT column_a, Sales.GetOrder() FROM Sales.MySales; \r\n<\/pre>\n<p>A Sales.GetOrder() lehet egy Sales nev\u0171 oszlop a MySales t\u00e1bl\u00e1ban, ami egy UDT, \u00e9s van neki egy GetOrder met\u00f3dusa, de lehet egy UDF, ami a Sales s\u00e9m\u00e1ban van, \u00e9s GetOrder a neve. (Az SQL Server 2005 kor\u00e1bbi beta verzi\u00f3j\u00e1ban m\u00e9g a C++-os :: volt a t\u00edpust \u00e9s met\u00f3dust elv\u00e1laszt\u00f3 karakter, ha ezt meghagyt\u00e1k volna, most nem lenne ez a f\u00e9lre\u00e9rthet\u0151s\u00e9g.)<\/p>\n<p>A f\u00fcgg\u0151s\u00e9geket jegyzik adatb\u00e1zisok (3 tag\u00fa nevekkel hivatkozva m\u00e1s objektumokra) s\u0151t szerverek k\u00f6z\u00f6tt is (4 tag\u00fa nevek, linked szerverek), nem csak egy adatb\u00e1zison bel\u00fcl. Emellett k\u00e9tf\u00e9le f\u00fcgg\u0151s\u00e9g van, schema-bound objektumok \u00e9s nem schema-bound objektumok eset\u00e9n. A NEM s\u00e9ma k\u00f6t\u00f6tt objektumokr\u00f3l NINCS oszlopszint\u0171 f\u00fcgg\u0151s\u00e9gi inf\u00f3 a sys.sql_expression_dependencies t\u00e1bl\u00e1ban, de a sys.dm_sql_referenced_entities ezekr\u0151l is \u00f6sszeszedi az inf\u00f3kat, ez\u00e9rt ha teljesk\u00f6r\u0171 f\u00fcgg\u0151s\u00e9gi inf\u00f3ra van sz\u00fcks\u00e9g, ink\u00e1bb a f\u00fcggv\u00e9ny haszn\u00e1lat\u00e1t javaslom.<\/p>\n<p>\u00c9s l\u00e1t\u00e1 Isten, hogy ez j\u00f3. (Rem\u00e9lem, majd elv\u00e1lik. :)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>H\u00e1t igen, f\u00fcgg\u0151s\u00e9gek. Ez az a t\u00e9ma, amivel ki lehet kergetni a vil\u00e1gb\u00f3l egy SQL Server DBA-t. Mindenki tudja, hogy az SQL&#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,58],"tags":[],"class_list":["post-462","post","type-post","status-publish","format-standard","hentry","category-adatbazisok","category-szakmai-elet","category-sql-server","category-sql-server-2008"],"_links":{"self":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/462","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=462"}],"version-history":[{"count":0,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/462\/revisions"}],"wp:attachment":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=462"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=462"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=462"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}