{"id":525,"date":"2011-04-26T22:17:45","date_gmt":"2011-04-26T22:17:45","guid":{"rendered":"\/blogs\/jonathan\/post\/Certificate-Signing-Stored-Procedures-in-Multiple-Databases.aspx"},"modified":"2021-03-02T12:39:48","modified_gmt":"2021-03-02T17:39:48","slug":"certificate-signing-stored-procedures-in-multiple-databases","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/certificate-signing-stored-procedures-in-multiple-databases\/","title":{"rendered":"Certificate Signing Stored Procedures in Multiple Databases"},"content":{"rendered":"<p>Yesterday I received an email asking me a question related to my <a href=\"http:\/\/www.sqlservercentral.com\/articles\/Security\/68873\/\" target=\"_blank\" rel=\"noopener\">Using a Certificate Signed Stored Procedure to Execute sp_send_dbmail<\/a> on SQL Server Central that intrigued me enough that I had to put a couple of minutes into actually figuring out what the problem the being encountered was. In the article, I show how to create a stored procedure in a user database that can be used to call sp_send_dbmail without the calling user being in the DatabaseMailUserRole role in msdb, and there are actually a number of uses for this implementation beyond the example that is provided in the article. I use this same method to allow Service Broker activation procedures to send me emails through Database Mail all the time, and there are numerous other cases where you might need to create a stored procedure in one database that executes code in a separate database, where the calling user should not have access to the separate database.<\/p>\n<p>I don\u2019t know the exact use case for the problem that was posed in the email question, but the basic tenet of the question was that there was a stored procedure in one database that needed to be called from multiple databases and the intent was to use the same certificate to sign stored procedures in multiple databases to call this centralized stored procedure without giving the users access to the central database. Is that confusing to you? I confused me initially when I read the email, and it took a second pass for me to actually understand the problem being encountered and then build out a repro of the issue to begin looking at what the problem might be. To keep things simple and non-confusing if that is possible, lets first create two databases, two procedures and build out the basic framework from the article for two user stored procedures.<\/p>\n<pre><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\n-- Create the calling database\nCREATE DATABASE a;\nGO\n-- Create the target database\nCREATE DATABASE b;\nGO\n-- Switch to the target database\nUSE b\nGO\n-- Create a table and insert 10 rows into the table\nCREATE TABLE SomeTable (RowID int identity primary key)\nGO\nINSERT INTO SomeTable DEFAULT VALUES\nGO 10\n-- Create the target stored procedure that selects from the table\n-- in the target database.\nCREATE PROCEDURE Select_SomeTable\nAS\nSELECT * FROM SomeTable\nGO\n-- Switch to the calling database\nUSE a\nGO\n-- Create a stored procedure that calls the stored procedure\n-- in the target database\nCREATE PROCEDURE ExecuteDatabaseB_Select_SomeTable\nWITH EXECUTE AS OWNER\nAS\nEXECUTE b.dbo.Select_SomeTable\nGO\n-- Create a certificate to sign the calling stored procedures with\nCREATE CERTIFICATE &#x5B;SigningCertificate]\nENCRYPTION BY PASSWORD = '$tr0ngp@$w0rd'\nWITH SUBJECT = 'Certificate for signing a Stored Procedure';\nGO\n-- Backup certificate so it can be create in master database\nBACKUP CERTIFICATE &#x5B;SigningCertificate]\nTO FILE = 'c:\\SQLskills\\SigningCertificate.cer';\nGO\n-- Add Certificate to Master Database\nUSE &#x5B;master]\nGO\nCREATE CERTIFICATE &#x5B;SigningCertificate]\nFROM FILE = 'c:\\SQLskills\\SigningCertificate.cer';\nGO\n-- Create a login from the certificate\nCREATE LOGIN &#x5B;SigningLogin]\nFROM CERTIFICATE &#x5B;SigningCertificate];\nGO\n-- The Login must have Authenticate Sever access\n-- per http:\/\/msdn.microsoft.com\/en-us\/library\/ms190785.aspx\nGRANT AUTHENTICATE SERVER TO &#x5B;SigningLogin]\nGO\n-- Create a user in database b for the Login\nUSE b\nGO\nCREATE USER &#x5B;SigningLogin] FROM LOGIN &#x5B;SigningLogin]\nGO\n-- Grant EXECUTE on the target stored procedure to the\n-- certificate based login\nGRANT EXECUTE ON &#x5B;dbo].&#x5B;Select_SomeTable] TO &#x5B;SigningLogin]\nGO\n-- Switch to the calling database\nUSE a\nGO\n-- Sign the procedure with the certificate's private key\nADD SIGNATURE TO OBJECT::&#x5B;ExecuteDatabaseB_Select_SomeTable]\nBY CERTIFICATE &#x5B;SigningCertificate] WITH PASSWORD = '$tr0ngp@$w0rd'\nGO\n\n-- Create a test login to test that the certificate signed procedure\n-- can properly execute the target procedure without the login having\n-- access to the target database or target procedure directly\nUSE master;\nGO\nCREATE LOGIN &#x5B;testuser] WITH PASSWORD=N't3stp@$', DEFAULT_DATABASE=&#x5B;master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF\nGO\n-- Create the test user for the test login in the calling database and\n-- grant it EXECUTE privileges on the calling stored procedure\nUSE &#x5B;a]\nGO\nCREATE USER &#x5B;testuser] FOR LOGIN &#x5B;testuser]GO\nGRANT EXECUTE ON &#x5B;dbo].&#x5B;ExecuteDatabaseB_Select_SomeTable] TO &#x5B;testuser]\nGO\n-- Switch to the test login context\nEXECUTE AS LOGIN = 'testuser'\nEXECUTE a.dbo.ExecuteDatabaseB_Select_SomeTable\nGO\n-- Revert the context back to our sysadmin login\nREVERT\nGO\n<\/pre>\n<p>In the above code, database \u201ca\u201d has a stored procedure that calls a stored procedure in database \u201cb\u201d and the \u201ctestuser\u201d login only has access to database \u201ca\u201d and EXECUTE privileges on the stored procedure in database \u201ca\u201d. The certificate from database \u201ca\u201d is backed up and created in the \u201cmaster\u201d database so that a certificate login can be created from the certificate which has the EXECUTE privilege on the stored procedure in database \u201cb\u201d. The \u201ctestuser\u201d login does not have access to database \u201cb\u201d or any of the objects inside of the database but because the stored procedure in database \u201ca\u201d is signed by the certificate and a login has been created in master from the certificate that has access to EXECUTE the stored procedure in database \u201cb\u201d, the \u201ctestuser\u201d login can execute the stored procedure in database \u201ca\u201d and get access to the information in database \u201cb\u201d without having to have explicit access to database \u201cb\u201d or the stored procedure contained in that database.<\/p>\n<p>At this point everything is essentially in line with the information contained in the SQL Server Central article I wrote, and it works exactly as shown in the article, even though it is all being applied to user databases and objects. Now let\u2019s try to extend this functionality to a third database as a caller of the stored procedure in database \u201cb\u201d by creating a new database, the same stored procedure that was created in database \u201ca\u201d, and then creating the certificate in the new database from the previous backup from database \u201ca\u201d and signing the stored procedure using the same certificate.<\/p>\n<pre><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\n-- Create a third database to create another calling database\n-- and stored procedure to the target database and stored procedure\nCREATE DATABASE c;\nGO\n-- Create the calling stored procedure in the third database\nUSE c\nGO\nCREATE PROCEDURE ExecuteDatabaseB_Select_SomeTable\nWITH EXECUTE AS OWNER\nAS\nEXECUTE b.dbo.Select_SomeTable\nGO\n-- Create the certificate from in the third database from the\n-- previous certificate backup to allow signing of the procedure\nCREATE CERTIFICATE &#x5B;SigningCertificate]\nFROM FILE = 'c:\\SQLskills\\SigningCertificate.cer';\nGO\n-- Sign the procedure with the certificate's private key\nADD SIGNATURE TO OBJECT::&#x5B;ExecuteDatabaseB_Select_SomeTable]\nBY CERTIFICATE &#x5B;SigningCertificate]\nWITH PASSWORD = '$tr0ngp@$w0rd';\nGO\n<\/pre>\n<p>This all works great, right up to the point that we try to sign the stored procedure using the certificate we created from our backup from database \u201ca\u201d. When we try to sign the stored procedure in database \u201cc\u201d we get the following error back from SQL Server:<\/p>\n<blockquote><p><strong>Msg 15556, Level 16, State 1, Line 2<\/strong><br \/>\n<span style=\"color: #ff0000;\">Cannot decrypt or encrypt using the specified certificate, either because it has no private key or because the password provided for the private key is incorrect.<\/span><\/p><\/blockquote>\n<p>So what exactly happened here, the process worked the first time, but now we can\u2019t duplicate it for additional databases that need to call this stored procedure? The problem is that when we backed up the certificate from database \u201ca\u201d we only backed up the certificate, we didn\u2019t backup the certificate\u2019s private key to a separate file, so we can\u2019t use this same certificate in additional databases to sign stored procedures unless we go back and backup the private key from the certificate as well.<\/p>\n<p>To fix the problem, we first have to drop the stored procedure in database \u201cc\u201d and then drop the certificate without its private key from the database as well. Then we will need to take a new backup of the certificate from database \u201ca\u201d and specify the WITH PRIVATE KEY clause to backup the private key for the certificate to a separate private key file so that we can recreate the certificate in database \u201cc\u201d with the correct private key to sign the stored procedure. Once we have done this, we can recreate our stored procedure and sign it with the certificate, then create the database user for the \u201ctestuser\u201d login and grant the database user the EXECUTE privilege on the stored procedure in database \u201cc\u201d, and test the configuration by executing the stored procedure in database \u201cc\u201d to ensure that we get the results from database \u201cb\u201d.<\/p>\n<pre><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\n-- Fix the problem\nUSE &#x5B;c]\nGO\n-- Drop the calling procedure with the invalid signature\n-- Create the calling stored procedure in the third database\nDROP PROCEDURE ExecuteDatabaseB_Select_SomeTable\nGO\n-- Drop the certificate without the private key\nDROP CERTIFICATE &#x5B;SigningCertificate]\nGO\n-- Backup the certificate with its private key so it can be used in\n-- additional databases to sign stored procedures calling the target\n-- stored procedure.\nUSE a\nGO\nBACKUP CERTIFICATE &#x5B;SigningCertificate]\nTO FILE = 'c:\\SQLskills\\SigningCertificate_WithKey.cer'\nWITH PRIVATE KEY (\nFILE = 'c:\\SQLskills\\SigningCertificate_WithKey.pvk',\nENCRYPTION BY PASSWORD = '$tr0ngp@$w0rd',\nDECRYPTION BY PASSWORD = '$tr0ngp@$w0rd');\nGO\n-- Create the certificate in our new database with the private key\n-- from the new certificate backup with the private key.\nUSE c\nGO\nCREATE CERTIFICATE &#x5B;SigningCertificate]\nFROM FILE = 'c:\\SQLskills\\SigningCertificate_WithKey.cer'\nWITH PRIVATE KEY (\nFILE = 'c:\\SQLskills\\SigningCertificate_WithKey.pvk',\nENCRYPTION BY PASSWORD = '$tr0ngp@$w0rd',\nDECRYPTION BY PASSWORD = '$tr0ngp@$w0rd');\nGO\n-- Recreate the calling stored procedure in the third database\nCREATE PROCEDURE ExecuteDatabaseB_Select_SomeTable\nWITH EXECUTE AS OWNER\nAS\nEXECUTE b.dbo.Select_SomeTable\nGO\n-- Sign the procedure with the certificate's private key\nADD SIGNATURE TO OBJECT::&#x5B;ExecuteDatabaseB_Select_SomeTable]\nBY CERTIFICATE &#x5B;SigningCertificate]\nWITH PASSWORD = '$tr0ngp@$w0rd';\nGO\n-- Create the database user for the testuser login and grant it\n-- the EXECUTE privilege on the calling stored procedure\nCREATE USER &#x5B;testuser] FOR LOGIN &#x5B;testuser]\nGO\nGRANT EXECUTE ON &#x5B;dbo].&#x5B;ExecuteDatabaseB_Select_SomeTable] TO &#x5B;testuser]\nGO\n-- Switch to the test login context\nEXECUTE AS LOGIN = 'testuser'\nEXECUTE c.dbo.ExecuteDatabaseB_Select_SomeTable\nGO\n-- Revert the context back to our sysadmin login\nREVERT\nGO\n<\/pre>\n<p>This all works as expected and we\u2019ve resolved our problem. This was a really interesting problem because I had never actually anticipated that someone would use the same certificate in multiple databases to sign multiple stored procedures that perform cross database operations without granting the calling users access to the target database. This repro shows that this is technically possible if you backup the private key for the certificate and restore the private key in the additional databases with the certificate.<\/p>\n<p>See you on the playground!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Yesterday I received an email asking me a question related to my Using a Certificate Signed Stored Procedure to Execute sp_send_dbmail on SQL Server Central that intrigued me enough that I had to put a couple of minutes into actually figuring out what the problem the being encountered was. In the article, I show how [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16,19,25,35],"tags":[],"class_list":["post-525","post","type-post","status-publish","format-standard","hentry","category-certificates","category-database-administration","category-general","category-security"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Certificate Signing Stored Procedures in Multiple Databases - Jonathan Kehayias<\/title>\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\/jonathan\/certificate-signing-stored-procedures-in-multiple-databases\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Certificate Signing Stored Procedures in Multiple Databases - Jonathan Kehayias\" \/>\n<meta property=\"og:description\" content=\"Yesterday I received an email asking me a question related to my Using a Certificate Signed Stored Procedure to Execute sp_send_dbmail on SQL Server Central that intrigued me enough that I had to put a couple of minutes into actually figuring out what the problem the being encountered was. In the article, I show how [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/jonathan\/certificate-signing-stored-procedures-in-multiple-databases\/\" \/>\n<meta property=\"og:site_name\" content=\"Jonathan Kehayias\" \/>\n<meta property=\"article:published_time\" content=\"2011-04-26T22:17:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-03-02T17:39:48+00:00\" \/>\n<meta name=\"author\" content=\"Jonathan Kehayias\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jonathan Kehayias\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/certificate-signing-stored-procedures-in-multiple-databases\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/certificate-signing-stored-procedures-in-multiple-databases\\\/\"},\"author\":{\"name\":\"Jonathan Kehayias\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/#\\\/schema\\\/person\\\/01c10d94f3648654ef706d5e6305f69c\"},\"headline\":\"Certificate Signing Stored Procedures in Multiple Databases\",\"datePublished\":\"2011-04-26T22:17:45+00:00\",\"dateModified\":\"2021-03-02T17:39:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/certificate-signing-stored-procedures-in-multiple-databases\\\/\"},\"wordCount\":994,\"commentCount\":4,\"articleSection\":[\"Certificates\",\"Database Administration\",\"General\",\"Security\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/certificate-signing-stored-procedures-in-multiple-databases\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/certificate-signing-stored-procedures-in-multiple-databases\\\/\",\"url\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/certificate-signing-stored-procedures-in-multiple-databases\\\/\",\"name\":\"Certificate Signing Stored Procedures in Multiple Databases - Jonathan Kehayias\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/#website\"},\"datePublished\":\"2011-04-26T22:17:45+00:00\",\"dateModified\":\"2021-03-02T17:39:48+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/#\\\/schema\\\/person\\\/01c10d94f3648654ef706d5e6305f69c\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/certificate-signing-stored-procedures-in-multiple-databases\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/certificate-signing-stored-procedures-in-multiple-databases\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/certificate-signing-stored-procedures-in-multiple-databases\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Certificates\",\"item\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/category\\\/certificates\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Certificate Signing Stored Procedures in Multiple Databases\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/#website\",\"url\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/\",\"name\":\"Jonathan Kehayias - The Rambling DBA\",\"description\":\"The Rambling DBA\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/#\\\/schema\\\/person\\\/01c10d94f3648654ef706d5e6305f69c\",\"name\":\"Jonathan Kehayias\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/86630e27f5deecc5c393ea57fc7c3b6a068949f4fd6b5309f81de5a276f12855?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/86630e27f5deecc5c393ea57fc7c3b6a068949f4fd6b5309f81de5a276f12855?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/86630e27f5deecc5c393ea57fc7c3b6a068949f4fd6b5309f81de5a276f12855?s=96&d=mm&r=g\",\"caption\":\"Jonathan Kehayias\"},\"sameAs\":[\"http:\\\/\\\/3.209.169.194\\\/blogs\\\/jonathan\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Certificate Signing Stored Procedures in Multiple Databases - Jonathan Kehayias","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\/jonathan\/certificate-signing-stored-procedures-in-multiple-databases\/","og_locale":"en_US","og_type":"article","og_title":"Certificate Signing Stored Procedures in Multiple Databases - Jonathan Kehayias","og_description":"Yesterday I received an email asking me a question related to my Using a Certificate Signed Stored Procedure to Execute sp_send_dbmail on SQL Server Central that intrigued me enough that I had to put a couple of minutes into actually figuring out what the problem the being encountered was. In the article, I show how [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/certificate-signing-stored-procedures-in-multiple-databases\/","og_site_name":"Jonathan Kehayias","article_published_time":"2011-04-26T22:17:45+00:00","article_modified_time":"2021-03-02T17:39:48+00:00","author":"Jonathan Kehayias","twitter_misc":{"Written by":"Jonathan Kehayias","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/certificate-signing-stored-procedures-in-multiple-databases\/#article","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/certificate-signing-stored-procedures-in-multiple-databases\/"},"author":{"name":"Jonathan Kehayias","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/#\/schema\/person\/01c10d94f3648654ef706d5e6305f69c"},"headline":"Certificate Signing Stored Procedures in Multiple Databases","datePublished":"2011-04-26T22:17:45+00:00","dateModified":"2021-03-02T17:39:48+00:00","mainEntityOfPage":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/certificate-signing-stored-procedures-in-multiple-databases\/"},"wordCount":994,"commentCount":4,"articleSection":["Certificates","Database Administration","General","Security"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.sqlskills.com\/blogs\/jonathan\/certificate-signing-stored-procedures-in-multiple-databases\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/certificate-signing-stored-procedures-in-multiple-databases\/","url":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/certificate-signing-stored-procedures-in-multiple-databases\/","name":"Certificate Signing Stored Procedures in Multiple Databases - Jonathan Kehayias","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/#website"},"datePublished":"2011-04-26T22:17:45+00:00","dateModified":"2021-03-02T17:39:48+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/#\/schema\/person\/01c10d94f3648654ef706d5e6305f69c"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/certificate-signing-stored-procedures-in-multiple-databases\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/jonathan\/certificate-signing-stored-procedures-in-multiple-databases\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/certificate-signing-stored-procedures-in-multiple-databases\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/"},{"@type":"ListItem","position":2,"name":"Certificates","item":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/category\/certificates\/"},{"@type":"ListItem","position":3,"name":"Certificate Signing Stored Procedures in Multiple Databases"}]},{"@type":"WebSite","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/#website","url":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/","name":"Jonathan Kehayias - The Rambling DBA","description":"The Rambling DBA","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/#\/schema\/person\/01c10d94f3648654ef706d5e6305f69c","name":"Jonathan Kehayias","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/86630e27f5deecc5c393ea57fc7c3b6a068949f4fd6b5309f81de5a276f12855?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/86630e27f5deecc5c393ea57fc7c3b6a068949f4fd6b5309f81de5a276f12855?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/86630e27f5deecc5c393ea57fc7c3b6a068949f4fd6b5309f81de5a276f12855?s=96&d=mm&r=g","caption":"Jonathan Kehayias"},"sameAs":["http:\/\/3.209.169.194\/blogs\/jonathan"]}]}},"_links":{"self":[{"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/posts\/525","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/comments?post=525"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/posts\/525\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/media?parent=525"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/categories?post=525"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/tags?post=525"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}