• No se han encontrado resultados

PROCEDIMIENTOS ALMACENADOS. Transact-SQL

N/A
N/A
Protected

Academic year: 2021

Share "PROCEDIMIENTOS ALMACENADOS. Transact-SQL"

Copied!
10
0
0

Texto completo

(1)

PROCEDIMIENTOS ALMACENADOS

Los procedimientos almacenados son módulos o rutinas que encapsulan código para su reutilización. Un procedimiento almacenado puede incluir parámetros de entrada, devolver resultados tabulares o escalares y mensajes para el cliente, invocar instrucciones de

lenguaje de definición de datos (DDL) e instrucciones de lenguaje de manipulación de datos (DML), así como devolver parámetros de salida. En SQL Server 2008 existen dos tipos de procedimientos almacenados: Transact-SQL o CLR.

Transact-SQL

Un procedimiento almacenado Transact-SQL es una colección guardada de instrucciones Transact-SQL que puede tomar y devolver los parámetros proporcionados por el usuario. Por ejemplo, un procedimiento almacenado puede contener las instrucciones necesarias para insertar una nueva fila en una o más tablas según la información suministrada por la aplicación cliente o es posible que el procedimiento almacenado devuelva datos de la base de datos a la aplicación cliente.

Los procedimientos almacenados de MicrosoftSQL Server son similares a los procedimientos de otros lenguajes de programación en el sentido de que pueden:

 Aceptar parámetros de entrada y devolver varios valores en forma de parámetros de salida al lote o al procedimiento que realiza la llamada.

 Contener instrucciones de programación que realicen operaciones en la base de datos, incluidas las llamadas a otros procedimientos.

 Devolver un valor de estado a un lote o a un procedimiento que realiza una llamada para indicar si la operación se ha realizado correctamente o se han producido errores (y el motivo de éstos).

Puede utilizar la instrucción EXECUTE de Transact-SQL para ejecutar un procedimiento almacenado. Los procedimientos almacenados difieren de las funciones en que no

devuelven valores en lugar de sus nombres ni pueden utilizarse directamente en una expresión.

Utilizar procedimientos almacenados en SQL Server en vez de programas Transact-SQL almacenados localmente en equipos cliente presenta las siguientes ventajas:

 Se registran en el servidor.

 Pueden incluir atributos de seguridad (como permisos) y cadenas de propiedad; además se les pueden asociar certificados.

(2)

Los usuarios pueden disponer de permiso para ejecutar un procedimiento almacenado sin necesidad de contar con permisos directos en los objetos a los que se hace referencia en el procedimiento.

 Mejoran la seguridad de la aplicación.

 Permiten una programación modular.

Puede crear el procedimiento una vez y llamarlo desde el programa tantas veces como desee. Así, puede mejorar el mantenimiento de la aplicación y permitir que las aplicaciones tengan acceso a la base de datos de manera uniforme.

 Constituyen código con nombre que permite el enlace diferido.

Esto proporciona un nivel de direccionamiento indirecto que facilita la evolución del código.

 Pueden reducir el tráfico de red.

Una operación que necesite centenares de líneas de código Transact-SQL puede realizarse mediante una sola instrucción que ejecute el código en un procedimiento, en vez de enviar cientos de líneas de código por la red.

Entre las reglas para diseñar procedimientos almacenados se incluyen las siguientes:

 La propia definición de CREATE PROCEDURE puede incluir cualquier número y tipo de instrucciones SQL, excepto las indicadas a continuación. No pueden

utilizarse en ninguna parte de un procedimiento almacenado.

Puede crear otros objetos de base de datos dentro de un procedimiento almacenado. Puede hacer referencia a un objeto creado en el mismo procedimiento almacenado, siempre que se haya creado antes de hacer referencia a él.

 Puede hacer referencia a tablas temporales dentro de un procedimiento almacenado.

 Si crea una tabla temporal local dentro de un procedimiento almacenado, ésta existirá únicamente para los fines del procedimiento y desaparecerá cuando éste finalice.

 Si ejecuta un procedimiento almacenado que llama a otro procedimiento almacenado, este último puede tener acceso a todos los objetos creados por el primero, incluidas las tablas temporales.

CREATE AGGREGATE CREATE RULE

CREATE DEFAULT CREATE SCHEMA

CREATE o ALTER FUNCTION CREATE o ALTER TRIGGER CREATE o ALTER PROCEDURE CREATE o ALTER VIEW

SET PARSEONLY SET SHOWPLAN_ALL

SET SHOWPLAN_TEXT SET SHOWPLAN_XML

(3)

 Si ejecuta un procedimiento almacenado remoto que realiza cambios en una instancia remota de MicrosoftSQL Server, los cambios no se pueden revertir. Los procedimientos almacenados remotos no intervienen en las transacciones.

 El número máximo de parámetros en un procedimiento almacenado es de 2100.

 El número máximo de variables locales en un procedimiento almacenado está limitado únicamente por la memoria disponible.

 En función de la memoria disponible, el tamaño máximo de un procedimiento almacenado es de 128 megabytes (MB).

CREATE PROCEDURE (Transact-SQL)

Crea un procedimiento almacenado Transact-SQL o Common Language Runtime (CLR) en SQL Server 2008 R2. Los procedimientos almacenados son similares a los procedimientos de otros lenguajes de programación en tanto que pueden:

 Aceptar parámetros de entrada y devolver varios valores en forma de parámetros de salida al lote o al procedimiento que realiza la llamada.

 Contener instrucciones de programación que realicen operaciones en la base de datos, incluidas las llamadas a otros procedimientos.

 Devolver un valor de estado a un lote o a un procedimiento que realice una llamada para indicar si la operación se ha realizado correctamente o se han producido errores, y el motivo de estos.

Sintaxis

Transact-SQL

--Transact-SQL Stored Procedure Syntax

CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ;number ] [ { @parameter [ type_schema_name. ] data_type }

[ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY]

] [ ,...n ]

[ WITH <procedure_option> [ ,...n ] ] [ FOR REPLICATION ]

AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] } [;] <procedure_option> ::= [ ENCRYPTION ] [ RECOMPILE ] [ EXECUTE AS Clause ] Transact-SQL

--CLR Stored Procedure Syntax

CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ;number ] [ { @parameter [ type_schema_name. ] data_type }

[ = default ] [ OUT | OUTPUT ] [READONLY] ] [ ,...n ]

[ WITH EXECUTE AS Clause ]

(4)

[;]

Argumentos

schema_name }

El nombre del esquema al que pertenece el procedimiento. Los procedimientos se enlazan a un esquema. Si no se especifica el nombre del esquema cuando se crea el procedimiento, se asigna automáticamente el esquema predeterminado del usuario que crea este

procedimiento. procedure_name

El nombre del procedimiento. Los nombres de los procedimientos deben cumplir las reglas de los identificadores y deben ser exclusivos en el esquema.

Evite el uso del prefijo sp_ cuando asigne nombre a los procedimientos. SQL Server usa este prefijo para designar los procedimientos del sistema. Si usa el prefijo, puede provoca la ruptura del código de la aplicación si existe un procedimiento del sistema con el mismo nombre.

; number

Entero opcional que se usa para agrupar procedimientos con el mismo nombre. Estos procedimientos agrupados se pueden quitar juntos mediante una instrucción DROP PROCEDURE.

@ parameter

Parámetro declarado en el procedimiento. Especifique un nombre de parámetro con una arroba (@) como el primer carácter. El nombre del parámetro se debe ajustar a las reglas de los

identificadores. Los parámetros son locales respecto al procedimiento; los mismos nombres de parámetro se pueden usar en otros procedimientos.

Se pueden declarar uno o varios parámetros; el valor máximo es 2.100. El usuario debe proporcionar el valor de cada parámetro declarado cuando se llame al procedimiento, a menos que se haya definido un valor predeterminado para el parámetro o se haya establecido en el mismo valor que el de otro parámetro. Si un procedimiento contiene parámetros con valores de tabla y el parámetro no está en la llamada, se pasa una tabla vacía. Los parámetros solo pueden ocupar el lugar de expresiones constantes; no se pueden usar en lugar de nombres de tabla, nombres de columna o nombres de otros objetos de base de datos. No se pueden declarar los parámetros si se especifica FOR REPLICATION. [ type_schema_name. ] data_type

El tipo de datos del parámetro y el esquema al que pertenece el tipo de datos.

VARYING

Especifica el conjunto de resultados admitido como parámetro de salida. Este parámetro lo crea de forma dinámica el procedimiento y su contenido puede variar. Solo se aplica a los parámetros de tipo cursor. Esta opción no es válida para los procedimientos CLR.

default

Valor predeterminado de un parámetro. Si se define un valor predeterminado para un parámetro, el procedimiento se puede ejecutar sin especificar ningún valor para ese parámetro. El valor predeterminado debe ser una constante o puede ser NULL. El valor

(5)

constante puede tener el formato de un carácter comodín, lo que permite usar la palabra clave LIKE cuando se pase el parámetro al procedimiento. Vea el ejemplo C más adelante. Los valores predeterminados solo se registran en la columna sys.parameters.default de los procedimientos CLR. Esa columna será NULL para los parámetros de procedimientos Transact-SQL.

OUT | OUTPUT

Indica que se trata de un parámetro de salida. Use los parámetros OUTPUT para devolver valores al autor de la llamada del procedimiento. Los parámetros text, ntext e image no se pueden usar como parámetros OUTPUT, a menos que se trate de un procedimiento CLR. Un parámetro de salida puede ser un marcador de posición de cursor, a menos que el procedimiento sea un procedimiento CLR. Un tipo de datos con valores de tabla no se puede especificar como parámetro OUTPUT de un procedimiento.

READONLY

Indica que el parámetro no se puede actualizar ni modificar en el cuerpo del procedimiento. Si el tipo de parámetro es un tipo con valores de tabla, se debe especificar READONLY.

RECOMPILE

Indica que Motor de base de datos no almacena en caché ningún plan de consulta para este procedimiento, forzándolo a ser compilado cada vez que se ejecute. Para obtener más información sobre las razones para forzar una nueva compilación, vea Volver a compilar procedimientos almacenados. Esta opción no se puede usar cuando se especifica FOR REPLICATION ni para procedimientos CLR.

Para indicar a Motor de base de datos que descarte planes de consulta para consultas individuales en un procedimiento, use la sugerencia de consulta RECOMPILE en la definición de la consulta. Para obtener más información, vea Sugerencias de consulta (Transact-SQL).

ENCRYPTION

Indica que SQL Server convertirá el texto original de la instrucción CREATE

PROCEDURE en un formato confuso. La salida de la ofuscación no se ve directamente en ninguna de las vistas de catálogo de SQL Server. Los usuarios que no dispongan de acceso a las tablas del sistema o a los archivos de base de datos no pueden recuperar el texto confuso. Sin embargo, estará disponible para los usuarios con privilegios que puedan obtener acceso a las tablas del sistema a través del puerto DAC o directamente a los archivos de base de datos. Además, los usuarios que puedan adjuntar un depurador al proceso del servidor pueden recuperar el

(6)

procedimiento descifrado de la memoria en tiempo de ejecución. Para obtener más

información acerca del acceso a los metadatos del sistema, vea Configuración de visibilidad de los metadatos.

Esta opción no es válida para los procedimientos CLR.

Los procedimientos creados mediante esta opción no se pueden publicar como parte de la replicación de SQL Server.

EXECUTE AS

Especifica el contexto de seguridad en el que se ejecuta el procedimiento. Para obtener más información, vea EXECUTE AS (cláusula de Transact-SQL).

FOR REPLICATION

Especifica que el procedimiento se crea para replicación. Por consiguiente, no se puede ejecutar en el suscriptor. Se usa un procedimiento creado con la opción FOR

REPLICATION como filtro de procedimiento y solo se ejecuta durante la replicación. No se pueden declarar los parámetros si se especifica FOR REPLICATION. No se puede especificar FOR REPLICATION en los procedimientos CLR. La opción RECOMPILE se ignora en el caso de procedimientos creados con FOR REPLICATION.

Un procedimiento FOR REPLICATION tendrá un tipo de objeto RF en sys.objects y sys.procedures.

{ [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }

Una o más instrucciones Transact-SQL que comprenden el cuerpo del procedimiento. Puede usar las palabras clave BEGIN y END opcionales para incluir las instrucciones. Para obtener información, vea las secciones Prácticas recomendadas, Comentarios generales, así como Limitaciones y restricciones que aparecen más adelante.

EXTERNAL NAME assembly_name.class_name.method_name

Especifica el método de un ensamblado de .NET Framework para que un procedimiento almacenado CLR haga referencia a él. El parámetro class_name debe ser un identificador válido de SQL Server y debe existir como clase en el ensamblado. Si la clase tiene un nombre completo de espacio de nombres que utiliza un punto (.) para separar las partes del espacio de nombres, el nombre de la clase debe delimitarse

mediante paréntesis ([]) o comillas (""). El método especificado debe ser un método estático de la clase.

De manera predeterminada, SQL Server no puede ejecutar código CLR. Se pueden crear, modificar y quitar objetos de bases de datos que hagan referencia a módulos de Common Language Runtime; sin embargo, estas referencias no se pueden ejecutar en SQL Server hasta que se habilite la opción clr enabled. Para habilitar esta opción, use sp_configure. La ejecución de un procedimiento almacenado extendido tiene estas características:

 La función de procedimiento almacenado extendido se ejecuta en el contexto de seguridad de MicrosoftSQL Server.

(7)

 La función de procedimiento almacenado extendido se ejecuta en el espacio de procesos de SQL Server.

 El subproceso asociado a la ejecución del procedimiento almacenado extendido es el mismo que se utiliza para la conexión de cliente.

El procedimiento almacenado extendido se puede ejecutar desde Transact-SQL como un procedimiento almacenado utilizando la instrucción EXECUTE:

EXECUTE @retval = xp_extendedProcName @param1, @param2 OUTPUT

Parámetros

@ retval Es un valor devuelto. @ param1 Es un parámetro de entrada. @ param2 Es un parámetro de entrada/salida.

TRIGGER, DISPARADOR O DESENCADENADOR

Un trigger (o disparador) en una Base de datos , es un procedimiento que se ejecuta cuando se cumple una condición establecida al realizar una operación. Dependiendo de la base de datos, los triggers pueden ser de inserción (INSERT), actualización (UPDATE) o borrado (DELETE). Algunas bases de datos pueden ejecutar triggers al crear, borrar o editar usuarios, tablas, bases de datos u otros objetos.

Usos

Son usados para mejorar la administración de la Base de datos, sin necesidad de contar con que el usuario ejecute la sentencia de SQL. Además, pueden generar valores de columnas, previene errores de datos, sincroniza tablas, modifica valores de una vista, etc. Permite implementar programas basados en paradigma lógico (sistemas expertos, deducción).

Componentes principales

La estructura básica de un trigger es:

Llamada de activación: es la sentencia que permite "disparar" el código a ejecutar.

Restricción: es la condición necesaria para realizar el código. Esta restricción puede

ser de tipo condicional o de tipo nulidad.

Acción a ejecutar: es la secuencia de instrucciones a ejecutar una vez que se han

(8)

Tipos

Existen dos tipos de disparadores que se clasifican según la cantidad de ejecuciones a realizar:

Row Triggers (o Disparadores de fila): son aquellas que se ejecutaran n-veces si se llama n-veces desde la tabla asociada al trigger

Statement Triggers (o Disparadores de secuencia): son aquellos que sin importar la cantidad de veces que se cumpla con la condición, su ejecución es única.

Pueden ser de sesión y almacenados; pero no son de fiar.

Efectos y características

 No aceptan parámetros o argumentos (pero podrían almacenar los datos afectados en tablas temporales)

 No pueden ejecutar las operaciones COMMIT o ROLLBACK por que estas son parte de la sentencia SQL del disparador (únicamente a través de transacciones

autónomas)

 Pueden causar errores de mutaciones en las tablas, si se han escrito de manera deficiente.

Ejemplo

Un sencillo ejemplo (para SQL Server) sería crear un Trigger para insertar un pedido de algún producto cuando la cantidad de éste, en nuestro almacén, sea inferior a un valor dado.

BEFORE UPDATE ON tabla_almacen FOR ALL records

IF :NEW.producto < 100 THEN

INSERT INTO tabla_pedidos(producto) VALUES ('1000'); END IF;

SELECT DBO.POLVE.TEST END

Disparadores en MySQL

Los disparadores son soportados en MySQL a partir de la versión 5.0.2. Algunos de los soportes existentes son los disparadores para las sentencias INSERT, UPDATE y DELETE

El estándar SQL:2003 requiere que los disparadores den a los programadores acceso a las variables de un registro utilizando una sintaxis como REFERENCING NEW AS n. Por ejemplo, si un disparador está monitoreando los cambios en la columna salario, podría escribirse un disparador como:

CREATE TRIGGER ver_salario BEFORE UPDATE ON empleados

(9)

FOR EACH ROW

IF n.salario <> o.salario THEN END IF;

Como en MySQL las sentencias se ejecutan luego de escribir el signo punto y coma (;), cabe destacar que para crear un disparador en MySQL, antes se escribe la sentencia

DELIMITER seguida de un carácter tal como |, la cual asigna la función del punto y coma (;) a otro carácter permitiendo que el disparador sea escrito usando los punto y comas sin que se ejecute mientras se escribe; después de escrito el disparador se escribe nuevamente la sentencia DELIMITER ; para asignar al punto y coma su función habitual.

Disparadores en PostgresQL

Desde 1997 PostgresQL soporta el uso de disparadores, estos pueden anexarse a las tablas pero no a las vistas; aunque a las vistas se les pueden crear reglas.

Al igual que en MySQL los disparadores de PostgresQL se pueden activar luego de sentencias INSERT, UPDATE o DELETE

Cuando hay varios disparadores, se activan en orden alfabético.

Además de permitir el uso de funciones en el lenguaje nativo de PostgresQL, PL/PgSQL, los disparadores también permiten invocar funciones escritas en otros lenguajes como PL/Perl. En Postgres un disparador ejecuta una función la cual contiene el código de lo que se requiere, esto difiere del método expuesto anteriormente para MySQL que escribe el código a ejecutarse dentro del mismo disparador. El siguiente es un ejemplo de disparador creado con su respectiva función:

CREATE OR REPLACE FUNCTION actualizar() RETURNS TRIGGER AS $ejemplo$ BEGIN

NEW.nombre := NEW.nombres || ' ' || NEW.apellidos ; RETURN NEW;

END;

$ejemplo$ LANGUAGE plpgsql;

CREATE TRIGGER ejemplo

BEFORE INSERT OR UPDATE ON tabla

FOR EACH ROW EXECUTE PROCEDURE actualizar();

Trigger DML.

Los trigger DML se ejecutan cuando un usuario intenta modificar datos mediante un evento de lenguaje de manipulación de datos (DML). Los eventos DML son instrucciones

INSERT, UPDATE o DELETE de una tabla o vista. La sintaxis general de un trigger es la siguiente.

CREATE TRIGGER <Trigger_Name, sysname, Trigger_Name> ON <Table_Name, sysname, Table_Name>

(10)

AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE> AS

BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements.

SET NOCOUNT ON;

-- Insert statements for trigger here END

La primera tabla (inserted) solo está disponible en las operaciones INSERT y UPDATE y en ella están los valores resultantes después de la inserción o actualización. Es decir, los datos insertados. Inserted estará vacía en una operación DELETE.

En la segunda (deleted), disponible en las operaciones UPDATE y DELETE, están los valores anteriores a la ejecución de la actualización o borrado. Es decir, los datos que serán borrados. Deleted estará vacía en una operación INSERT.

Trigger DDL

Los trigger DDL se ejecutan en respuesta a una variedad de eventos de lenguaje de definición de datos (DDL). Estos eventos corresponden principalmente a instrucciones CREATE, ALTER y DROP de Transact-SQL, y a determinados procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL.

La sintaxis general de un trigger es la siguiente.

CREATE TRIGGER <trigger_name, sysname, table_alter_drop_safety> ON DATABASE

FOR <data_definition_statements, , DROP_TABLE, ALTER_TABLE> AS

BEGIN ... END

Limitaciones de los triggers. - Solo se pueden aplicar a una tabla específica, es decir, un trigger no sirve para dos o más tablas - El trigger se crea en la base de datos que de trabajo pero desde un trigger puedes hacer referencia a otras bases de datos. - Un Trigger devuelve resultados al programa que lo desencadena de la misma forma que un Stored Procedure aunque no es lo más idóneo, para impedir que una instrucción de asignación devuelva un resultado se puede utilizar la sentencia SET NOCOUNT al principio del Trigger. - Las siguientes instrucciones no se pueden utilizar en los triggers :

ALTER DATABASE CREATE DATABASE

DISK INIT DISK RESIZE DROP DATABASE LOAD DATABASE LOAD LOG RECONFIGURE

Referencias

Documento similar

Un método de estudio aparte de ser una herramienta muy útil al momento de estudiar también nos ayuda a agilizar nuestra mente y tener una buena memoria para futuro?. Palabras

Entre nosotros anda un escritor de cosas de filología, paisano de Costa, que no deja de tener ingenio y garbo; pero cuyas obras tienen de todo menos de ciencia, y aun

The part I assessment is coordinated involving all MSCs and led by the RMS who prepares a draft assessment report, sends the request for information (RFI) with considerations,

o Si dispone en su establecimiento de alguna silla de ruedas Jazz S50 o 708D cuyo nº de serie figura en el anexo 1 de esta nota informativa, consulte la nota de aviso de la

Las lecturas de francobordo/calado se toman para establecer la posición de la flotación y determinar a su vez el desplazamiento del buque en el momento de realizar la prueba

*Correctivo contingente *Correctivo programable.. El mantenimiento correctivo contingente se refiere a las actividades que se realizan en forma inmediata, debido a que algún

El quincenario de los frailes de Filipinas, condena para el Archipiélago los propósitos de nivelación jurídica que para todo territorio español, peninsular o ultramarino, se

Esquema de base de datos del sistema SAI Fuente Propia: Figura Nro 02.. 23 - FIBASE, se almacenará toda la información del módulo de contabilidad y movimientos de caja