{"id":1068,"date":"2019-12-06T15:11:54","date_gmt":"2019-12-06T23:11:54","guid":{"rendered":"http:\/\/3.209.169.194\/blogs\/erin\/?p=1068"},"modified":"2019-12-06T15:11:54","modified_gmt":"2019-12-06T23:11:54","slug":"encrypted-stored-procedures-and-query-store","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/erin\/encrypted-stored-procedures-and-query-store\/","title":{"rendered":"Encrypted Stored Procedures and Query Store"},"content":{"rendered":"<p>Very often I get interesting questions from the community, and most recently someone asked about encrypted stored procedures and Query Store.\u00a0 Here\u2019s the question (paraphrased):<\/p>\n<blockquote><p><em>I have some encrypted stored procedures in one of my vendor databases.\u00a0 I have enabled Query Store, and I can see query_id values and runtime statistics, and when a query has multiple plans, I can see some of the execution plans, but not others.\u00a0 If I force a plan for a query that\u2019s part of an encrypted stored procedure, will it work?<\/em><\/p><\/blockquote>\n<p>There are two issues here:<\/p>\n<ul>\n<li>Why are only some plans showing up in Query Store for a query that\u2019s part of an encrypted stored procedure?<\/li>\n<li>Can I force a plan for a query that\u2019s part of an encrypted stored procedure?<\/li>\n<\/ul>\n<p>When in doubt, test.<\/p>\n<h2>Setup<\/h2>\n<p>For testing I will use a copy of WideWorldImporters that\u2019s been enlarged, so that there\u2019s some variability in the data.\u00a0 After it\u2019s restored we will enable Query Store and clear out any old data.<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nUSE &#x5B;master];\r\nGO\r\nRESTORE DATABASE &#x5B;WideWorldImporters]\r\n     FROM\u00a0 DISK = N'C:\\Backups\\WideWorldImporters_Bits.bak'\r\n     WITH\u00a0 FILE = 1,\r\n     STATS = 5;\r\nGO\r\n\r\n\/*\r\n     Enable Query Store with settings we want\r\n     (just for testing, not for production)\r\n*\/\r\nUSE &#x5B;master];\r\nGO\r\nALTER DATABASE &#x5B;WideWorldImporters]\r\n     SET QUERY_STORE = ON;\r\nGO\r\n\r\nALTER DATABASE &#x5B;WideWorldImporters] SET QUERY_STORE (\r\n     OPERATION_MODE = READ_WRITE,\r\n     CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30),\r\n     DATA_FLUSH_INTERVAL_SECONDS = 60,\r\n     INTERVAL_LENGTH_MINUTES = 30,\r\n     MAX_STORAGE_SIZE_MB = 100,\r\n     QUERY_CAPTURE_MODE = ALL,\r\n     SIZE_BASED_CLEANUP_MODE = AUTO,\r\n     MAX_PLANS_PER_QUERY = 200)\r\nGO\r\n\r\n\/*\r\n     Clear out any old data, just in case\r\n     (not for production either!)\r\n*\/\r\nALTER DATABASE &#x5B;WideWorldImporters]\r\n     SET QUERY_STORE CLEAR;\r\nGO\r\n<\/pre>\n<p>With the database restored, we will create our encrypted stored procedure:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nUSE &#x5B;WideWorldImporters];\r\nGO\r\n\r\nDROP PROCEDURE IF EXISTS &#x5B;Sales].&#x5B;usp_CustomerTransactionInfo];\r\nGO\r\n\r\nCREATE PROCEDURE &#x5B;Sales].&#x5B;usp_CustomerTransactionInfo]\r\n     @CustomerID INT\r\nWITH ENCRYPTION\r\nAS\r\n     SELECT &#x5B;CustomerID], SUM(&#x5B;AmountExcludingTax])\r\n     FROM &#x5B;Sales].&#x5B;CustomerTransactions]\r\n     WHERE &#x5B;CustomerID] = @CustomerID\r\n     GROUP BY &#x5B;CustomerID];\r\nGO\r\n<\/pre>\n<h2>Testing<\/h2>\n<p>To create two different plans, we will execute the procedure twice, once with a unique value (1092), and once with a non-unique value (401), with a sp_recompile in between:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nEXEC &#x5B;Sales].&#x5B;usp_CustomerTransactionInfo] 1092;\r\nGO\r\n\r\nsp_recompile 'Sales.usp_CustomerTransactionInfo';\r\nGO\r\n\r\nEXEC &#x5B;Sales].&#x5B;usp_CustomerTransactionInfo] 401;\r\nGO\r\n<\/pre>\n<p>Note that if you enable the actual query plan option in Management Studio, no plan will appear.\u00a0 You won\u2019t find a plan in the plan cache (sys.dm_exec_query_plan), nor will you find one if you run Profiler or Extended Events.\u00a0 But when you use encrypted stored procedures and Query Store, you can get the plan:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nSELECT\r\n     &#x5B;qsq].&#x5B;query_id],\r\n     &#x5B;qsp].&#x5B;plan_id],\r\n     &#x5B;qsp].&#x5B;is_forced_plan],\r\n     &#x5B;qsq].&#x5B;object_id],\r\n     &#x5B;rs].&#x5B;count_executions],\r\n     DATEADD(MINUTE, -(DATEDIFF(MINUTE, GETDATE(), GETUTCDATE())),\r\n     &#x5B;qsp].&#x5B;last_execution_time]) AS &#x5B;LocalLastExecutionTime],\r\n     &#x5B;qst].&#x5B;query_sql_text],\r\n     ConvertedPlan = TRY_CONVERT(XML, &#x5B;qsp].&#x5B;query_plan])\r\nFROM &#x5B;sys].&#x5B;query_store_query] &#x5B;qsq]\r\nJOIN &#x5B;sys].&#x5B;query_store_query_text] &#x5B;qst]\r\n     ON &#x5B;qsq].&#x5B;query_text_id] = &#x5B;qst].&#x5B;query_text_id]\r\nJOIN &#x5B;sys].&#x5B;query_store_plan] &#x5B;qsp]\r\n     ON &#x5B;qsq].&#x5B;query_id] = &#x5B;qsp].&#x5B;query_id]\r\nJOIN &#x5B;sys].&#x5B;query_store_runtime_stats] &#x5B;rs]\r\n     ON &#x5B;qsp].&#x5B;plan_id] = &#x5B;rs].&#x5B;plan_id]\r\nWHERE &#x5B;qsq].&#x5B;object_id] = OBJECT_ID(N'Sales.usp_CustomerTransactionInfo')\r\nORDER BY &#x5B;qsq].&#x5B;query_id], &#x5B;qsp].&#x5B;plan_id];\r\nGO\r\n<\/pre>\n<figure id=\"attachment_1069\" aria-describedby=\"caption-attachment-1069\" style=\"width: 1024px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/output1.jpg\"><img fetchpriority=\"high\" decoding=\"async\" class=\"size-large wp-image-1069\" src=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/output1-1024x64.jpg\" alt=\"Query and Plan Info in Query Store\" width=\"1024\" height=\"64\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/output1-1024x64.jpg 1024w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/output1-300x19.jpg 300w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/output1-768x48.jpg 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption id=\"caption-attachment-1069\" class=\"wp-caption-text\">Query and Plan Info in Query Store<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p>Both plans can be viewed, but the query text is not part of the plan, and it is not in Query Store.<\/p>\n<figure id=\"attachment_1071\" aria-describedby=\"caption-attachment-1071\" style=\"width: 868px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/plan_id1.jpg\"><img decoding=\"async\" class=\"size-full wp-image-1071\" src=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/plan_id1.jpg\" alt=\"Plan for query_id 1\" width=\"868\" height=\"380\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/plan_id1.jpg 868w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/plan_id1-300x131.jpg 300w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/plan_id1-768x336.jpg 768w\" sizes=\"(max-width: 868px) 100vw, 868px\" \/><\/a><figcaption id=\"caption-attachment-1071\" class=\"wp-caption-text\">Plan for query_id 1<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<figure id=\"attachment_1072\" aria-describedby=\"caption-attachment-1072\" style=\"width: 1024px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/plan_id2.jpg\"><img decoding=\"async\" class=\"size-large wp-image-1072\" src=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/plan_id2-1024x222.jpg\" alt=\"Plan for query_id 2\" width=\"1024\" height=\"222\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/plan_id2-1024x222.jpg 1024w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/plan_id2-300x65.jpg 300w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/plan_id2-768x166.jpg 768w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/plan_id2.jpg 1144w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption id=\"caption-attachment-1072\" class=\"wp-caption-text\">Plan for query_id 2<\/figcaption><\/figure>\n<p>We can still force a plan, though:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nEXEC sp_query_store_force_plan @query_id = 1, @plan_id = 1;\r\nGO\r\n<\/pre>\n<p>How will we know if a forced plan is used when we run the query?<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nEXEC &#x5B;Sales].&#x5B;usp_CustomerTransactionInfo] 1050;\r\nGO 5\r\n\r\nEXEC &#x5B;Sales].&#x5B;usp_CustomerTransactionInfo] 401;\r\nGO 5\r\n<\/pre>\n<p>Typically, I would run the query in SSMS and get the actual execution plan, and check the UsePlan parameter to see if it\u2019s true.\u00a0 But the plan won\u2019t show up in SSMS, so we have to look in Query Store.\u00a0 If we re-run the query above again, we see that the execution count has increased, and the last_execution_time has also changed.<\/p>\n<figure id=\"attachment_1073\" aria-describedby=\"caption-attachment-1073\" style=\"width: 1024px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/after-forced.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-1073\" src=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/after-forced-1024x65.jpg\" alt=\"Query Store Information After Plan is Forced\" width=\"1024\" height=\"65\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/after-forced-1024x65.jpg 1024w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/after-forced-300x19.jpg 300w, https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/after-forced-768x49.jpg 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption id=\"caption-attachment-1073\" class=\"wp-caption-text\">Query Store Information After Plan is Forced<\/figcaption><\/figure>\n<h2><\/h2>\n<h2>Conclusion<\/h2>\n<p>Based on the data in Query Store, when you force a plan for a query that\u2019s part of an encrypted stored procedure, it is used.\u00a0 You will have to verify its use in Query Store, as other troubleshooting tools (plans, DMVs, XE) do not provide data to confirm.<\/p>\n<p>As for why the execution plan for a query does or does not show up in Query Store, I\u2019m not sure.\u00a0 I couldn\u2019t recreate the behavior where the plan did not appear in Query Store, but I\u2019m hoping the person who sent in the question can help me figure out why.\u00a0 Stay tuned!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Very often I get interesting questions from the community, and most recently someone asked about encrypted stored procedures and Query Store.\u00a0 Here\u2019s the question (paraphrased): I have some encrypted stored procedures in one of my vendor databases.\u00a0 I have enabled Query Store, and I can see query_id values and runtime statistics, and when a query [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[50,46],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.9.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Encrypted Stored Procedures and Query Store - Erin Stellato<\/title>\n<meta name=\"description\" content=\"With ecncrypted stored procedures and Query Store you have the ability to not just see the plans in Query Store, but also force them.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.sqlskills.com\/blogs\/erin\/encrypted-stored-procedures-and-query-store\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Encrypted Stored Procedures and Query Store - Erin Stellato\" \/>\n<meta property=\"og:description\" content=\"With ecncrypted stored procedures and Query Store you have the ability to not just see the plans in Query Store, but also force them.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/erin\/encrypted-stored-procedures-and-query-store\/\" \/>\n<meta property=\"og:site_name\" content=\"Erin Stellato\" \/>\n<meta property=\"article:published_time\" content=\"2019-12-06T23:11:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/output1-1024x64.jpg\" \/>\n<meta name=\"author\" content=\"Erin Stellato\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Erin Stellato\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/encrypted-stored-procedures-and-query-store\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/encrypted-stored-procedures-and-query-store\/\",\"name\":\"Encrypted Stored Procedures and Query Store - Erin Stellato\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/#website\"},\"datePublished\":\"2019-12-06T23:11:54+00:00\",\"dateModified\":\"2019-12-06T23:11:54+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/#\/schema\/person\/76170223ffffa1df03fd9be5b66cb158\"},\"description\":\"With ecncrypted stored procedures and Query Store you have the ability to not just see the plans in Query Store, but also force them.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/encrypted-stored-procedures-and-query-store\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/erin\/encrypted-stored-procedures-and-query-store\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/encrypted-stored-procedures-and-query-store\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Encrypted Stored Procedures and Query Store\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/#website\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/\",\"name\":\"Erin Stellato\",\"description\":\"The SQL Sequel\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/#\/schema\/person\/76170223ffffa1df03fd9be5b66cb158\",\"name\":\"Erin Stellato\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0c8b485bd54ea26b57e99f79b525f409?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0c8b485bd54ea26b57e99f79b525f409?s=96&d=mm&r=g\",\"caption\":\"Erin Stellato\"},\"sameAs\":[\"http:\/\/3.209.169.194\/blogs\/erin\"],\"url\":\"https:\/\/www.sqlskills.com\/blogs\/erin\/author\/erin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Encrypted Stored Procedures and Query Store - Erin Stellato","description":"With ecncrypted stored procedures and Query Store you have the ability to not just see the plans in Query Store, but also force them.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.sqlskills.com\/blogs\/erin\/encrypted-stored-procedures-and-query-store\/","og_locale":"en_US","og_type":"article","og_title":"Encrypted Stored Procedures and Query Store - Erin Stellato","og_description":"With ecncrypted stored procedures and Query Store you have the ability to not just see the plans in Query Store, but also force them.","og_url":"https:\/\/www.sqlskills.com\/blogs\/erin\/encrypted-stored-procedures-and-query-store\/","og_site_name":"Erin Stellato","article_published_time":"2019-12-06T23:11:54+00:00","og_image":[{"url":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-content\/uploads\/2019\/12\/output1-1024x64.jpg"}],"author":"Erin Stellato","twitter_misc":{"Written by":"Erin Stellato","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/erin\/encrypted-stored-procedures-and-query-store\/","url":"https:\/\/www.sqlskills.com\/blogs\/erin\/encrypted-stored-procedures-and-query-store\/","name":"Encrypted Stored Procedures and Query Store - Erin Stellato","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/erin\/#website"},"datePublished":"2019-12-06T23:11:54+00:00","dateModified":"2019-12-06T23:11:54+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/erin\/#\/schema\/person\/76170223ffffa1df03fd9be5b66cb158"},"description":"With ecncrypted stored procedures and Query Store you have the ability to not just see the plans in Query Store, but also force them.","breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/erin\/encrypted-stored-procedures-and-query-store\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/erin\/encrypted-stored-procedures-and-query-store\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/erin\/encrypted-stored-procedures-and-query-store\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/erin\/"},{"@type":"ListItem","position":2,"name":"Encrypted Stored Procedures and Query Store"}]},{"@type":"WebSite","@id":"https:\/\/www.sqlskills.com\/blogs\/erin\/#website","url":"https:\/\/www.sqlskills.com\/blogs\/erin\/","name":"Erin Stellato","description":"The SQL Sequel","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqlskills.com\/blogs\/erin\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.sqlskills.com\/blogs\/erin\/#\/schema\/person\/76170223ffffa1df03fd9be5b66cb158","name":"Erin Stellato","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/erin\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0c8b485bd54ea26b57e99f79b525f409?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0c8b485bd54ea26b57e99f79b525f409?s=96&d=mm&r=g","caption":"Erin Stellato"},"sameAs":["http:\/\/3.209.169.194\/blogs\/erin"],"url":"https:\/\/www.sqlskills.com\/blogs\/erin\/author\/erin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/posts\/1068"}],"collection":[{"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/comments?post=1068"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/posts\/1068\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/media?parent=1068"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/categories?post=1068"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/erin\/wp-json\/wp\/v2\/tags?post=1068"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}