{"id":1438,"date":"2020-05-21T15:28:23","date_gmt":"2020-05-21T15:28:23","guid":{"rendered":"http:\/\/manualsqlserver.com\/?p=1438"},"modified":"2020-05-21T15:28:24","modified_gmt":"2020-05-21T15:28:24","slug":"triggers-encriptados-sql-server","status":"publish","type":"post","link":"https:\/\/manualsqlserver.com\/?p=1438","title":{"rendered":"Triggers encriptados SQL Server"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"219\" height=\"233\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQLServer_TriggersEncriptados_D1.png\" alt=\"\" class=\"wp-image-1439\"\/><\/figure>\n\n\n\n<p class=\"has-large-font-size\"><strong>Triggers &#8211; Encriptaci\u00f3n<\/strong><\/p>\n\n\n\n<p>Este art\u00edculo muestra como encriptar un trigger, es importante que en todo nivel exista un cuidado con las instrucciones que realiza el trigger, la opci\u00f3n de encriptaci\u00f3n evita que de alguna forma se pueda visualizar las instrucciones del Trigger usando el procedimiento almacenado (<a href=\"https:\/\/manualsqlserver.com\/?p=314\">Ver Procedimientos Almacenados<\/a>) <strong>sp_helpText<\/strong>.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Los triggers DML son procedimientos que se disparan cuando en una tabla o vista se realizan las instrucciones Insert, Update o Delete. Para mayor informaci\u00f3n <a href=\"https:\/\/manualsqlserver.com\/?p=385\">Ver Triggers<\/a>. <\/p>\n\n\n\n<p>Como se describe en el art\u00edculo de Triggers, estos permiten ejecutar un conjunto de instrucciones al realizar instrucciones de inserci\u00f3n, modificaci\u00f3n o eliminaci\u00f3n de registros y es importante proteger estas instrucciones, para eso podemos encriptarlos usando la opci\u00f3n \u00ab<strong>with encryption<\/strong>\u00ab.<\/p>\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Encriptando un Trigger<\/strong><\/p>\n\n\n\n<p>Para crear un Trigger DML encriptado se utiliza:<br>CREATE [ OR ALTER ] TRIGGER [ Esquema . ]NombreTrigger<br>ON { tabla | vista } <strong>with encryption<\/strong><br>{ FOR | AFTER | INSTEAD OF }<br>{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }<br>AS<br>Begin<br>Instrucciones T-SQL<br>End<br>Note que despu\u00e9s del nombre de la tabla o vista se utiliza la cl\u00e1usula with encryption.<\/p>\n\n\n\n<p>Ejercicio<br>Usando la base de datos Northwind<br>use Northwind<br>go<\/p>\n\n\n\n<p><strong>Crear un trigger para que se dispare cuando se actualiza una Region<\/strong><br>Create trigger trRegionActualiza on<br>Region with encryption<br>for update<br>As<br>Begin<br>Print &#8216;Se actualizaron los datos&#8217;<br>End<br>go<br><strong>Si se desea ver el texto del Trigger podemos utilizar el procedimiento almacenados sp_helptext.<br><\/strong>sp_helpText trRegionActualiza<br>go<br><strong>El mensaje que aparece es: El texto para el objeto &#8216;trRegionActualiza&#8217; est\u00e1 cifrado.<\/strong><\/p>\n\n\n\n<p>Al actualizar los datos de una regi\u00f3n se dispara el trigger, mostrando el<br>mensaje.<\/p>\n\n\n\n<p>Primero mostramos los registros para actualizar uno de ellos, el registro<br>con c\u00f3digo 4 se cambiar\u00e1 la descripci\u00f3n por Sur.<br>select * from Region<br>go<\/p>\n\n\n\n<p>Actualizar Region<br>update Region set RegionDescription = &#8216;Sur&#8217;<br>where RegionID = 4<br>go<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQLServer_Triggers_ActivarDesactivar_02.png\" alt=\"\" class=\"wp-image-1429\" width=\"662\" height=\"324\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQLServer_Triggers_ActivarDesactivar_02.png 572w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQLServer_Triggers_ActivarDesactivar_02-300x147.png 300w\" sizes=\"auto, (max-width: 662px) 100vw, 662px\" \/><\/figure><\/div>\n\n\n\n<p><strong>Crear un trigger para Region que no permita insertar o modificar una regi\u00f3n con la descripci\u00f3n de una regi\u00f3n existente. Inicialmente se crear\u00e1 el Trigger sin encriptaci\u00f3n.<\/strong><\/p>\n\n\n\n<p>Create trigger trRegionInsertaModificaSinDuplicado<br>on Region<br>for Insert, Update<br>As<br>Begin &#8212; Inicio del Trigger<br>&#8212; Contar la cantidad de registros con la misma descripci\u00f3n<br>if (select Count(Region.RegionID) from inserted, Region<br>where inserted.RegionDescription = Region.RegionDescription)&gt;1<br>Begin<br>Rollback transaction &#8212; Anula la inserci\u00f3n o actualizaci\u00f3n<br>Print &#8216;No se realiz\u00f3 la transacci\u00f3n&#8217;<br>End<br>Else<br>Begin<br>Print &#8216;Se realiz\u00f3 la inserci\u00f3n o modificaci\u00f3n\u2026&#8217;<br>End<br>End &#8212; Final del Trigger<br>go<\/p>\n\n\n\n<p>Visualizar el texto del objeto (Trigger) usando sp_helptext.<br>sp_helptext trRegionInsertaModificaSinDuplicado<br>go<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQLServer_TriggersEncriptados_01.png\" alt=\"\" class=\"wp-image-1437\" width=\"499\" height=\"552\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQLServer_TriggersEncriptados_01.png 338w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQLServer_TriggersEncriptados_01-271x300.png 271w\" sizes=\"auto, (max-width: 499px) 100vw, 499px\" \/><\/figure><\/div>\n\n\n\n<p><strong>Modificar el Trigger y encriptarlo<\/strong><br>Alter trigger trRegionInsertaModificaSinDuplicado<br>on Region <strong>with encryption<\/strong><br>for Insert, Update<br>As<br>Begin &#8212; Inicio del Trigger<br>&#8212; Contar la cantidad de registros con la misma descripci\u00f3n<br>if (select Count(Region.RegionID) from inserted, Region<br>where inserted.RegionDescription = Region.RegionDescription)>1<br>Begin<br>Rollback transaction &#8212; Anula la inserci\u00f3n o actualizaci\u00f3n<br>Print &#8216;No se realiz\u00f3 la transacci\u00f3n&#8217;<br>End<br>Else<br>Begin<br>Print &#8216;Se realiz\u00f3 la inserci\u00f3n o modificaci\u00f3n\u2026&#8217;<br>End<br>End &#8212; Final del Trigger<br>go<\/p>\n\n\n\n<p><strong>Visualizar el texto del objeto (Trigger) usando sp_helptext.<\/strong><br>sp_helptext trRegionInsertaModificaSinDuplicado<br>go<br><strong>El mensaje es: El texto para el objeto &#8216;trRegionInsertaModificaSinDuplicado&#8217; est\u00e1 cifrado.<\/strong><\/p>\n\n\n\n<p>Probando el Trigger<br>Ver las regiones<br>select * from Region<br>go<br>Insertar una regi\u00f3n<br>insert into Region values (25,&#8217;Ica&#8217;)<br>go<br>Insertar una regi\u00f3n con la misma descripci\u00f3n de una existente (Ica)<br>insert into Region values (255,&#8217;Ica&#8217;)<br>go<br><\/p>\n\n\n\n<p><strong>Crear un trigger en Region que no permita borrar mas de un registro<br><\/strong>Create trigger trRegionBorrarUnRegistro on Region with encryption<br>for Delete<br>As<br>Begin<br>If (Select Count(*) from deleted) > 1<br>Begin<br>Rollback transaction<br>Print &#8216;No se puede borrar mas de un registro\u2026&#8217;<br>End<br>End<br>go<\/p>\n\n\n\n<p>Ver los registros de Region<br>select * from Region<br>go<\/p>\n\n\n\n<p>Eliminar un registro de Region<br>delete Region where RegionID = 56<br>go<\/p>\n\n\n\n<p>Eliminar varios registros<br>delete Region where RegionID in (34,87,25)<br>go<br>\/* Mensaje<br>No se puede borrar mas de un registro\u2026<br>Mens. 3609, Nivel 16, Estado 1, L\u00ednea 80<br>La transacci\u00f3n termin\u00f3 en el desencadenador. Se anul\u00f3 el lote.<br>*\/<\/p>\n\n\n\n<p>Si se debe eliminar los registros, hay que desactivar o eliminar el Trigger<br>&#8212; Desactivar el Trigger<br>Disable Trigger NombreTrigger on Tabla\/Vista<\/p>\n\n\n\n<p>&#8212; Activar el Trigger<br>Enable Trigger NombreTrigger on Tabla\/Vista<\/p>\n\n\n\n<p>&#8212; Para borrar las regiones con c\u00f3digos 34,87,25<br>&#8212; Desactivar el Trigger trRegionBorrarUnRegistro, borrar los registros y activar el Trigger<br>Disable Trigger trRegionBorrarUnRegistro on Region<br>go<br>delete Region where RegionID in (34,87,25)<br>go<br>Enable Trigger trRegionBorrarUnRegistro on Region<br>go<br>&#8212; Ver los registros<br>select * from Region<br>go<\/p>\n\n\n\n<p>Notas adicionales:<br>Se pueden encriptar tambi\u00e9n Procedimientos Almacenados, Funciones definidas por el usuario y vistas, esto<br>va a permitir un grado mayor de seguridad en los objetos.<br>Para mayor informaci\u00f3n ver: Procedimientos almacenados, Funciones definidas por el usuario y vistas.<\/p>\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Triggers &#8211; Encriptaci\u00f3n Este art\u00edculo muestra como encriptar un trigger, es importante que en todo nivel exista un cuidado con las instrucciones que realiza el trigger, la opci\u00f3n de encriptaci\u00f3n evita que de alguna forma se pueda visualizar las instrucciones del Trigger usando el procedimiento almacenado (Ver Procedimientos Almacenados) sp_helpText.<\/p><p><a class=\"more-link btn\" href=\"https:\/\/manualsqlserver.com\/?p=1438\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":1439,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[143],"tags":[146,59],"class_list":["post-1438","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-triggersql","tag-encryption","tag-triggers","nodate","item-wrap"],"_links":{"self":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/1438","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1438"}],"version-history":[{"count":1,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/1438\/revisions"}],"predecessor-version":[{"id":1440,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/1438\/revisions\/1440"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/media\/1439"}],"wp:attachment":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1438"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1438"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1438"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}