es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Crear un alias para un tipo de tabla definido por el usuario en un esquema diferente.

Tengo dos esquemas, uno contiene tablas, procedimientos almacenados, datos generales (a partir de ahora lo llamaremos esquemas de datos). El segundo esquema no contiene más que procedimientos almacenados dentro de él y lo llamaremos esquema de ejecución.

Ahora, el objetivo del esquema de ejecución es que pueda crear un usuario (lo llamaremos usuario externo), que solo tenga acceso a este esquema y solo pueda ejecutar procedimientos almacenados dentro del esquema de ejecución… sin poder seleccionar, actualizar, insertar o eliminar nada (de todos modos no hay tablas en el esquema de ejecución) y sin acceso alguno al esquema de datos. De esta manera, el usuario estará muy restringido en lo que puede hacer.

El punto de todo esto es que cuando se crea un procedimiento almacenado con el “esquema de ejecución”, eleva los derechos del usuario dependiendo de lo que se requiera, sin darle realmente al usuario externo ningún derecho más allá de esa ejecución.

Todo va bien, y puedo ejecutar y obtener datos del esquema de datos con un procedimiento almacenado de prueba. Ahora estoy intentando permitir que uno de los procedimientos almacenados en el esquema de ejecución utilice un tipo de tabla definido por el usuario, que ha sido creado en el esquema de datos. Debido a las restricciones del usuario de no poder ver nada del esquema de datos, esto está resultando ser un problema.

Ahora podría recrear el tipo de datos o moverlo a un esquema compartido… pero esta es una base de datos antigua en producción y idealmente no quiero duplicar tipos o tener que mover cosas definidas por el usuario cada vez que desee permitir acceso al usuario externo.

Así que pensé en utilizar Alias. Aunque cuando intento crear dicho alias, obtengo un error:

Comando:

CREATE TYPE [execute].[udtype1] FROM [data].[udtype1] NOT NULL;

Error:

El tipo base "data.udtype1" no es un tipo de base válido para el tipo de alias.

Aunque no sé cómo hacerlo, he observado que la documentación de Microsoft crea una utf8string y la referencia (espero que esto signifique que lo que quiero hacer se puede hacer y exista):

CREATE ASSEMBLY utf8string  
AUTHORIZATION [dbi]   
FROM 0x4D... ;  
GO  
CREATE TYPE Utf8String   
EXTERNAL NAME utf8string.[Microsoft.Samples.SqlServer.utf8string] ;  
GO  

¿Alguien sabe cómo crear un alias para una tabla definida por el usuario o tiene un enfoque alternativo?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en sql-server, azure, tsql y tipos de datos definidos por el usuario, entiendo el problema mencionado anteriormente. Sin embargo, crear un alias para una tabla definida por el usuario no es posible en SQL Server. Los alias solo se pueden crear para funciones escalares y no para tipos de tablas definidas por el usuario.

    Un enfoque alternativo a este problema es otorgar al usuario externo el permiso para ejecutar los procedimientos almacenados en el esquema de ejecución y proporcionar permiso de EJECUCIÓN en el tipo de tabla definido por el usuario en el esquema de datos. Esto se puede hacer siguiendo los siguientes pasos:

    1. Otorgar permiso de EJECUCIÓN en el procedimiento almacenado en el esquema de ejecución al usuario externo:

      GRANT EXECUTE ON [execute].[nombre_procedimiento_almacenado] TO [usuario_externo];

    2. Otorgar permiso de EJECUCIÓN en el tipo de tabla definido por el usuario en el esquema de datos al usuario externo:

      GRANT EXECUTE ON TYPE::[data].[udtype1] TO [usuario_externo];

    De esta manera, el usuario externo podrá ejecutar el procedimiento almacenado que utiliza el tipo de tabla definido por el usuario, pero no tendrá acceso a ningún otro elemento del esquema de datos.

    Otro enfoque alternativo es utilizar SQL dinámico en el procedimiento almacenado en el esquema de ejecución. Esto permitirá que el procedimiento almacenado acceda al tipo de tabla definido por el usuario sin hacer referencia directa al esquema de datos. Sin embargo, este enfoque debe utilizarse con precaución, ya que puede representar un riesgo de seguridad si no se implementa correctamente.

    En resumen, existen enfoques alternativos a este problema que evitan crear un alias para un tipo de tabla definido por el usuario.

Comments are closed.