Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Aplica a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Sistema de Plataforma de Analítica (PDW)
Base de datos SQL en Microsoft Fabric
Un procedimiento almacenado de SQL Server es un grupo de una o varias instrucciones Transact-SQL o una referencia a un método de Common Runtime Language (CLR) de Microsoft .NET Framework. Los procedimientos se asemejan a las construcciones de otros lenguajes de programación, porque pueden:
Aceptar parámetros de entrada y devolver varios valores en forma de parámetros de salida al programa que realiza la llamada.
Contener instrucciones de programación que realicen operaciones en la base de datos. Estas instrucciones incluyen la llamada a otros procedimientos.
Devolver un valor de estado a un programa que realiza una llamada para indicar si la operación se ha realizado correctamente o se han producido errores, y el motivo de estos.
Ventajas de usar procedimientos almacenados
En la siguiente lista se describen algunas de las ventajas que brinda el uso de procedimientos.
Tráfico de red reducido entre el cliente y el servidor
Los comandos de un procedimiento se ejecutan en un único lote de código. Este enfoque puede reducir significativamente el tráfico de red entre el servidor y el cliente porque solo se envía la llamada para ejecutar el procedimiento a través de la red. Sin la encapsulación de código que proporciona un procedimiento, cada una de las líneas de código tendría que enviarse a través de la red.
Mayor seguridad
Varios usuarios y programas cliente pueden realizar operaciones en los objetos de base de datos subyacentes a través de un procedimiento, aunque los usuarios y los programas no tengan permisos directos sobre esos objetos subyacentes. El procedimiento controla qué procesos y actividades se llevan a cabo y protege los objetos de base de datos subyacentes. Este enfoque elimina el requisito de conceder permisos en el nivel de objeto individual y simplifica las capas de seguridad.
La cláusula EXECUTE AS puede especificarse en la instrucción CREATE PROCEDURE para habilitar la suplantación de otro usuario o para permitir que los usuarios o las aplicaciones puedan realizar ciertas actividades en la base de datos sin necesidad de contar con permisos directos sobre los objetos y comandos subyacentes. Por ejemplo, algunas acciones, como TRUNCATE TABLE, no tienen permisos que se puedan conceder. Para poder ejecutar TRUNCATE TABLE, el usuario debe tener permisos ALTER en la tabla especificada. Puede que la concesión de permisos ALTER a un usuario en una tabla no sea lo ideal, pues en realidad el usuario tiene permisos muy superiores a la posibilidad de truncar una tabla. Si se incorpora la instrucción TRUNCATE TABLE en un módulo y se especifica la ejecución del módulo como un usuario con permisos para modificar la tabla, se pueden ampliar los permisos para truncar la tabla al usuario al que se concedan permisos EXECUTE para el módulo.
Cuando una aplicación llama a un procedimiento a través de la red, solo está visible la llamada que va a ejecutar el procedimiento. Por tanto, los usuarios malintencionados no pueden ver los nombres de los objetos de la base de datos y las tablas, insertar sus propias instrucciones Transact-SQL ni buscar datos críticos.
El uso de parámetros de procedimientos ayuda a protegerse contra ataques por inyección de código SQL. Dado que la entrada de parámetros se trata como un valor literal y no como código ejecutable, resulta más difícil para un atacante insertar un comando en las instrucciones Transact-SQL del procedimiento y poner en peligro la seguridad.
Puede cifrar procedimientos para ayudar a ofuscar el código fuente. Para más información, consulte SQL Server encryption.
Reutilización del código
El código de cualquier operación de base de datos repetitiva es un candidato perfecto para la encapsulación en procedimientos. Este enfoque elimina las reescrituras innecesarias del mismo código, reduce la incoherencia del código y permite que cualquier usuario o aplicación con los permisos necesarios para acceder y ejecutar el código.
Mantenimiento más sencillo
Cuando las aplicaciones cliente llaman a procedimientos y mantienen las operaciones de base de datos en el nivel de datos, solo es necesario actualizar los procedimientos ante cualquier cambio en la base de datos subyacente. El nivel de aplicación sigue siendo independiente y no tiene que saber ningún cambio en los diseños, relaciones o procesos de la base de datos.
Rendimiento mejorado
De forma predeterminada, un procedimiento compila la primera vez que se ejecuta y crea un plan de ejecución que se reutiliza para las ejecuciones posteriores. Como el procesador de consultas no tiene que crear un nuevo plan, normalmente necesita menos tiempo para procesar el procedimiento.
Si ha habido cambios importantes en las tablas o datos a los que se hace referencia en el procedimiento, el plan precompilado podría hacer que el procedimiento se ejecutara con mayor lentitud. En este caso, volver a crear el procedimiento y forzar un nuevo plan de ejecución puede mejorar el rendimiento.
Tipos de procedimientos almacenados
User-defined
Un procedimiento definido por el usuario se puede crear en una base de datos definida por el usuario o en todas las bases de datos del sistema excepto en la base de datos Resource. El procedimiento se puede desarrollar en Transact-SQL o como referencia a un método de Common Runtime Language (CLR) de .NET Framework.
Temporary
Los procedimientos temporales son una forma de procedimientos definidos por el usuario. Los procedimientos temporales son como un procedimiento permanente, salvo que se almacenan en tempdb. Hay dos tipos de procedimientos temporales: locales y globales. Se diferencian entre sí por los nombres, la visibilidad y la disponibilidad. Los procedimientos temporales locales tienen un signo de número único (#) como primer carácter de sus nombres. Solo son visibles para la conexión de usuario actual y se eliminan cuando se cierra la conexión. Los procedimientos temporales globales tienen dos signos numéricos (##) como los dos primeros caracteres de sus nombres. Son visibles para cualquier usuario después de crearlo y se eliminan al final de la última sesión mediante el procedimiento .
System
Los procedimientos del sistema se incluyen con el motor de base de datos. Se almacenan físicamente en la base de datos interna y oculta Resource y aparecen lógicamente en el esquema de cada base de datos definida por el sistema y definida por el sys usuario. Además, la base de datos msdb también contiene procedimientos almacenados del sistema en el esquema dbo que se usan para programar alertas y trabajos. Dado que los procedimientos del sistema comienzan con el prefijo , no use este prefijo sp_al asignar nombres a procedimientos definidos por el usuario. Para obtener una lista completa de los procedimientos del sistema, consulte Procedimientos almacenados del sistema.
SQL Server admite los procedimientos del sistema que proporcionan una interfaz de SQL Server a los programas externos para varias actividades de mantenimiento. Estos procedimientos extendidos usan el prefijo xp_. Para obtener una lista completa de procedimientos extendidos, consulte Procedimientos almacenados extendidos generales.
Extendido definido por el usuario
Los procedimientos extendidos permiten crear rutinas externas en un lenguaje de programación, como C. Estos procedimientos son bibliotecas DLL que una instancia de SQL Server puede cargar y ejecutar de forma dinámica.
Note
Los procedimientos almacenados extendidos se quitarán en una versión futura de SQL Server. No utilice esta característica en nuevos trabajos de desarrollo y modifique lo antes posible las aplicaciones que actualmente la utilizan. Cree en su lugar procedimientos CLR. Este método constituye una alternativa más consolidada y segura para escribir procedimientos extendidos.
Tareas relacionadas
| Descripción de la tarea | Article |
|---|---|
| Describe cómo se crea un procedimiento almacenado. | Creación de un procedimiento almacenado |
| Describe cómo se modifica un procedimiento almacenado. | Modificar un procedimiento almacenado |
| Describe cómo se elimina un procedimiento almacenado. | Eliminación de un procedimiento almacenado |
| Describe cómo se ejecuta un procedimiento almacenado. | Ejecución de un procedimiento almacenado |
| Describe cómo se conceden permisos en un procedimiento almacenado. | Conceder permisos para un procedimiento almacenado |
| Describe cómo se devuelven datos de un procedimiento almacenado a una aplicación. | Devolución de datos de un procedimiento almacenado |
| Describe cómo se recompila un procedimiento almacenado. | Volver a compilar un procedimiento almacenado |
| Describe cómo se cambia el nombre de un procedimiento almacenado. | Cambiar el nombre de un procedimiento almacenado |
| Describe cómo se consulta la definición de un procedimiento almacenado. | Visualización de la definición de un procedimiento almacenado |
| Describe cómo se consultan las dependencias de un procedimiento almacenado. | Ver las dependencias de un procedimiento almacenado |
| Describe cómo se usan los parámetros en un procedimiento almacenado. | Parameters |