|
FACULTATEA DE MATEMATICA INFORMATICA
SECTIA INFORMATICA
Baze de date Client-Server - Proiect SQL server
Structura unei baze de date se stabileste in concordanta cu viitoarele obiective, pe care aceasta trebuie sa le satisfaca. Consideram in cazul de fata exemplul unei fabrici de jucarii. Obiectivul acestei BD este de a pastra cantitatile produse din fiecare obiect, de a avea o evidenta clara a componentelor fiecarui produs final, a operatiilor implicate si a timpului necesar pentru obtinerea fiecarei componente in parte, precum si a profesiilor implicate in producerea fiecarei componente in parte.
Am stabilit o lista de entitati despre care trebuie sa pastram informatiile in Baza de date. Pentru exemplul de fata, acetse entitati sunt urmatoarele: Produse, Repere, Operatii, Profesii, Relatii Repere-Operatii si Relatii Repere-Produse.
Structura fiecarei entitati este urmatoarea :
Produse(CodProdus, DenumireProdus, CantitateProdus)
RepereProduse(CodRelatie,CodReper,CodProdus,CantitateReper)
Repere(CodReper, DenumireReper)
RepereOperatii(CodRelatie,CodReper,CodOperatie,TimpOperatie)
Operatii(CodOperatie, DenumireOperatie,CodProfesie)
Profesii(CodProfesie,DenumireProfesie,TarifProfesie)
Semnificatiile sunt urmatoarele:
Un produs este identificat printr-un cod unic, si este descris in tabelul Produse prin acel cod unic, printr-o denumire, si prin cantitatea produsa (numarul de produse existente la un moment dat in magazia fabricii). De exemplu: 101 - bicicleta - 20 de bucati.
Reperele reprezinta componentele care intra in alcatuirea fiecarui produs ; ele sunt descrise in tabelul Repere doar printr-un cod unic, si denumire. De exemplu : 201 - surub de tip A.
Tabelul RepereProduse ilustreaza legaturile dintre componente si produsul final, in sensul ca un produs e alcatuit din mai multe repere, fiecare reper la randul sau putand fi regasit intr-un numar variabil de bucati in cadrul produsului. Fiecare relatie de acest gen este unica, si presupune o legatura reper-produs-cantitate( numarul de repere cu codul CodReper care se gasec in componenta Produsul cu codul CodProdus).
De exemplu: surubul de tip A sa gaseste in produsul bicicleta in numar de 7 bucati, si in produsul tricicleta in numar de 12 bucati, samd.
Operatiile sunt identificate printr-o cheie unica, si sunt descrise printr-o denumire si codul unei profesii asociate. Pornim de la premiza ca o operatie poate fi executata doar de muncitori cu calificarea corespunzatoare, neexistand mai multe profesii care sa permita executarea aceleasi operatiuni. De exemplu : 501 - strunjire surub - 601, unde 501 reprezinta codul reperului, iar 601 codul profesiei care califica muncitorul sa execute acea operatie.
Tabelul ReperOperatii descrie relatiile dintre un anumit reper si operatiile care contribuie la realizarea acestuia, in sensul ca finalizarea unui reper presupune cumularea mai multor operatii. Tabelul are de asemenea o cheie primara, si fiecare inregistrare e descrisa de codul reperului implicat, una din operatiile necesare, precum si timpul necesar desfasurarii acelei operatii.
De exemplu, o inregistare ca :
301 - 201 - 501 - 10 se interpreteaza in felul urmator : in cadrul relatiei 301, pentru reperul cu codul 201 este necesara inclusiv operatia cu codul 501, a carei executie in acest caz dureaza 10 minute.
Profesiile sunt descrise printr-un cod unic, prin denumire si tarif pe ora. De retinut ca un muncitor cu o profesie poate executa mai multe operatii, iar reciproca nu este valabila.
Pentru a ilusta precizarile de mai sus, urmeaza schema bazei de data, incluzand structura tabelelor precum si relatiile dintre ele :
Tabelul Produse
Cod Produs : de tip intreg, cheie primara (unica), nenula, constrangere : sa fie in intervalul [100-999], cu alte cuvinte sa fie de 3 cifre ; cheie externa pentru RepereProduse
DenumireProdus : de tip sir de caractere, de lungime maxim 15, nenul
CantProdus : de tip intreg, nenul
Tabelul Repere
CodReper : de tip intreg, cheie primara (unica), nenula, constrangere : sa fie in intervalul [100-999] ; cheie externa pt RepereProduse, RepereOperatii
DenumireReper : de tip sir de caractere, de lungime maxim 15, nenul
Tabelul Operatii :
CodOperatie : de tip intreg, cheie primara (unica), nenula, constrangere : sa fie in intervalul [100-999] ; cheie externa pt RepereOperatii
DenumireOperatie : de tip sir de caractere, de lungime maxim 15, nenul
CodProfesie : de tip intreg, nenul, constrangere : sa fie in intervalul [100-999] ;
Tabelul Profesii :
CodProfesie : de tip intreg, cheie primara (unica), nenula, constrangere : sa fie in intervalul [100-999] ; cheie externa pt Operatii
DenumireProfesie : de tip sir de caractere, de lungime maxim 15, nenul
TarifProfesie : de tip intreg, nenul, constrangere : sa fie in intervalul [10-80] .
Tabelul RepereOperatii :
CodRelatie : de tip intreg, cheie primara (unica), nenula, constrangere : sa fie in intervalul [100-999] ;
CodReper : de tip intreg, nenula, constrangere : sa fie in intervalul [100-999] ;
CodOperatie : de tip intreg, nenul, constrangere : sa fie in intervalul [100-999] ;
TimpOperatie : de tip intreg, nenul, constrangere : sa fie in intervalul [20-900] .
Tabelul RepereProduse :
CodRelatie : de tip intreg, cheie primara (unica), nenula, constrangere : sa fie in intervalul [100-999] ;
CodReper : de tip intreg, nenula, constrangere : sa fie in intervalul [100-999] ;
CodProdus : de tip intreg, nenul, constrangere : sa fie in intervalul [100-999] ;
CantitateReper : de tip intreg, nenul, constrangere : sa fie in intervalul [1-100] ;
In continuare sunt listate statement-urile care genereaza aceaste tabele, si relatiile dintre ele . De remarcat: intai se verifica existenta deja in baza de date a unui table cu acelasi nume, in caz afirmativ el se sterge si se construieste altul ; apoi se construiesc tabelele, si in final se adauga constragerile.
if exists (select * from sysobjects where id = object_id(N'[dbo]. [Repere]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo]. [Repere]
GO
if exists (select * from sysobjects where id = object_id(N'[dbo]. [Operatii]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo]. [Operatii]
GO
if exists (select * from sysobjects where id = object_id(N'[dbo]. [Produse]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo]. [Produse]
GO
if exists (select * from sysobjects where id = object_id(N'[dbo]. [Profesii]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo]. [Profesii]
GO
if exists (select * from sysobjects where id = object_id(N'[dbo]. [RepereOperatii]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo]. [RepereOperatii]
GO
if exists (select * from sysobjects where id = object_id(N'[dbo]. [RepereProduse]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo]. [RepereProduse]
GO
CREATE TABLE [dbo]. [Repere] (
[CodReper] [int] NOT NULL ,
[DenReper] [char] (15) NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo]. [Operatii] (
[CodOperatie] [int] NOT NULL ,
[DenOperatie] [char] (15) NOT NULL ,
[CodProfesie] [int] NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo]. [Produse] (
[CodProdus] [int] NOT NULL ,
[DenProdus] [char] (15) NOT NULL ,
[CantProdus] [int] NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo]. [Profesii] (
[CodProfesie] [int] NOT NULL ,
[DenProfesie] [char] (15) NOT NULL ,
[TarifProfesie] [int] NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo]. [RepereOperatii] (
[CodRel] [int] NOT NULL ,
[CodReper] [int] NOT NULL ,
[CodOperatie] [int] NOT NULL ,
[TimpOperatie] [int] NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo]. [RepereProduse] (
[CodRel] [int] NOT NULL ,
[CodReper] [int] NOT NULL ,
[CodProdus] [int] NOT NULL ,
[CantReper] [int] NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo]. [Repere] WITH NOCHECK ADD
CONSTRAINT [PK_Repere] PRIMARY KEY NONCLUSTERED
(
[CodReper]
) ON [PRIMARY] ,
CONSTRAINT [CK_Repere] CHECK ([CodReper] > = 100 and [CodReper] < = 999)
GO
ALTER TABLE [dbo]. [Operatii] WITH NOCHECK ADD
CONSTRAINT [PK_Operatii] PRIMARY KEY NONCLUSTERED
(
[CodOperatie]
) ON [PRIMARY] ,
CONSTRAINT [CK_Operatii] CHECK ([CodOperatie] > = 100 and [CodOperatie] < = 999)
GO
ALTER TABLE [dbo]. [Produse] WITH NOCHECK ADD
CONSTRAINT [PK_Produse] PRIMARY KEY NONCLUSTERED
(
[CodProdus]
) ON [PRIMARY] ,
CONSTRAINT [CK_Produse] CHECK ([CodProdus] > = 100 and [CodProdus] < = 999)
GO
ALTER TABLE [dbo]. [Profesii] WITH NOCHECK ADD
CONSTRAINT [CK_Profesii] CHECK ([CodProfesie] > = 100 and [CodProfesie] < = 999),
CONSTRAINT [CK_Profesii_1] CHECK ([TarifProfesie] > = 10 and [TarifProfesie] < = 50)
GO
ALTER TABLE [dbo]. [RepereOperatii] WITH NOCHECK ADD
CONSTRAINT [PK_RepereOperatii] PRIMARY KEY NONCLUSTERED
(
[CodRel]
) ON [PRIMARY] ,
CONSTRAINT [CK_RepereOperatii] CHECK ([CodRel] > = 100 and [CodRel] < = 999),
CONSTRAINT [CK_RepereOperatii_1] CHECK ([TimpOperatie] > = 5 and [TimpOperatie] < = 900)
GO
ALTER TABLE [dbo]. [RepereProduse] WITH NOCHECK ADD
CONSTRAINT [PK_RepereProduse] PRIMARY KEY NONCLUSTERED
(
[CodRel]
) ON [PRIMARY] ,
CONSTRAINT [CK_RepereProduse] CHECK ([CodRel] > = 100 and [CodRel] < = 999),
CONSTRAINT [CK_RepereProduse_1] CHECK ([CantReper] > 0)
GO
Orice baza de date, pentru a fi utilizata, trebuie populata, adica in fiecare tabel se introduc inregistari :
USE Fabrica
INSERT INTO Produse VALUES(101,'bicicleta',10)
INSERT INTO Produse VALUES(102,'trotineta',20)
INSERT INTO Produse VALUES(103,'masinuta',10)
INSERT INTO Produse VALUES(104,'tricicleta',30)
INSERT INTO Repere VALUES(201,'surub tip A')
INSERT INTO Repere VALUES(202,'surub tip B')
INSERT INTO Repere VALUES(203,'cadru')
INSERT INTO Repere VALUES(204,'cauciuc subtire')
INSERT INTO Repere VALUES(205,'cauciuc gros')
INSERT INTO RepereOperatii VALUES(301,201,501,10)
INSERT INTO RepereOperatii VALUES(302,201,502,15)
INSERT INTO RepereOperatii VALUES(303,202,502,15)
INSERT INTO RepereOperatii VALUES(304,202,502,13)
INSERT INTO RepereOperatii VALUES(305,203,502,20)
INSERT INTO RepereOperatii VALUES(306,204,503,15)
INSERT INTO RepereOperatii VALUES(307,205,503,25)
INSERT INTO Operatii VALUES(501,'strunjire surub',601)
INSERT INTO Operatii VALUES(502,'frezare',601)
INSERT INTO Operatii VALUES(503,'topire cauciuc',602)
INSERT INTO Operatii VALUES(504,'asamblare bi',603)
INSERT INTO Operatii VALUES(505,'asamblare tri',603)
INSERT INTO RepereProduse VALUES(401,201,101,10)
INSERT INTO RepereProduse VALUES(402,201,102,20)
INSERT INTO RepereProduse VALUES(403,201,103,30)
INSERT INTO RepereProduse VALUES(404,202,101,15)
INSERT INTO RepereProduse VALUES(405,202,104,30)
INSERT INTO RepereProduse VALUES(406,203,101,1)
INSERT INTO RepereProduse VALUES(407,203,102,1)
INSERT INTO Profesii VALUES(601,'strungar',35)
INSERT INTO Profesii VALUES(602,'topitor',37)
INSERT INTO Profesii VALUES(603,'asamblator',32)
Interogarile sunt destinate extragerii de informatii din baza de date, pe baza anumitor criterii.
determina cat costa in total operatiile pt fiecare reper in parte
SELECT Repere. CodReper, Repere. DenReper, Cost_Total = sum(RepereOperatii. TimpOperatie*TarifProfesie)
FROM Repere, RepereOperatii, Operatii, Profesii
WHERE Repere. CodReper = RepereOperatii. CodReper AND
RepereOperatii. CodOperatie = Operatii. CodOperatie AND
Operatii. CodProfesie = Profesii. CodProfesie
GROUP BY Repere. CodReper, Repere. DenReper
-- determina cat costa in total operatiile pt fiecare produs in parte
SELECT Produse. CodProdus, Produse. DenProdus, Cost_Total = sum(RepereProduse. CantReper * RepereOperatii. TimpOperatie * TarifProfesie)
FROM Repere, RepereOperatii, Operatii, Profesii, Produse, RepereProduse
WHERE Produse. CodProdus = RepereProduse. CodProdus AND
Repere. CodReper = RepereOperatii. CodReper AND
RepereOperatii. CodOperatie = Operatii. CodOperatie AND
Operatii. CodProfesie = Profesii. CodProfesie
GROUP BY Produse. CodProdus, Produse. DenProdus
determina cate ore din fiecare meserie sunt necesare
SELECT Profesii. CodProfesie, Profesii. DenProfesie, Numar_Ore = SUM(Produse. CantProdus * RepereProduse. CantReper * RepereOperatii. TimpOperatie)
FROM Profesii, Operatii, RepereProduse, RepereOperatii, Produse, Repere
WHERE Produse. CodProdus = RepereProduse. CodProdus AND
RepereProduse. CodReper = Repere. CodReper AND
Repere. CodReper = RepereOperatii. CodReper AND
Profesii. CodProfesie = Operatii. CodProfesie AND
RepereOperatii. CodReper = RepereProduse. CodReper AND
Operatii. CodProfesie = Profesii. CodProfesie AND
Operatii. CodOperatie = RepereOperatii. CodOperatie
GROUP BY Profesii. CodProfesie, Profesii. DenProfesie
-- determina toate reperele care au manopera mai mare decat media
SELECT Repere. CodReper, Repere. DenReper, Manopera = SUM(RepereOperatii. TimpOperatie*TarifProfesie)
FROM Repere, RepereOperatii, Operatii, Profesii
WHERE Repere. CodReper = RepereOperatii. CodReper AND
RepereOperatii. CodOperatie = Operatii. CodOperatie AND
Operatii. CodProfesie = Profesii. CodProfesie
GROUP BY Repere. CodReper, Repere. DenReper
HAVING SUM(RepereOperatii. TimpOperatie*TarifProfesie) > AVG(RepereOperatii. TimpOperatie*TarifProfesie)
-- determina cate repere de fiecare tip se folosesc in total
SELECT Repere. CodReper, Repere. DenReper, Nr_total_repere = SUM(Produse. CantProdus * RepereProduse. CantReper)
FROM Repere, RepereOperatii, RepereProduse, Produse
WHERE Repere. CodReper = RepereOperatii. CodReper AND
RepereProduse. CodReper = Repere. CodReper AND
Produse. CodProdus = RepereProduse. CodProdus
GROUP BY Repere. CodReper, Repere. DenReper
--cat timp dureaza manopera unui produs
SELECT DenProdus, Timp_total = SUM(TimpOperatie * CantReper)
FROM Produse, RepereProduse, Repere, RepereOperatii
WHERE Produse. CodProdus = RepereProduse. CodProdus AND
RepereProduse. CodReper = Repere. CodReper AND
Repere. CodReper = RepereOperatii. CodReper
GROUP BY Produse. denProdus
Procedurile stocate se salveaza in interiorul bazei de date, pot prelua sau returna parametrii utilizator, pot fi create pentru uz permanent sau temporar, in cadrul uneia sau mai multor sesiuni. De remarcat ca, in cadrul unei proceduri, initial se verifica daca ea a fost deja create; in caz afirmativ, ea se va sterge si recrea din nou, conform instructiunilor. O procedura se apeleaza prin :
EXECUTE Nume_procedura lista_parametrii_utilizator
--procedura returneaza cate repere intra in alcatuirea unui produs, si le si afiseaza
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'nr_repere' AND type = 'P')
DROP PROCEDURE nr_repere
GO
CREATE PROCEDURE nr_repere
@codP int,
@numar int OUTPUT
AS
DECLARE @denP char(15)
SELECT @numar = COUNT(*), @denP = denProdus
FROM Produse, Repere, RepereProduse
WHERE Produse. CodProdus = RepereProduse. CodProdus AND
RepereProduse. CodReper = Repere. CodReper AND
Produse. CodProdus = @codP
GROUP BY denProdus
PRINT 'Produsul ' + RTRIM(@denP) + ' are ' + CONVERT(varchar(3),@numar) + ' componente(repere)'
RETURN
GO
-- determina produsele care necesita meseria X (data ca parametru)
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'prod_meserie' AND type = 'P')
DROP PROCEDURE prod_meserie
GO
CREATE PROCEDURE prod_meserie
@codProf int
AS
SELECT DISTINCT Produse. CodProdus, Produse. DenProdus, Repere. denReper
FROM Profesii, Operatii, RepereOperatii, Repere, RepereProduse, Produse
WHERE Profesii. CodProfesie = Operatii. CodProfesie AND
Operatii. CodOperatie = RepereOperatii. CodOperatie AND
RepereOperatii. CodReper = Repere. CodReper AND
Repere. CodReper = RepereProduse. CodReper AND
RepereProduse. CodProdus = Produse. CodProdus AND
Profesii. CodProfesie = @codProf
ORDER BY Produse. codProdus
RETURN
GO
Un declansator sau trigger este o procedura care este executata in mod implicit, atunci cand asupra tabelului asociat este lansata o comanda de INSERT, UPDATE, DELETE. Triggerii pot contine instructiuni SQL, pot invoca alte proceduri si alti declansatori. Limbajul SQL prevede existenta a 2 tabele conceptuale: inserted si deleted, care arata identic dpdv al structurii cu tabelul in care este creat declansatorul, si care sunt folosite pentru a pastra ultimele modificari facute tabelului curent.
-- trigger pt insert
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'tr_produse1' AND type = 'TR')
DROP TRIGGER tr_produse1
GO
CREATE TRIGGER [tr_produse1] ON [Produse]
FOR INSERT
AS
DECLARE @rows int
DECLARE @totalProd1 int
SET @rows = @@rowcount
IF (@rows = 0) RETURN
IF EXISTS (SELECT * FROM Produse, inserted
WHERE Produse. DenProdus = inserted. DenProdus
AND Produse. CodProdus <> inserted. CodProdus)
BEGIN
RAISERROR ('Ati introdus deja 1 produs cu acest nume', 16, 1)
--select CodProdus, DenProdus, CantProdus from inserted
ROLLBACK TRANSACTION
END
ELSE
BEGIN
PRINT 'Produsul a fost adaugat cu succes'
--select CodProdus, DenProdus, CantProdus from inserted
--RETURN
END
select CodProdus, DenProdus, CantProdus from inserted
GO
-- trigger pt update
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'tr_produse2' AND type = 'TR')
DROP TRIGGER tr_produse2
GO
CREATE TRIGGER [tr_produse2] ON [Produse]
FOR UPDATE
AS
DECLARE @rows int
DECLARE @totalProd1 int
SET @rows = @@rowcount
IF (@rows = 0) RETURN
IF EXISTS (SELECT * FROM Produse, inserted
WHERE Produse. DenProdus = inserted. DenProdus
AND Produse. CodProdus <> inserted. CodProdus)
BEGIN
RAISERROR ('Ati introdus deja 1 produs cu acest nume', 16, 1)
ROLLBACK TRANSACTION
END
ELSE
BEGIN
PRINT 'Produsul a fost modificat cu succes'
--SELECT CodProdus, DenProdus, CantProdus FROM inserted
--RETURN
END
SELECT CodProdus, DenProdus, CantProdus FROM inserted
GO
Un cursor este o constructie care permite utilizatorului sa creeze arii de lucru, sa le denumeasca si sa acceseze informatia din ele.
-- cursor care parcurge si listeaza inregistrarile din tabelul Produse
--IF EXISTS (SELECT name FROM sysobjects
--WHERE name = 'prod_cursor1' AND type = 'cur')
--DEALLOCATE prod_cursor1
--GO
DECLARE @nume varchar(15)
DECLARE @cant int
DECLARE prod_cursor1 SCROLL CURSOR
FOR
SELECT DenProdus, CantProdus FROM Produse
OPEN prod_cursor1
FETCH NEXT FROM prod_cursor1 INTO @nume, @cant
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'PRODUS: ' + @nume + ' ' + CONVERT(varchar(4),@cant)
FETCH NEXT FROM prod_cursor1 INTO @nume, @cant
END
CLOSE prod_cursor1
DEALLOCATE prod_cursor1
-- cursor care parcurge tabelul Profesii si pt fiecare profesie apeleaza procedura care determina produsele care necesita meseria X (prod_meserie)
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'prod_cursor2' AND type = 'cur')
DEALLOCATE prod_cursor2
GO
DECLARE @den varchar(15)
DECLARE @cod int
DECLARE @prof varchar(15)
DECLARE prod_cursor2 SCROLL CURSOR
FOR
SELECT DenProfesie, CodProfesie FROM Profesii
OPEN prod_cursor2
FETCH NEXT FROM prod_cursor2 INTO @den, @cod
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Meseria ' + @den
EXEC prod_meserie @cod
FETCH NEXT FROM prod_cursor2 INTO @den, @cod
END
CLOSE prod_cursor2
DEALLOCATE prod_cursor2
-- cursor care parcurge si listeaza inregistrarile din tabelul Meserii
-- si permite UPDATE: incrementeaza cu 1 valorile din campul TarifMeserie
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'prod_cursor3' AND type = 'cur')
DEALLOCATE prod_cursor3
GO
DECLARE @cod int
DECLARE @den varchar(15)
DECLARE @tarif int
DECLARE prod_cursor3 CURSOR SCROLL_LOCKS
FOR
SELECT CodProfesie, DenProfesie, TarifProfesie
FROM Profesii
FOR UPDATE OF TarifProfesie
OPEN prod_cursor3
FETCH NEXT FROM prod_cursor3 INTO @Cod, @Den, @Tarif
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE Profesii
SET TarifProfesie = TarifProfesie + 1
WHERE CURRENT OF prod_cursor3
PRINT CONVERT(VARCHAR(5),@cod) + ' ' + @den + ' ' + CONVERT(VARCHAR(5),@tarif+1)
FETCH NEXT FROM prod_cursor3 INTO @Cod, @Den, @Tarif
END
CLOSE prod_cursor3
DEALLOCATE prod_cursor3
Un view tot o procedura care se salveaza in baza de date, si are rolul de a facilita accesul utilizatorului la tabele, in cazul in care acestea sunt foarte complexe, de exemplu.
-- creaza un view pt a vizualiza doar reperele necesare producerii unei biciclete / triciclete
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'bicicleta' AND type = 'v')
DROP VIEW bicicleta
GO
CREATE VIEW bicicleta
AS
SELECT Produse. DenProdus, Repere. CodReper, Repere. DenReper, RepereProduse. CantReper
FROM Produse, RepereProduse, Repere
WHERE Produse. CodProdus = RepereProduse. CodProdus AND
RepereProduse. CodReper = Repere. CodReper AND
Produse. DenProdus LIKE '%cicleta'
GO
--SELECT * FROM bicicleta
-- creaza un view pt a vizualiza produsele in care intra reperul 'surub'
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'surub' AND type = 'v')
DROP VIEW surub
GO
CREATE VIEW surub
AS
SELECT Produse. CodProdus, Produse. DenProdus, Repere. DenReper
FROM Produse, RepereProduse, Repere
WHERE Repere. DenReper LIKE '%surub%' AND
Repere. CodReper = RepereProduse. CodReper AND
RepereProduse. CodProdus = Produse. CodProdus
GO
--SELECT * FROM surub