Sunteți pe pagina 1din 26

CREATE RULE (Transact-SQL)

crear una regla transact-SQL


CREATE RULE [ schema _name . ] rule _name
AS condition _expression
[;]

Argumentos
schema_name
Es el nombre del esquema al que pertenece la regla.

rule_name
Es el nombre de la nueva regla. Los nombres de las reglas deben
ajustarse a las reglas de los identificadores. La especificación del
propietario de la regla es opcional.

condition_expression
Es la condición o condiciones que definen la regla. Una regla puede
ser cualquier expresión válida en una cláusula WHERE y puede
incluir elementos como operadores aritméticos, operadores
relacionales y predicados (por ejemplo, IN, LIKE, BETWEEN). Una
regla no puede hacer referencia a columnas u otros objetos de base
de datos. Se pueden incluir funciones integradas que no hagan
referencia a objetos de base de datos. No es posible utilizar funciones
definidas por el usuario.

condition_expression incluye una variable. El carácter arroba (@)


precede a cada variable local. La expresión hace referencia al valor
especificado con la instrucción UPDATE o INSERT. Se puede
utilizar cualquier nombre o símbolo para representar el valor cuando
se crea la regla, pero el primer carácter debe ser la arroba (@).

Permisos
Para ejecutar CREATE RULE, un usuario necesita, como mínimo, el
permiso CREATE RULE en la base de datos actual y el permiso ALTER
en el esquema en el que se está creando la regla.

Ejemplos
A.Crear una regla con un rango

En el siguiente ejemplo se crea una regla que restringe el intervalo de


enteros insertado en las columnas a las que la regla está enlazada.

CREATE RULE range_rule


AS
@range>= $1000 AND @range <$20000;
B.Crear una regla con una lista

En el siguiente ejemplo se crea una regla que restringe los valores reales
especificados en las columnas (a las que la regla está enlazada) a solo
aquellos enumerados en la regla.

CREATE RULE list_rule


AS
@list IN ('1389', '0736', '0877');
C.Crear una regla con un patrón

En el siguiente ejemplo se crea una regla que sigue un patrón de dos


caracteres cualquiera seguidos de un guión (-), cualquier número de
caracteres o ningún carácter y un entero entre 0 y 9 al final.

CREATE RULE pattern_rule


AS
@value LIKE '__-%[0-9]'
Crear indice
Crear un indice agrupado

En este ejemplo se crea un índice agrupado único para el campo "codigo"


de la tabla "libros":
create unique clustered index I_libros_codigo
on libros(codigo);

Indice no agrupado:

En este ejemplo se crea un índice no agrupado para el


campo "titulo" de la tabla "libros":

create nonclustered index I_libros_titulo


on libros(titulo);

Indice compuesto
Creamos un índice compuesto para el campo "autor" y
"editorial":
create index I_libros_autoreditorial
on libros(autor,editorial);

SQL Server crea automáticamente índices cuando se establece una restricción "primary
key" o "unique" en una tabla. Al crear una restricción "primary key", si no se especifica,
el índice será agrupado (clustered) a menos que ya exista un índice agrupado para dicha
tabla. Al crear una restricción "unique", si no se especifica, el índice será no agrupado
(non-clustered).

Ahora podemos entender el resultado del


procedimiento almacenado "sp_helpconstraint"
cuando en la columna "constraint_type" mostraba el
tipo de índice seguido de las palabras "clustered"
o "non_clustered".

Puede especificarse que un índice sea agrupado o


no agrupado al agregar estas restricciones.
Agregamos una restricción "primary key" al campo
"codigo" de la tabla "libros" especificando que
cree un índice NO agrupado:
alter table libros
add constraint PK_libros_codigo
primary key nonclustered (codigo);

Para ver los indices de una tabla:

sp_helpindex libros;
Muestra el nombre del índice, si es agrupado (o no), primary (o
unique) y el campo por el cual se indexa.

Todos los índices de la base de datos activa se almacenan en la


tabla del sistema "sysindexes", podemos consultar dicha tabla
tipeando:
select name from sysindexes;

Para ver todos los índices de la base de datos activa creados por
nosotros podemos tipear la siguiente consulta:
select name from sysindexes
where name like 'I_%';

Para crear un índice clúster

En el Explorador de objetos, conéctese a una instancia del


Motor de base de datos.

En la barra Estándar, haga clic en Nueva consulta.

Copie y pegue el siguiente ejemplo en la ventana de consulta


y haga clic en Ejecutar.

USE AdventureWorks2012;
GO
-- Create a new table with three columns.
CREATE TABLE dbo.TestTable
(TestCol1 int NOT NULL,
TestCol2 nchar(10) NULL,
TestCol3 nvarchar(50) NULL);
GO
-- Create a clustered index called IX_TestTable_TestCol1
-- on the dbo.TestTable table using the TestCol1 column.
CREATE CLUSTERED INDEX IX_TestTable_TestCol1
ON dbo.TestTable (TestCol1);
GO

Para crear un procedimiento en el Explorador de objetos


1. En el Explorador de objetos, conéctese a una instancia de Motor de
base de datos y expándala.
2. Expanda Bases de datos, la base de datos AdventureWorks2012 y,
por último, Programación.
3. Haga clic con el botón secundario en Procedimientos almacenados
y, a continuación, haga clic en Nuevo procedimiento almacenado.
4. En el menú Consulta, haga clic en Especificar valores para
parámetros de plantilla.
5. En el cuadro de diálogo Especificar valores para parámetros de
plantilla, especifique los siguientes valores para los parámetros
mostrados.

Parámetro Valor
Autor Your name
Create Date Today's date
Descripción Devuelve datos de empleado.
Procedure_name HumanResources.uspGetEmployeesTest
@Param1 @LastName
@Datatype_For_Param1 nvarchar(50)
Default_Value_For_Param1 NULL
@Param2 @FirstName
@Datatype_For_Param2 nvarchar(50)
Default_Value_For_Param NULL

Haga clic en Aceptar.


En el Editor de consultas, reemplace la instrucción SELECT por
la siguiente instrucción:

Transact-SQL
SELECT FirstName, LastName, Department
FROM HumanResources.vEmployeeDepartmentHistory
WHERE FirstName = @FirstName AND LastName = @LastName
AND EndDate IS NULL;

Para crear un procedimiento en el Explorador de objetos

En el Explorador de objetos, conéctese a una instancia de Motor de base de


datos y expándala.

Expanda Bases de datos, la base de datos AdventureWorks2012 y, por


último, Programación.

Haga clic con el botón secundario en Procedimientos almacenados y, a


continuación, haga clic en Nuevo procedimiento almacenado.

En el menú Consulta, haga clic en Especificar valores para parámetros de


plantilla.

En el cuadro de diálogo Especificar valores para parámetros de plantilla,


especifique los siguientes valores para los parámetros mostrados.

Parámetro

Valor

Autor

Your name

Create Date

Today's date

Descripción

Devuelve datos de empleado.

Procedure_name
HumanResources.uspGetEmployeesTest

@Param1

@LastName

@Datatype_For_Param1

nvarchar(50)

Default_Value_For_Param1

NULL

@Param2

@FirstName

@Datatype_For_Param2

nvarchar(50)

Default_Value_For_Param2

NULL

Haga clic en Aceptar.

En el Editor de consultas, reemplace la instrucción SELECT por la siguiente


instrucción:
Transact-SQL

SELECT FirstName, LastName, Department


FROM HumanResources.vEmployeeDepartmentHistory
WHERE FirstName = @FirstName AND LastName = @LastName
AND EndDate IS NULL;

Para probar la sintaxis, en el menú Consulta, haga clic


en Analizar.Si se devuelve un mensaje de error, compare las
instrucciones con la información anterior y corrija lo que
sea necesario.
Para crear el procedimiento, en el menú Consulta, haga
clic en Ejecutar.El procedimiento se crea como un objeto de
la base de datos.

Para ver el procedimiento que aparece en el Explorador


de objetos, haga clic con el botón secundario en
Procedimientos almacenados y seleccione Actualizar.

Para ejecutar el procedimiento, en el Explorador de


objetos, haga clic con el botón secundario en el nombre del
procedimiento almacenado HumanResources.uspGetEmployeesTest
y seleccione Ejecutar procedimiento almacenado.

En la ventana Ejecutar procedimiento, escriba Margheim


como valor del parámetro @LastName y Diane como valor del
parámetro @FirstName.

System_CAPS_warningAdvertencia

Valide todos los datos proporcionados por el usuario.No


concatene ninguna entrada de usuario antes de validarla.No
ejecute nunca un comando creado a partir de una entrada de
usuario no validada.

Usar Transact-SQL

Para crear un procedimiento en el Editor de consultas

En el Explorador de objetos, conéctese a una instancia de


Motor de base de datos.

En el menú Archivo, haga clic en Nueva consulta.

Copie y pegue el ejemplo siguiente en la ventana de


consulta y haga clic en Ejecutar.En este ejemplo se crea el
mismo procedimiento almacenado que antes con otro nombre
diferente.

USE AdventureWorks2012;
GO
CREATE PROCEDURE HumanResources.uspGetEmployeesTest2
@LastName nvarchar(50),
@FirstName nvarchar(50)
AS

SET NOCOUNT ON;


SELECT FirstName, LastName, Department
FROM HumanResources.vEmployeeDepartmentHistory
WHERE FirstName = @FirstName AND LastName =
@LastName
AND EndDate IS NULL;
Para probar la sintaxis, en el menú Consulta, haga
clic en Analizar.Si se devuelve un mensaje de error,
compare las instrucciones con la información anterior y
corrija lo que sea necesario.

Para crear el procedimiento, en el menú Consulta, haga clic


en Ejecutar.El procedimiento se crea como un objeto de la
base de datos.

Para ver el procedimiento que aparece en el Explorador de


objetos, haga clic con el botón secundario en
Procedimientos almacenados y seleccione Actualizar.

Para ejecutar el procedimiento, en el Explorador de


objetos, haga clic con el botón secundario en el nombre del
procedimiento almacenado HumanResources.uspGetEmployeesTest
y seleccione Ejecutar procedimiento almacenado.

En la ventana Ejecutar procedimiento, escriba Margheim como


valor del parámetro @LastName y Diane como valor del
parámetro @FirstName.

Modificar un procedimiento almacenado


Los procedimientos almacenados pueden modificarse, por
necesidad de los usuarios o por cambios en la estructura de
las tablas que referencia.

Un procedimiento almacenado existente puede modificarse con


"alter procedure". Sintaxis:

alter procedure NOMBREPROCEDIMIENTO


@PARAMETRO TIPO = VALORPREDETERMINADO
as SENTENCIAS;

Modificamos el procedimiento almacenado "pa_libros_autor"


para que muestre, además del título, la editorial y precio:

alter procedure pa_libros_autor


@autor varchar(30)=null
as
if @autor is null

Eliminar procedimientos almacenado


drop procedure NOMBREPROCEDIMIENTO;
Eliminamos el procedimiento almacenado llamado
"pa_libros_autor":

drop procedure pa_libros_autor;

Si el procedimiento que queremos eliminar no existe,


aparece un mensaje de error, para evitarlo, podemos emplear
esta sintaxis:

if object_id('NOMBREPROCEDIMIENTO') is not null


drop procedure NOMBREPROCEDIMIENTO;

Eliminamos, si existe, el procedimiento "pa_libros_autor",


si no existe, mostramos un mensaje:

if object_id('pa_libros_autor') is not null


drop procedure pa_libros_autor
else
select 'No existe el procedimiento "pa_libros_autor"';

"drop procedure" puede abreviarse con "drop proc".

Se recomienda ejecutar el procedimiento almacenado del


sistema "sp_depends" para ver si algún objeto depende del
procedimiento que deseamos eliminar.

Podemos eliminar una tabla de la cual dependa un


procedimiento, SQL Server lo permite, pero luego, al
ejecutar el procedimiento, aparecerá un mensaje de error
porque la tabla referenciada no existe.

Restriciones check
La restricción "check" especifica los valores que
acepta un campo, evitando que se ingresen valores
inapropiados.

La sintaxis básica es la siguiente:

alter table NOMBRETABLA


add constraint NOMBRECONSTRAINT
check CONDICION;

Trabajamos con la tabla "libros" de una librería


que tiene los siguientes campos: codigo, titulo,
autor, editorial, preciomin (que indica el precio
para los minoristas) y preciomay (que indica el
precio para los mayoristas).
Los campos correspondientes a los precios
(minorista y mayorista) se definen de tipo
decimal(5,2), es decir, aceptan valores entre -
999.99 y 999.99. Podemos controlar que no se
ingresen valores negativos para dichos campos
agregando una restricción "check":

alter table libros


add constraint CK_libros_precio_positivo
check (preciomin>=0 and preciomay>=0);

Este tipo de restricción verifica los datos cada


vez que se ejecuta una sentencia "insert" o
"update", es decir, actúa en inserciones y
actualizaciones.

Si la tabla contiene registros que no cumplen con


la restricción que se va a establecer, la
restricción no se puede establecer, hasta que
todos los registros cumplan con dicha restricción.

La condición puede hacer referencia a otros campos


de la misma tabla. Por ejemplo, podemos controlar
que el precio mayorista no sea mayor al precio
minorista:

alter table libros


add constraint CK_libros_preciominmay
check (preciomay<=preciomin);

Por convención, cuando demos el nombre a las


restricciones "check" seguiremos la misma
estructura: comenzamos con "CK", seguido del
nombre de la tabla, del campo y alguna palabra con
la cual podamos identificar fácilmente de qué se
trata la restricción, por si tenemos varias
restricciones "check" para el mismo campo.

Un campo puede tener varias restricciones


restricciones "check" y una restricción "check"
puede incluir varios campos.
Las condiciones para restricciones "check" también
pueden pueden incluir un patrón o una lista de
valores. Por ejemplo establecer que cierto campo
conste de 4 caracteres, 2 letras y 2 dígitos:

...
check (CAMPO like '[A-Z][A-Z][0-9][0-9]');

O establecer que cierto campo asuma sólo los


valores que se listan:

...
check (CAMPO in ('lunes','miercoles','viernes'));

No se puede aplicar esta restricción junto con la


propiedad "identity".

Si un campo permite valores nulos, "null" es un


valor aceptado aunque no esté incluido en la
condición de restricción.

Si intentamos establecer una restricción "check"


para un campo que entra en conflicto con otra
restricción "check" establecida al mismo campo,
SQL Server no lo permite.

Pero si establecemos una restricción "check" para


un campo que entra en conflicto con una
restricción "default" establecida para el mismo
campo, SQL Server lo permite; pero al intentar
ingresar un registro, aparece un mensaje de error.

Crear y modificar restricciones CHECK


Al crear una tabla puede crear una restricción
CHECK como parte de la definición de la tabla. Si
ya existe una tabla, puede agregar una restricción
CHECK. Las tablas y las columnas pueden contener
varias restricciones CHECK.

Si ya existe una restricción CHECK, puede


modificarla o eliminarla. Por ejemplo, puede que
desee modificar la expresión utilizada por la
restricción CHECK en una columna de la tabla.

Para modificar una restricción CHECK, antes deberá eliminar


la restricción CHECK existente y, a continuación, volver a
crearla con la nueva definición.

El siguiente ejemplo de Transact-SQL crea una nueva tabla y


la modifica agregando una restricción CHECK a la columna
CreditRating.

IF OBJECT_ID ('dbo.Vendors', 'U') IS NOT NULL


DROP TABLE dbo.Vendors;
GO
CREATE TABLE dbo.Vendors
(VendorID int PRIMARY KEY, VendorName nvarchar (50),
CreditRating tinyint)
GO
ALTER TABLE dbo.Vendors ADD CONSTRAINT
CK_Vendor_CreditRating
CHECK (CreditRating >= 1 AND CreditRating <= 5)

Eliminar estricion check


Icono de flecha usado con el vínculo Volver al principio
[Top]
Usar Transact-SQL
Para eliminar una restricción CHECK

En el Explorador de objetos, conéctese a una instancia


de Motor de base de datos.

En la barra Estándar, haga clic en Nueva consulta.

Copie y pegue el siguiente ejemplo en la ventana de


consulta y haga clic en Ejecutar.

ALTER TABLE dbo.DocExc


DROP CONSTRAINT CHK_ColumnD_DocExc;
GO
Rstricciones de integridad referencial en cascada
SQL Server 2008 R2
Otras versiones
Personas que lo han encontrado útil: 5 de 13 -
Valorar este tema

Las restricciones de integridad referencial en


cascada permiten definir las acciones que SQL
Server lleva a cabo cuando un usuario intenta
eliminar o actualizar una clave a la que apuntan
las claves externas existentes.

Las cláusulas REFERENCES de las instrucciones


CREATE TABLE y ALTER TABLE admiten las cláusulas
ON DELETE y ON UPDATE. Las acciones en cascada
también se puede definir mediante el cuadro de
diálogo Relaciones de clave externa.

[ ON DELETE { NO ACTION | CASCADE | SET NULL |


SET DEFAULT } ]

[ ON UPDATE { NO ACTION | CASCADE | SET NULL |


SET DEFAULT } ]

NO ACTION es el valor predeterminado si no se


especifica ON DELETE u ON UPDATE.

ON DELETE NO ACTION

Especifica que si se intenta eliminar una fila


con una clave a la que hacen referencia las claves
externas de las filas existentes en otras tablas,
se produce un error y se revierte la instrucción
DELETE.
ON UPDATE NO ACTION

Especifica que si se intenta actualizar un


valor de clave en una fila a cuya clave hacen
referencia las claves externas de filas existentes
en otras tablas, se produce un error y se revierte
la instrucción UPDATE.

CASCADE, SET NULL y SET DEFAULT permiten la


eliminación o actualización de valores de clave de
modo que se pueda realizar un seguimiento de las
tablas definidas para tener relaciones de clave
externa en la tabla en la que se realizan las
modificaciones. Si las acciones referenciales en
cascada se han definido también en las tablas de
destino, las acciones en cascada especificadas se
aplican para las filas eliminadas o actualizadas.
No se puede especificar CASCADE para ninguna de
las claves externas o principales que tengan una
columna timestamp.

ON DELETE CASCADE

Especifica que si se intenta eliminar una fila


con una clave a la que hacen referencia claves
externas de filas existentes en otras tablas,
todas las filas que contienen dichas claves
externas también se eliminan.
ON UPDATE CASCADE

Especifica que si se intenta actualizar un


valor de clave de una fila a cuyo valor de clave
hacen referencia claves externas de filas
existentes en otras tablas, también se actualizan
todos los valores que conforman la clave externa
al nuevo valor especificado para la clave.
NotaNota

CASCADE no se puede especificar si una columna


timestamp es parte de una clave externa o de la
clave con referencia.
ON DELETE SET NULL

Especifica que si se intenta eliminar una fila


con una clave a la que hacen referencia las claves
externas de las filas existentes de otras tablas,
todos los valores que conforman la clave externa
de las filas a las que se hace referencia se
establecen en NULL. Todas las columnas de clave
externa de la tabla de destino deben aceptar
valores NULL para que esta restricción se ejecute.
ON UPDATE SET NULL
Especifica que si se intenta actualizar una
fila con una clave a la que hacen referencia las
claves externas de las filas existentes de otras
tablas, todos los valores que conforman la clave
externa de las filas a las que se hace referencia
se establecen en NULL. Todas las columnas de clave
externa de la tabla de destino deben aceptar
valores NULL para que esta restricción se ejecute.
ON DELETE SET DEFAULT

Especifica que si se intenta eliminar una fila


con una clave a la que hacen referencia las claves
externas de las filas existentes de otras tablas,
todos los valores que conforman la clave externa
de las filas a las que se hace referencia se
establecen como predeterminados. Todas las
columnas de clave externa de la tabla de destino
deben tener una definición predeterminada para que
esta restricción se ejecute. Si una columna acepta
valores NULL y no se ha establecido ningún valor
predeterminado explícito, NULL se convierte en el
valor predeterminado implícito de la columna.
Todos los valores distintos de NULL que se
establecen debido a ON DELETE SET DEFAULT deben
tener unos valores correspondientes en la tabla
principal para mantener la validez de la
restricción de la clave externa.
ON UPDATE SET DEFAULT

Especifica que si se intenta actualizar una


fila con una clave a la que hacen referencia las
claves externas de las filas existentes de otras
tablas, todos los valores que conforman la clave
externa de la fila a los que se hace referencia se
establecen en sus valores predeterminados. Todas
las columnas externas de la tabla de destino deben
tener una definición predeterminada para que esta
restricción se ejecute. Si una columna se
convierte en NULL, y no hay establecido ningún
valor predeterminado explícito, NULL deviene el
valor predeterminado implícito de la columna.
Todos los valores no NULL que se establecen debido
a ON UPDATE SET DEFAULT deben tener unos valores
correspondientes en la tabla principal para
mantener la validez de la restricción de clave
externa.

Tome como ejemplo la restricción


FK_ProductVendor_Vendor_VendorID de la tabla
Purchasing.ProductVendor en AdventureWorks2008R2.
Esta restricción establece una relación de clave
externa desde la columna VendorID de la tabla
ProductVendor hasta la columna de clave principal
VendorID de la tabla Purchasing.Vendor. Si se
especifica ON DELETE CASCADE para la restricción,
la eliminación de la fila en Vendor, donde
VendorID equivale a 100, también elimina las tres
filas en ProductVendor, donde VendorID equivale a
100. Si se especifica ON UPDATE CASCADE para la
restricción, la actualización del valor VendorID
de la tabla Vendor de 100 a 155 también actualiza
los valores VendorID en las tres filas de
ProductVendor cuyos valores VendorID actuales sean
100.

ON DELETE CASCADE no se puede especificar en una


tabla que tenga un desencadenador INSTEAD OF
DELETE. En las tablas que tienen desencadenadores
INSTEAD OF UPDATE no es posible especificar lo
siguiente: ON DELETE SET NULL, ON DELETE SET
DEFAULT, ON UPDATE CASCADE, ON UPDATE SET NULL y
ON UDATE SET DEFAULT.
Múltiples acciones en cascada

Las instrucciones individuales DELETE o UPDATE


pueden iniciar una serie de acciones referenciales
en cascada. Por ejemplo, una base de datos
contiene tres tablas: TableA, TableB y TableC.Se
define una clave externa en TableB con ON DELETE
CASCADE en relación con la clave principal de
TableA. Se define una clave externa en TableC con
ON DELETE CASCADE en relación con la clave
principal de TableB. Si una instrucción DELETE
elimina filas de TableA, la operación también
elimina cualquier fila de TableB que contenga
claves externas coincidentes con las claves
principales eliminadas de TableA y, a
continuación, elimina cualquier fila de TableC con
claves externas que coincidan con las claves
principales eliminadas de TableB.

Las series de acciones referenciales en cascada


desencadenadas por DELETE o UPDATE deben formar un
árbol que no contenga referencias circulares.
Ninguna tabla puede aparecer más de una vez en la
lista de todas las acciones referenciales en
cascada que se obtienen de DELETE o UPDATE.
Además, el árbol de acciones referenciales en
cascada no puede tener más de una ruta de acceso a
una tabla determinada. Las ramas del árbol se
terminan cuando encuentran una tabla para la que
se haya especificado NO ACTION o cuando éste sea
su valor predeterminado.
Desencadenadores y acciones referenciales en
cascada

Las acciones referenciales en cascada activan los


desencadenadores AFTER UPDATE o AFTER DELETE de la
siguiente manera:

Primero se realizan todas las acciones


referenciales en cascada generadas directamente
por las instrucciones DELETE o UPDATE originales.

Si se ha definido algún desencadenador AFTER en


las tablas afectadas, estos desencadenadores se
activan una vez realizadas todas las acciones en
cascada. Estos desencadenadores se activan en el
orden contrario a la acción en cascada. Si hay
varios desencadenadores en una sola tabla, se
activan en un orden aleatorio a no ser que el
primer o último desencadenador de la tabla sea un
desencadenador dedicado. Este orden se especifica
mediante sp_settriggerorder.

Si varias cadenas en cascada se originan desde la


tabla que era el objetivo directo de una acción
UPDATE o DELETE, el orden en que estas cadenas
activan sus respectivos desencadenadores no está
especificado. Sin embargo, una cadena siempre
activa todos sus desencadenadores antes que otra
cadena inicie la activación.
Un desencadenador AFTER en la tabla que es el
objetivo directo de una acción UPDATE o DELETE se
activa independientemente de si afecta a alguna
fila. En este caso, ninguna otra tabla se ve
afectada por la cascada.

Si alguno de los desencadenadores anteriores


realiza operaciones UPDATE o DELETE en otras
tablas, estas acciones pueden iniciar cadenas en
cascada secundarias. Estas cadenas secundarias se
procesan a la vez para cada operación UPDATE o
DELETE una vez activados todos los
desencadenadores de todas las cadenas principales.
Este proceso puede repetirse recursivamente para
las operaciones UPDATE o DELETE posteriores.

Realizar CREATE, ALTER, DELETE u otras operaciones


de lenguaje de definición de datos (DDL) dentro de
los desencadenadores puede causar la activación de
los desencadenadores DDL. Esto puede hacer que se
lleven a cabo operaciones DELETE o UPDATE que
inician cadenas y desencadenadores en cascada
adicionales.

Si se genera un error en una cadena de acción


referencial en cascada determinada, se produce un
error, no se activa ningún desencadenador AFTER en
esa cadena y la operación DELETE o UPDATE que ha
creado la cadena se revierte.

Una tabla con un desencadenador INSTEAD OF no


puede tener también una cláusula REFERENCES que
especifique un acción en cascada. Sin embargo, un
desencadenador AFTER de la tabla de destino de una
acción en cascada puede ejecutar una instrucción
INSERT, UPDATE o DELETE en otra tabla o vista que
active un desencadenador INSTEAD OF definido para
dicho objeto.

Tipos de relaciones en una tabla


Tipos de relaciones entre tablas (Visual Database
Tools)
SQL Server 2008 R2
Otras versiones
Personas que lo han encontrado útil: 15 de 23 -
Valorar este tema

El funcionamiento de una relación se basa en hacer


coincidir datos de columnas de clave, normalmente
columnas que tienen el mismo nombre en ambas
tablas. En la mayoría de los casos, la relación
hace coincidir la clave principal de una tabla,
que proporciona un identificador único para cada
fila, con una entrada de la clave externa de la
otra tabla. Por ejemplo, se pueden asociar las
ventas de libros con los títulos específicos
vendidos creando una relación entre la columna
title_id de la tabla titles (la clave principal) y
la columna title_id de la tabla sales (la clave
externa).

Existen tres tipos de relaciones entre tablas. El


tipo de relación creado depende de cómo se definen
las columnas relacionadas.

Relaciones uno a varios

Relaciones varios a varios

Relaciones uno a uno

Relaciones uno a varios

Las relaciones uno a varios son el tipo más


habitual de relación. En este tipo de relación,
una fila de la tabla A puede corresponderse con
muchas filas de la tabla B, pero una fila de la
tabla B sólo puede corresponderse con otra de la
tabla A. Por ejemplo, en las tablas publishers y
titles se da una relación uno a varios: una
editorial publica muchos títulos, pero a cada
título le corresponde sólo una editorial.
Cree una relación uno a varios si solamente una de
las columnas relacionadas es la clave principal o
tiene una restricción UNIQUE.

El lado de la clave principal de una relación uno


a varios se indica mediante un símbolo de clave.
El lado de la clave externa de una relación se
indica mediante un símbolo de infinito.
Relaciones varios a varios

En una relación varios a varios, una fila de la


tabla A puede tener muchas filas coincidentes en
la tabla B y viceversa. Este tipo de relaciones se
crea definiendo una tercera tabla, denominada
tabla de unión, cuya clave principal esté
constituida por las claves externas de las tablas
A y B. Por ejemplo, entre las tablas authors y
titles existiría una relación varios a varios
definida por una relación uno a varios entre cada
una de ellas y la tabla titleauthors. La clave
principal de la tabla titleauthors es la
combinación de la columna au_id (la clave
principal de la tabla authors) y la columna
title_id (la clave principal de la tabla titles).
Relaciones uno a uno

En una relación uno a uno, una fila de la tabla A


no puede tener más de una fila coincidente en la
tabla B y viceversa. Se crea una relación uno a
uno si las dos columnas relacionadas son claves
principales o tienen restricciones UNIQUE.

Este tipo de relación no es habitual, ya que la


mayor parte de la información relacionada de esta
manera estaría toda en una tabla. Puede utilizar
una relación uno a uno para:

Dividir una tabla con muchas columnas.

Aislar parte de una tabla por razones de


seguridad.
Almacenar datos que son efímeros y que pueden
eliminarse fácilmente mediante la simple
eliminación de la tabla.

Almacenar información que se aplica solamente


a un subconjunto de la tabla principal.

El lado de la clave principal de una relación uno


a uno se indica mediante un símbolo de clave. El
lado de la clave externa también se indica
mediante un símbolo de clave.

Crear relaciones de clave externa


Limitaciones y restricciones

(Referencia)

No es necesario que una restricción de clave


externa esté vinculada únicamente a una
restricción de clave principal de otra tabla;
también puede definirse para que haga referencia a
las columnas de una restricción UNIQUE de otra
tabla.

Si se especifica un valor distinto de NULL en


la columna de una restricción FOREIGN KEY, el
valor debe existir en la columna a que se hace
referencia; de lo contrario, se devolverá un error
de infracción de clave externa.Para asegurarse de
que todos los valores de la restricción de clave
externa compuesta se comprueben, especifique NOT
NULL en todas las columnas que participan.

Las restricciones FOREIGN KEY solo pueden


hacer referencia a las tablas de la misma base de
datos en el mismo servidor.La integridad
referencial entre bases de datos debe
implementarse a través de desencadenadores.Para
obtener más información, vea CREATE TRIGGER
(Transact-SQL).
Las restricciones FOREIGN KEY pueden hacer
referencia a otras columnas de la misma tabla.Esto
recibe el nombre de autorreferencia.

Una restricción FOREIGN KEY especificada en el


nivel de columna solo puede incluir una columna de
referencia.Esta columna debe tener el mismo tipo
de datos que la columna en la que se define la
restricción.

Una restricción FOREIGN KEY especificada en el


nivel de tabla debe tener el mismo número de
columnas de referencia que la lista de columnas de
la restricción.El tipo de datos de cada columna de
referencia debe ser también el mismo que el de la
columna correspondiente de la lista de columnas.

El Motor de base de datos no tiene un límite


predefinido para el número de restricciones
FOREIGN KEY que una tabla que hace referencia a
otras tablas puede contener, o para el número de
restricciones FOREIGN KEY pertenecientes a otras
tablas que hacen referencia a una tabla
específica.No obstante, el número real de
restricciones FOREIGN KEY que se puede utilizar
está limitado por la configuración del hardware y
por el diseño de la base de datos y de la
aplicación.Se recomienda que la tabla no contenga
más de 253 restricciones FOREIGN KEY y que no más
de 253 restricciones FOREIGN KEY hagan referencia
a ella.

Las restricciones FOREIGN KEY no se exigen en


tablas temporales.

Si la clave externa se define en una columna


de tipo definido por el usuario CLR, la
implementación del tipo debe admitir el orden
binario.Para obtener más información, vea Tipos
definidos por el usuario de CLR.

Una columna de tipo varchar(max) puede


participar en una restricción FOREIGN KEY solo si
la clave principal a la que hace referencia se
define también como tipo varchar(max).

Seguridad
Permisos

La creación de una tabla nueva con una clave


externa requiere el permiso CREATE TABLE en la
base de datos y el permiso ALTER en el esquema en
el que se crea la tabla.

La creación de una clave externa en una tabla


existente requiere el permiso ALTER en la tabla.

Arrow icon used with Back to Top link


Usar SQL Server Management Studio
Para crear una relación de clave externa en el
Diseñador de tablas

En el Explorador de objetos, haga clic con el


botón secundario en la tabla que va a estar en el
lado de la clave externa de la relación y, a
continuación, haga clic en Diseño.

La tabla se abre en el Diseñador de tablas.

En el menú Diseñador de tablas, haga clic en


Relaciones.

En el cuadro de diálogo Relaciones de clave


externa, haga clic en Agregar.

La relación aparece en la lista Relación


seleccionada con un nombre proporcionado por el
sistema con el formato FK_<tablename>_<tablename>,
donde tablename es el nombre de la tabla de clave
externa.

Haga clic en la relación en la lista Relación


seleccionada.

Haga clic en Especificaciones de tablas y


columnas en la cuadrícula situada a la derecha y,
a continuación, haga clic en los puntos
suspensivos (...) que aparecen a la derecha de la
propiedad.

En el cuadro de diálogo Tablas y columnas, en


la lista desplegable Clave principal, elija la
tabla que estará en el lado de la clave principal
de la relación.

En la cuadrícula situada debajo, elija las


columnas que contribuyen a la clave principal de
la tabla.En la celda de la cuadrícula adyacente
situada a la izquierda de cada columna, elija la
columna de clave externa correspondiente de la
tabla de clave externa.

El Diseñador de tablas sugerirá un nombre para


la relación.Para cambiar este nombre, edite el
contenido del cuadro de texto Nombre de la
relación.

Elija Aceptar para crear la relación.

Arrow icon used with Back to Top link


Usar Transact-SQL
Para crear una clave externa en una tabla nueva

En el Explorador de objetos, conéctese a una


instancia del Motor de base de datos.

En la barra de Estándar, haga clic en Nueva


consulta.

Copie y pegue el siguiente ejemplo en la


ventana de consulta y haga clic en Ejecutar.El
ejemplo crea una tabla y definir una restricción
de clave externa en la columna TempID que hace
referencia a la columna SalesReasonID de la tabla
Sales.SalesReason.Las cláusulas ON DELETE CASCADE
y ON UPDATE CASCADE se usan para garantizar que
los cambios realizados en la tabla
Sales.SalesReason se propaguen automáticamente a
la tabla Sales.TempSalesReason.

USE AdventureWorks2012;
GO
CREATE TABLE Sales.TempSalesReason (TempID int
NOT NULL, Name nvarchar(50),
CONSTRAINT PK_TempSales PRIMARY KEY
NONCLUSTERED (TempID),
CONSTRAINT FK_TempSales_SalesReason FOREIGN
KEY (TempID)
REFERENCES Sales.SalesReason
(SalesReasonID)
ON DELETE CASCADE
ON UPDATE CASCADE
);GO

Para crear una clave externa de una tabla


existente

En el Explorador de objetos, conéctese a una


instancia del Motor de base de datos.

En la barra de Estándar, haga clic en Nueva


consulta.

Copie y pegue el siguiente ejemplo en la


ventana de consulta y haga clic en Ejecutar.El
ejemplo crea una clave externa en la columna
TempID que hace referencia a la columna
SalesReasonID de la tabla Sales.SalesReason.

USE AdventureWorks2012;
GO
ALTER TABLE Sales.TempSalesReason
ADD CONSTRAINT FK_TempSales_SalesReason
FOREIGN KEY (TempID)
REFERENCES Sales.SalesReason
(SalesReasonID)
ON DELETE CASCADE
ON UPDATE CASCADE
;
GO

S-ar putea să vă placă și