{"id":712,"date":"2013-07-11T21:34:18","date_gmt":"2013-07-11T19:34:18","guid":{"rendered":"http:\/\/clemente.pamplona.name\/dba\/?p=712"},"modified":"2013-07-31T12:09:11","modified_gmt":"2013-07-31T10:09:11","slug":"truncate-table-sin-permisos-truncate-any-table","status":"publish","type":"post","link":"http:\/\/clemente.pamplona.name\/dba\/truncate-table-sin-permisos-truncate-any-table\/","title":{"rendered":"Truncate table sin permisos TRUNCATE ANY TABLE"},"content":{"rendered":"<p>Hoy vamos a ver r\u00e1pidamente un tema muy sencillo que puede traernos algun que otro dolor de cabeza. Intentar truncar una tabla de otro esquema.<\/p>\n<p>Supongamos que tenemos una aplicaci\u00f3n que utiliza dos esquemas:<\/p>\n<p>ADMINISTRADOR-> Propietario de los datos y de todos los objetos del esquema<br \/>\nAPLICACION-> Usuario de explotaci\u00f3n de los datos que no tiene objetos  propios y que accede a los datos de ADMINISTRADOR mediante grants<\/p>\n<p>Este modelo de aplicaci\u00f3n es muy com\u00fan ya que nos garantiza que , el esquema APLICACION nunca va a modificar la estructura del modelo de datos, su funcionamiento se base en dar los grants<br \/>\nDELETE, INSERT, SELECT, UPDATE  para todas las tablas del esquema ADMINISTRADOR, lo que permite a el usuario APLICACION  borrar todos los datos de una tabla de ADMINISTRADOR, pero no es posible que lleve a cabo una acci\u00f3n de truncado, ya que , para Oracle el truncado  es una acci\u00f3n distinta a el borrado (no lo hace sobre los datos sino sobre la propia tabla).<\/p>\n<p>El problema con el que nos encontramos es que, oracle no contempla el otorgar un permiso \u00abTRUNCATE TABLE\u00bb a un usuario sobre los objetos de otro usuario, el \u00fanico permiso que contempla es el de \u00abTRUNCATE ANY TABLE\u00bb; lo que es una brecha de seguridad ya que permitir\u00eda al usuario APLICACION el truncar cualquier tabla de cualquier otro esquema de la base datos.<\/p>\n<p>\u00bfComo se soluciona el problema?<\/p>\n<p>La soluci\u00f3n es muy sencilla, y pasa por hacer una funcion en el esquema ADMINISTRADOR que trunque la tabla que le pasamos por par\u00e1metro.<br \/>\nEL procedure ser\u00eda tal que <\/p>\n<pre>\r\n\r\ncreate or replace procedure truncartabla(tabla_a_truncar varchar2) \r\nis\r\n begin\r\n    execute immediate 'truncate table ' || tabla_a_truncar ;\r\n end;\r\n\r\n\r\n<\/pre>\n<p>Despues de eso , deberemos de dar permisos de ejecuci\u00f3n sobre este procedimiento al usuario APLICACION  (seguimos como usuario ADMINISTRADOR)<\/p>\n<pre>\r\n\r\n grant execute on truncartabla to APLICACION\r\n\r\n<\/pre>\n<p>Ahora   ya podremos truncar tablas desde el usuario expfin, el \u00fanico cambio que habr\u00e1 que hacer es, en el c\u00f3digo SQL donde pone<\/p>\n<pre>\r\n\r\nTRUNCATE TABLE ADMINISTRADOR.TABLA1\r\n\r\n<\/pre>\n<p>por <\/p>\n<pre>\r\n\r\nexecute ADMINISTRADOR.truncartabla('TABLA1');\r\n\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Hoy vamos a ver r\u00e1pidamente un tema muy sencillo que puede traernos algun que otro dolor de cabeza. Intentar truncar una tabla de otro esquema. Supongamos que tenemos una aplicaci\u00f3n que utiliza dos esquemas: ADMINISTRADOR-> Propietario de los datos y &hellip; <a href=\"http:\/\/clemente.pamplona.name\/dba\/truncate-table-sin-permisos-truncate-any-table\/\">Sigue leyendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,114,7],"tags":[253,116,248,256,115],"class_list":["post-712","post","type-post","status-publish","format-standard","hentry","category-dummie","category-plsql","category-sqlplus","tag-cliente","tag-desarrollo","tag-dummie","tag-plsql","tag-truncate"],"_links":{"self":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts\/712","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/comments?post=712"}],"version-history":[{"count":7,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts\/712\/revisions"}],"predecessor-version":[{"id":719,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts\/712\/revisions\/719"}],"wp:attachment":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/media?parent=712"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/categories?post=712"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/tags?post=712"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}