sobre vistas

15/01/2004 - 12:21 por Carlos | Informe spam
Hola

he estado leyendo las cuestiones de nuestro compañero
Racsus. Si que he conseguido ayuda sobre dichas vistas en
las BOL de SQL Server pero hay ciertas cosas que no me
quedan claras debido a la falta de ejemplos.

Si tengo dos tablas, una llamada CLIENTES con dichos
campos:

IDCLIENTE
NOMBRE
APELLIDOS

Y otro CLIENTES_DIRECCION con los campos

IDCLIENTE
DIRECCION
CP

Como seria la consulta dividida actualizable de estas dos
tablas?

Gracias
 

Leer las respuestas

#1 Javier Loria
15/01/2004 - 15:09 | Informe spam
Hola:
Vamos por partes, el esquema que propones no son vistas divididas, pero
nos sirven de guia para entender el problema:
/* Creacion de las Tablas */
CREATE TABLE Clientes(
IdCliente INT NOT NULL PRIMARY KEY,
Nombre VARCHAR(20) NOT NULL,
Apellido VARCHAR(20) NOT NULL
)

CREATE TABLE ClientesDireccion(
IdCliente INT NOT NULL PRIMARY KEY,
Direccion VARCHAR(200) NOT NULL,
CONSTRAINT FK_Clientes
FOREIGN KEY (IdCliente)
REFERENCES Clientes(IdCliente)
)

INSERT Clientes(IdCliente, Nombre, Apellido)
SELECT 1,'NCliente1', 'ACliente1' UNION ALL
SELECT 2,'NCliente2', 'ACliente2' UNION ALL
SELECT 3,'NCliente3', 'ACliente3'

INSERT ClientesDireccion(IdCliente, Direccion)
SELECT 1, 'DCliente1' UNION ALL
SELECT 2, 'DCliente2' UNION ALL
SELECT 3, 'DCliente3'
GO

/* Creacion de las Vista*/
CREATE VIEW ClientesCompletos
AS
SELECT Clientes.IdCliente,
Clientes.Nombre,
Clientes.Apellido,
ClientesDireccion.Direccion
FROM Clientes
JOIN ClientesDireccion
ON Clientes.IdCliente=ClientesDireccion.IdCliente

GO

INSERT ClientesCompletos(IdCliente, Nombre, Apellido, Direccion)
SELECT 4,'NCliente4', 'ACliente4', 'DCliente3'

DELETE ClientesCompletos
WHERE IDCliente=3

UPDATE ClientesCompletos
SET Nombre='NCliente4' ,
Direccion='DCliente3'
WHERE IDCliente=3
GO

UPDATE ClientesCompletos
SET Nombre='NCliente4'
WHERE IDCliente=3

UPDATE ClientesCompletos
SET Direccion='DCliente4'
WHERE IDCliente=3
GO
DROP VIEW ClientesCompletos
DROP TABLE ClientesDireccion
DROP TABLE Clientes

Como se desprende del ejemplo y por los errores que produce veras que las
vistas no pueden actualizar multiples tablas simultaneamente y por ende no
pueden ni INSERT ni DELETE). La unica forma de arreglar esto es construir
unos,TRIGGERS INSTEAD OF que para cada uno de los casos actualizen la tabla
indicada.

Las vistas divididas (yo prefiero llamarlas particionadas) qye es como
se llaman en ingles, funcionan asi:
/* Crea las Tablas */
CREATE TABLE Clientes0(
IdCliente INT NOT NULL PRIMARY KEY
CHECK (IdCliente BETWEEN 1 AND 100),
Nombre VARCHAR(20) NOT NULL,
Apellido VARCHAR(20) NOT NULL,
Direccion VARCHAR(200) NOT NULL
)

CREATE TABLE Clientes1(
IdCliente INT NOT NULL PRIMARY KEY
CHECK (IdCliente BETWEEN 101 AND 200),
Nombre VARCHAR(20) NOT NULL,
Apellido VARCHAR(20) NOT NULL,
Direccion VARCHAR(200) NOT NULL
)

CREATE TABLE Clientes2(
IdCliente INT NOT NULL PRIMARY KEY
CHECK (IdCliente BETWEEN 201 AND 301),
Nombre VARCHAR(20) NOT NULL,
Apellido VARCHAR(20) NOT NULL,
Direccion VARCHAR(200) NOT NULL
)
GO
/* Crea las Tablas */
CREATE VIEW Clientes
AS
SELECT * FROM Clientes0 UNION ALL
SELECT * FROM Clientes1 UNION ALL
SELECT * FROM Clientes2
GO

INSERT Clientes(IdCliente, Nombre, Apellido, Direccion)
SELECT 1,'NCliente1', 'ACliente1', 'DCliente1' UNION ALL
SELECT 101,'NCliente101', 'ACliente101', 'DCliente101' UNION ALL
SELECT 201,'NCliente201', 'ACliente201', 'DCliente201'

SELECT * FROM Clientes
SELECT * FROM Clientes0
/* Borramos Todo */
DROP VIEW Clientes
DROP TABLE Clientes0
DROP TABLE Clientes1
DROP TABLE Clientes2

Las vistas divididas se basan tablas que tienen el mismo esquema y son un
UNION ALL de las tablas y existe una Columna que sirve como guia para
dividir los datos.
Lo interesante de las vistas divididas es que las Tablas pueden estar en
servidores diferentes!!!. Esta es, la opcion mas rapida y escalable para BD
Transaccionales. De hecho es la forma en que puedes tener un Sistema que
Soporte 800,000 Transacciones por Minuto (www.tpc.org).

Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.



Carlos escribio:
Hola

he estado leyendo las cuestiones de nuestro compañero
Racsus. Si que he conseguido ayuda sobre dichas vistas en
las BOL de SQL Server pero hay ciertas cosas que no me
quedan claras debido a la falta de ejemplos.

Si tengo dos tablas, una llamada CLIENTES con dichos
campos:

IDCLIENTE
NOMBRE
APELLIDOS

Y otro CLIENTES_DIRECCION con los campos

IDCLIENTE
DIRECCION
CP

Como seria la consulta dividida actualizable de estas dos
tablas?

Gracias

Preguntas similares