dilluns, de juny 06, 2011

Cas pràctic: Zentyal + VLAN + Domini Windows Server 2003 + Ubuntu Server (Oracle)





Esquema lògic de la xarxa


Bàsicament el servidor Zentyal fa de router entre les diferents VLANs i Internet, de reenviador de port VNP al DC1 (Controlador de Domini), de servidor DHCP (proporciona una IP que correspon amb l'àmbit de la VLAN des d'on es fa la petició DHCP, i també el DNS del DC1 per la resolució de noms de carpetes compartides del DC; també la porta d'enllaç corresponent a cada VLAN), i de firewall.

A la VLAN10 es troben els servidors del domini per gestionar els serveis de VPN, terminal server, i gestió d'usuaris. També hi poden haver màquines client.
A la resta d'VLANs només màquines client.


Configuració del switch: Catalyst 2950 SERIES

Esborrar la configuració actual del switch ...

Switch#delete flash:vlan.dat
Switch#erase startup-config
Switch#reload

Configura una clau d'accés ...

Switch>enable
Switch#config t
Switch(config)#enable secret cs+cisco2011
Switch#exit

Configura les VLANs: 20, 30 i 10.

Switch#conf t
Switch(config)#vlan 10
Switch(config)#name VLAN10

Switch(config-vlan)#exit

Switch(config)#vlan 20

Switch(config)#name VLAN20
Switch(config-vlan)#exit
Switch(config)#vlan 30

Switch(config)#name VLAN30

Switch(config-vlan)#exit

Configura els ports 1 - 8 tal que pertanyin a la VLAN 20 ...
Mode access per tal de crear un domini de broadcast.

Switch(config)#interface fastEthernet 0/1
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan 20
Switch(config-if)#exit

Switch(config)#interface fastEthernet 0/2
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan 20
Switch(config-if)#exit
Switch(config)#interface fastEthernet 0/3
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan 20
Switch(config-if)#exit
Switch(config)#interface fastEthernet 0/4
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan 20
Switch(config-if)#exit
Switch(config)#interface fastEthernet 0/5

Switch(config-if)#switchport mode access

Switch(config-if)#switchport access vlan 20

Switch(config-if)#exit
Switch(config)#interface fastEthernet 0/6
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan20
Switch(config-if)#exit
Switch(config)#interface fastEthernet 0/7
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan20
Switch(config-if)#exit
Switch(config)#interface fastEthernet 0/8
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan20
Switch(config-if)#exit

Configura els ports 9 - 16 tal que pertanyin a la VLAN 30 ...
Mode access per tal de crear un domini de broadcast.

Switch(config)#interface fastEthernet 0/9
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan 30

Switch(config-if)#exit
Switch(config)#interface fastEthernet 0/10
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan 30
Switch(config-if)#exit
Switch(config)#interface fastEthernet 0/11
Switch(config-if)#switchport mode access

Switch(config-if)#switchport access vlan 30
Switch(config-if)#exit
Switch(config)#interface fastEthernet 0/12
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan 30
Switch(config-if)#exit
Switch(config)#interface fastEthernet 0/13
Switch(config-if)#switchport mode access

Switch(config-if)#switchport access vlan 30
Switch(config-if)#exit
Switch(config)#interface fastEthernet 0/14
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan30
Switch(config-if)#exit
Switch(config)#interface fastEthernet 0/15
Switch(config-if)#switchport mode access

Switch(config-if)#switchport access vlan30

Switch(config-if)#exit
Switch(config)#interface fastEthernet 0/16
Switch(config-if)#switchport mode access

Switch(config-if)#switchport access vlan30

Switch(config-if)#exit

Configura els ports 17 - 23 tal que pertanyin a la VLAN 10 ...
Mode access per tal de crear un domini de broadcast. Aquesta és la VLAN on es connecten els servidors: Domini (DC1, DC2), Ubuntu Server(Oracle).

Switch(config)#interface fastEthernet 0/17
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan 10
Switch(config-if)#exit
Switch(config)#interface fastEthernet 0/18
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan 10
Switch(config-if)#exit
Switch(config)#interface fastEthernet 0/19
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan 10
Switch(config-if)#exit

Switch(config)#interface fastEthernet 0/20

Switch(config-if)#switchport mode access

Switch(config-if)#switchport access vlan 10
Switch(config-if)#exit
Switch(config)#interface fastEthernet 0/21
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan 10
Switch(config-if)#exit
Switch(config)#interface fastEthernet 0/22
Switch(config-if)#switchport mode access

Switch(config-if)#switchport access vlan 10

Switch(config-if)#exit
Switch(config)#interface fastEthernet 0/23
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan 10
Switch(config-if)#exit

Configura el port 24 per tal que el Mode access sigui trunk, d'aquesta manera veurà tot el tràfic de totes les VLANs. En aquest port es connecta el servidor Zentyal (que caldrà que tingui configurat el protocol IEEE 802.1Q).

Switch(config)#interface fastEthernet 0/24

Switch(config-if)#switchport mode trunk

Switch(config-if)#switchport access vlan 1

Switch(config-if)#exit
Switch(config)#exit
Switch#copy running-config startup-config



Instal.lació d'Oracle

La instal.lació de l'Oracle s'ha realitzat en un servidor Ubuntu Server (ubuntu-10.04.2-server-i386.iso) per tal que tots els recursos del maquinari estiguéssin a disposició de la base de dades.
Només ha calgut descarregar i configurar el paquet que la web d'Oracle proporciona.

Instal.lació:

sudo dpkg -i oracle-xe_10.2.0.1-1.0_i386.deb
sudo apt-get -f install
sudo /etc/init.d/oracle-xe configure


Configuració d'Ubuntu Server:

- Hostname: CS-Oracle

/etc/network/interfaces
address 192.168.10.5
network: 255.255.255.0
broadcast 192.168.10.0
gateway 192.168.10.1
dns-nameservers 192.168.10.1

- Comptes d'usuari:

Usuari: administrador
Password: cs+admin2011


Configuració d'Oracle:

- SID: xe
- Oracle Application Express port: 8080
- Database listener: 1521

- Administradors:

Usuari: SYS
Password: cs+oracle2011

Usuari: SYSTEM
Password: cs+oracle2011

- Propietari de la BBDD:
Usuari: cs
Password: cs2011


- Concessió de permisos al propietari de la BBDD (SQL):

CREATE USER cs IDENTIFIED BY cs2011
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON users;

CREATE ROLE programador;

GRANT CREATE TABLE, CREATE VIEW, CREATE PROCEDURE, CREATE SESSION, CREATE SEQUENCE, CREATE TRIGGER TO programador;

GRANT programador TO cs;


Especificació de requeriments

Es desitja ampliar la cobertura d'una BBDD perquè inclogui la gestió de magatzem i de comandes a proveïdors.
Les especificacions inclourien almenys els següents apartats:

Proveïdors:
Dels proveïdors interessa conèixer les següents dades:
El nom comercial, la direcció, que inclou carrer, pis, etc, codi postal, poble la província on radica, telèfon privat i de l'empresa. Així com el nom i telèfon de la persona de contacte en l'empresa.
Article o articles dels quals ha estat proveïdor en el passat o partir d'ara. Només interessa mantenir dades dels proveïdors amb els quals s'ha mantingut contacte comercial. Només es realitzen comandes a proveïdors que estan registrats a la base de dades, per la qual cosa cal donar d'alta als nous proveïdors abans de fer-los un comanda.
Un proveïdor pot ser subministrador d'articles diferents, tant ara com en el passat. Asímismo, un article pot ser ofert per diversos subministradors. Òbviament, en un comanda a un proveïdor només poden figurar articles del mateix proveïdor

Comandes a proveïdors:
Un comanda va dirigida a un únic proveïdor i pot referir-se a diferents articles.
Un comanda té una capçalera on consten, entre unes altres dades:
CodPedPro, número correlatiu que serveix per identificar cada comanda que fa l'empresa.
Dades del proveïdor.
Data del comanda.
Un comanda conté 1 o més línies de detall, d'acord amb les següents especificacions:
Cada línia només admet un codi d'article.
Un article només pot estar en una línia del mateix comanda.
En cada línia figurarà, a més del codi d'article, la descripció de l'article, la quantitat demanada, el preu estipulat i un camp de descompte.

Articles: Dels articles interessa conèixer:
El proveïdor que va subministrar cada unitat de l'article. Per a això es proposa la utilització de “lots”.
Un lot és el conjunt dels articles amb el mateix codi d'article, codart, que un proveïdor envia en una mateixa remesa.
Cada unitat d'articles del magatzem pertany a un lot i només a un.
El proveïdor pot dividir les unitats d'un article d'un comanda en diversos lots, per ser enviats en diferents remeses. Això pot deure's que el proveïdor no disposa de la quantitat suficient d'article demandat per a servirlo en una sóla remesa, per la qual cosa s'opta per enviar-lo en diverses.
Cada lot s'identifica amb un número seqüencial per comanda.
Un lot només conté articles d'un mateix comanda.
En una remesa pot haver lots de diferents comandes i articles.

Albarans: Cada remesa ve acompanyada d'un albarà, en el qual ha de constar:
Codi d'identificació de l'albarà.
Codi del proveïdor i data d'expedició.
Dades del transportista: Nif, raó social, telèfon, persona que fa la lliura, data i hora de la lliura.
Dades de la persona que firma l'albarà: NIF, raó social, telèfon.
Línies de l'albarà: Un albarà pot contenir diverses línies de detall, amb, almenys, les següents dades: codi de lot, codi de comanda, codi d'article, quantitat d'article lliurada.
Cada línia conté les dades d'un lot només.

Factures de proveïdors: Els proveïdors envien factures pels articles que han servit a l'empresa. Les especificacions per a les factures són les següents:
Codi d'identificació de la factura utilitzat pel proveïdor.
Dades del proveïdor: nom, direcció, etc.
Data de la factura.
Comanda al qual correspon la factura. Una factura no pot contenir lots de direrentes comandes. Però pot haver diverses factures per a un únic comanda, per exemple, no disposar d'estoc.
Descomptes globals aplicats.
L'import total de la factura.
Una o més línies de detall, que contenen:
Nombre de factura.
Número i línia de l'albarà de lliurament de l'article
Codi d'article, descripció, quantitat, preu unitari, iva aplicat i total per línia.
Se ha de programar un trigger perquè avisi a l'administrador quan algun un article alcanza l'estoc mínim (o cau per sota de l'estoc mínim).
D'altra banda, es desitja que els noms de les taules i camps de la BD estiguin en Català, pel que haurà de renombrar-los, coherentment.
Es desitja implementar integritat referencial A tota la BD, de manera que no hagin dades incoherents ni pèrdua d'informació en claus referenciades.


Base de dades
: Esquema conceptual




Base de dades: Esquema lògic

contactes(nif_contacte, nss, nom, telefon)
nif_contacte: Cadena(9),
nss: Cadena(9),
nom: Cadena(50),
telefon: Cadena(12),
PRIMARY KEY: nif_contacte,
NO NUL.LITAT: nss, nom, telefon,
UNIQUE: nss

transportistes(nif_transportista, nss, nom, telefon)
nif_transportista: Cadena(9),
nss: Cadena(9),
nom: Cadena(50),
telefon: Cadena(12),
PRIMARY KEY: nif_transportista,
NO NUL.LITAT: nss, nom, telefon,
UNIQUE: nss

firmants(nif_firmant, nss, nom, telefon)
nif_firmant: Cadena(9),
nss: Cadena(9),
nom: Cadena(50),
telefon: Cadena(12),
PRIMARY KEY: nif_contacte,
NO NUL.LITAT: nss, nom, telefon,
UNIQUE: nss

factures_albarans(id_factura, data, descompte_global, nombre_factura, import_total)
id_factura: Numero(6,0),
data: Data,
descompte_global: Numero(2,0),
nombre_factura: Cadena(50),
import_total: Numero(6,1),
PRIMARY KEY: id_factura,
NO NUL.LITAT: data, descompte_global, nombre_factura, import_total
CAMP CALCULAT: import_total → Suma dels camps total de la taula linies_factures_albarans

articles(codart, descripcio, preu, stock, stock_min)
codart: Cadena(8),
descripcio: Cadena(40),
preu: Numero(6,1)
stock: Numero(6,1)
stock_min: Numero(6,1)
PRIMARY KEY: codart
NO NUL.LITAT: descripcio, preu, stock, stock_min

lots(codart, num_seq)
codart: Cadena(8),
num_seq: Numero(2,0),
PRIMARY KEY: codart, num_seq,
FOREIGN KEY: codart REFERENCES articles

provincies(codpro, nom)
codpro: Cadena(2),
nom: Cadena(30),
PRIMARY KEY: codpro
NO NUL.LITAT: nom

pobles(codpro, codpue, nom)
codpro: Cadena(2),
codpue: Cadena(5),
nom: Cadena(40),
PRIMARY KEY: codpro, codpue
FOREIGN KEY: codpro REFERENCES provincies
NO NUL.LITAT: nom

proveidors(id_proveidor, nom_comercial, direccio, telefon, nif_contacte, codpro, codpue)
id_proveidor: Numero(6,0),
nom_comercial: Cadena(50),
direccio: Cadena(50),
telefon: Cadena(12),
nif_contacte: Cadena(9),
codpro: Cadena(2),
codpue: Cadena(5),
PRIMARY KEY: id_proveidor
FOREIGN KEY: nif_contacte REFERENCES contactes
FOREIGN KEY: codpro, codpue REFERENCES pobles
NO NUL.LITAT: nom_comercial, direccio, telefon, nif_contacte, codpro, codpue

comandes(CodPedPro, data, id_proveidor)
CodPedPro: Cadena(5),
data: Data,
id_proveidor: Numero(6,0),
PRIMARY KEY: CodPedpro,
FOREIGN KEY: id_proveidor REFERENCES proveidors
NO NUL.LITAT: data

linies_comanda(CodPedPro, id_linia_comanda, codart, descompte, preu_estipulat, quantitat)
CodPedPro: Cadena(5),
id_linia_comanda: Numero(2,0),
codart: Cadena(8),
descompte: Numero(2,0)
preu_estipulat: Numero(6,1)
quantitat: Numero(5,0)
PRIMARY KEY: CodPedPro, id_linia_comanda, codart
FOREIGN KEY: CodPedPro REFERENCES comandes
FOREIGN KEY: codart REFERENCES articles
NO NUL.LITAT: descompte, preu_estipulat, quantitat

albarans(id_albara, data_expiracio, data_i_hora, nif_transportista, nif_firmant, id_proveidor)
id_albara: Numero(6,0),
data_expiracio: Data,
data_i_hora: Data,
nif_transportista: Cadena(9)
nif_firmant: Cadena(9)
id_proveidor: Numero(6,0),
PRIMARY KEY: id_albara,
FOREIGN KEY: nif_transportista REFERENCES transportistes
FOREIGN KEY: nif_firmant FEFERENCES firmants
FOREIGN KEY: id_proveidor REFERENCES proveidors
NO NUL.LITAT: data_expiracio, data_i_hora, nif_transportista, nif_firmant, id_proveidor

linies_albara(id_albara, id_linia_albara, CodPedPro, id_linia_comanda, codart, num_seq, quantitat)
id_albara: Numero(6,0),
id_linia_comanda: Numero(2,0),
id_linia_albara: Numero(2,0),
CodPedPro: Cadena(5),
codart: Cadena(8),
num_seq: Numero(2,0),
quantitat: Numero(5,0),
PRIMARY KEY: id_albara, id_linia_albara, CodPedPro, id_linia_comanda
FOREIGN KEY: id_albara REFERENCES albarans
FOREIGN KEY: CodPedPro, id_linia_comanda, codart REFERENCES linies_comanda
FOREIGN KEY: codart, num_seq REFERENCES lots
NO NUL.LITAT: quantitat, CodPedPro, id_linia_comanda, codart, num_seq

linies_factures_albarans(id_factura, id_linia_factura, preu_unitari, iva, total, id_albara, id_linia_albara, CodPedPro, id_linia_comanda)
id_factura: Numero(6,0),
id_linia_factura: Numero(2,0),
preu_unitari: Numero(6,1),
iva: Numero(2,0),
total: Numero(6,1),
id_albarta: Numero(6,0),
id_linia_albara: Numero(2,0),
CodPedPro: Cadena(5),
id_linia_comanda: Numero(2,0),
PRIMARY KEY: id_factura, id_linia_factura
FOREIGN KEY: id_factura REFERENCES factures_albarans
FOREIGN KEY: id_albara, id_linia_albara, CodPedPro, id_linia_comanda REFERENCES linies_albara
NO NUL.LITAT: preu_unitari, iva, total, id_albara, id_linia_albara, CodPedPro, id_linia_comanda
CAMP CALCULAT: total → preu_unitari*(1+iva)*quantitat[de la relació conté]

subministra(id_proveidor, codart, data_inici, data_fi)
id_proveidor: Numero(6,0),
codart: Cadena(8),
data_inici: Data,
data_fi: Data,
PRIMARY KEY: id_proveidor, codart
FOREIGN KEY: id_proveidor REFERENCES proveidors
FOREIGN KEY: codart REFERENCES articles
NO NUL.LITAT: data_inici

clients(codcli, nom, direccio, codi_postal, codpro, codpue)
codcli: Numero(5,0),
nom: Cadena(50),
direccio: Cadena(50),
codi_postal: Cadena(5),
codpro: Cadena(2),
codpue: Cadena(5),
PRIMARY KEY: codcli
FOREIGN KEY: codpro, codpue REFERENCES pobles
NO NUL.LITAT: nom, direccio, codi_postal, codpro, codpue

factures(codfac, iva, data, codcli)
codfac: Numero(6,0)
iva: Numero(2,0)
data: Data
codcli: Numero(5,0),
PRIMARY KEY: codfac
FOREIGN KEY: codcli REFERENCES clients
NO NUL.LITAT: iva, data

linies_factura_client(codfac, id_linia_factura_client, codart, quantitat, descompte, preu)
codfac: Numero(6,0),
id_linia_factura_client: Numero(2,0),
codart: Cadena(8),
quantitat: Numero(5,0)
descompte: Numero(2,0)
preu: Numero(6,1)
PRIMARY KEY: codfac, id_linia_factura_client
FOREIGN KEY: codfac REFERENCES factures,
FOREIGN KEY: codart REFERENCES articles,
NO NUL.LITAT: quantitat, descompte, preu, codart



Avisar a l'administrador quan algun article arriba a l'estoc mínim (o cau per sota de l'estoc mínim) actualitzant la taula avisos.



Base de dades: Esquema físic

--------------------------------------------------------
-- DDL per la taula CONTACTES
--------------------------------------------------------

CREATE TABLE contactes
(
nif_contacte VARCHAR2(9),
nss VARCHAR2(9) UNIQUE NOT NULL,
nom VARCHAR2(50) NOT NULL,
telefon VARCHAR2(12) NOT NULL,
CONSTRAINT contactesPK PRIMARY KEY (nif_contacte)
);

--------------------------------------------------------
-- DDL per la taula TRANSPORTISTES
--------------------------------------------------------

CREATE TABLE transportistes
(
nif_transportista VARCHAR2(9),
nss VARCHAR2(9) UNIQUE NOT NULL,
nom VARCHAR2(50) NOT NULL,
telefon VARCHAR2(12) NOT NULL,
CONSTRAINT transportistesPK PRIMARY KEY (nif_transportista)
);

--------------------------------------------------------
-- DDL per la taula FIRMANTS
--------------------------------------------------------

CREATE TABLE firmants
(
nif_firmant VARCHAR2(9),
nss VARCHAR2(9) UNIQUE NOT NULL,
nom VARCHAR2(50) NOT NULL,
telefon VARCHAR2(12) NOT NULL,
CONSTRAINT firmantsPK PRIMARY KEY (nif_firmant)
);

--------------------------------------------------------
-- DDL per la taula FACTURES_ALBARANS
--------------------------------------------------------

CREATE TABLE factures_albarans
(
id_factura NUMBER(6,0),
data DATE NOT NULL,
descompte_global NUMBER(2,0) NOT NULL,
nombre_factura VARCHAR2(50) NOT NULL,
CONSTRAINT factures_albaransPK PRIMARY KEY (id_factura)
);

--------------------------------------------------------
-- DDL per la taula ARTICLES
--------------------------------------------------------

CREATE TABLE articles
(
codart VARCHAR2(8),
descripcio VARCHAR2(40) NOT NULL,
preu NUMBER(6,1) NOT NULL,
stock NUMBER(6,1) NOT NULL,
stock_min NUMBER(6,1) NOT NULL,
CONSTRAINT articlesPK PRIMARY KEY (codart)
);

--------------------------------------------------------
-- DDL per la taula LOTS
--------------------------------------------------------

CREATE SEQUENCE lotsNum_seq
START WITH 1
INCREMENT BY 1
NOCACHE;

CREATE TABLE lots
(
codart VARCHAR2(8),
num_seq NUMBER(2,0),
CONSTRAINT lotsPK PRIMARY KEY (codart,num_seq),
CONSTRAINT lotsArticlesFK FOREIGN KEY (codart) REFERENCES articles(codart)
);

--------------------------------------------------------
-- DDL per la taula PROVINCIES
--------------------------------------------------------

CREATE TABLE provincies
(
codpro VARCHAR2(2),
nom VARCHAR2(30) NOT NULL,
CONSTRAINT provinciesPK PRIMARY KEY (codpro)
);

--------------------------------------------------------
-- DDL per la taula POBLES
--------------------------------------------------------

CREATE TABLE pobles
(
codpro VARCHAR2(2),
codpue VARCHAR2(5),
nom VARCHAR2(40) NOT NULL,
CONSTRAINT poblesPK PRIMARY KEY (codpro, codpue),
CONSTRAINT poblesProvinciesFK FOREIGN KEY (codpro) REFERENCES provincies(codpro)
);

--------------------------------------------------------
-- DDL per la taula PROVEIDORS
--------------------------------------------------------

CREATE TABLE proveidors
(
id_proveidor NUMBER(6,0),
nom_comercial VARCHAR2(50) NOT NULL,
direccio VARCHAR2(50) NOT NULL,
telefon VARCHAR2(12) NOT NULL,
nif_contacte VARCHAR2(9) NOT NULL,
codpro VARCHAR2(2) NOT NULL,
codpue VARCHAR2(5) NOT NULL,
CONSTRAINT proveidorsPK PRIMARY KEY (id_proveidor),
CONSTRAINT proveidorsContactesFK FOREIGN KEY (nif_contacte) REFERENCES contactes(nif_contacte),
CONSTRAINT proveidorsPoblesFK FOREIGN KEY (codpro, codpue) REFERENCES pobles(codpro, codpue)
);

--------------------------------------------------------
-- DDL per la taula COMANDES
--------------------------------------------------------

CREATE TABLE comandes
(
codpedpro VARCHAR2(5),
data Date NOT NULL,
id_proveidor NUMBER(6,0),
CONSTRAINT comandesPK PRIMARY KEY (codpedpro),
CONSTRAINT comandesProveidorsFK FOREIGN KEY (id_proveidor) REFERENCES proveidors(id_proveidor)
);

--------------------------------------------------------
-- DDL per la taula LINIES_COMANDA
--------------------------------------------------------

CREATE TABLE linies_comanda
(
codpedpro VARCHAR2(5),
id_linia_comanda NUMBER(2,0),
codart VARCHAR2(8),
descompte NUMBER(2,0) NOT NULL,
preu_estipulat NUMBER(6,1) NOT NULL,
quantitat NUMBER(5,0) NOT NULL,
CONSTRAINT linies_comandaPK PRIMARY KEY (codpedpro, id_linia_comanda, codart),
CONSTRAINT linies_comandaComandesFK FOREIGN KEY (codpedpro) REFERENCES comandes(codpedpro),
CONSTRAINT linies_comandaArticlesFK FOREIGN KEY (codart) REFERENCES articles(codart)
);

--------------------------------------------------------
-- DDL per la taula ALBARANS
--------------------------------------------------------

CREATE TABLE albarans
(
id_albara NUMBER(6,0),
data_expiracio DATE NOT NULL,
data_i_hora DATE NOT NULL,
nif_transportista VARCHAR2(9) NOT NULL,
nif_firmant VARCHAR2(9) NOT NULL,
id_proveidor NUMBER(6,0) NOT NULL,
CONSTRAINT albaransPK PRIMARY KEY (id_albara),
CONSTRAINT albaransTransportistesFK FOREIGN KEY (nif_transportista) REFERENCES transportistes(nif_transportista),
CONSTRAINT albaransFirmantsFK FOREIGN KEY (nif_firmant) REFERENCES firmants(nif_firmant),
CONSTRAINT albaransProveidorsFK FOREIGN KEY (id_proveidor) REFERENCES proveidors(id_proveidor)
);

--------------------------------------------------------
-- DDL per la taula LINIES_ALBARA
--------------------------------------------------------

CREATE TABLE linies_albara
(
id_albara NUMBER(6,0),
id_linia_albara NUMBER(2,0),
codpedpro VARCHAR2(5) NOT NULL,
id_linia_comanda NUMBER(2,0) NOT NULL,
codart VARCHAR2(8) NOT NULL,
num_seq NUMBER(2,0) NOT NULL,
quantitat NUMBER(5,0) NOT NULL,
CONSTRAINT linies_albaraPK PRIMARY KEY (id_albara, id_linia_albara, codpedpro, id_linia_comanda),
CONSTRAINT linies_albaraAlbaransFK FOREIGN KEY (id_albara) REFERENCES albarans(id_albara),
CONSTRAINT linies_albaraLinies_comandaFK FOREIGN KEY (codpedpro, id_linia_comanda, codart) REFERENCES linies_comanda(codpedpro, id_linia_comanda, codart),
CONSTRAINT linies_albaraLotsFK FOREIGN KEY (codart, num_seq) REFERENCES lots(codart, num_seq)
);

--------------------------------------------------------
-- DDL per la taula LINIES_FACTURES_ALBARANS
--------------------------------------------------------

CREATE TABLE linies_factures_albarans
(
id_factura NUMBER(6,0),
id_linia_factura NUMBER(2,0),
preu_unitari NUMBER(6,1) NOT NULL,
iva NUMBER(2,0) NOT NULL,
id_albara NUMBER(6,0) NOT NULL,
id_linia_albara NUMBER(2,0) NOT NULL,
codpedpro VARCHAR2(5) NOT NULL,
id_linia_comanda NUMBER(2,0) NOT NULL,
CONSTRAINT linies_factures_albaransPK PRIMARY KEY (id_factura, id_linia_factura),
CONSTRAINT linies_factures_albaransF_aFK FOREIGN KEY (id_factura) REFERENCES factures_albarans(id_factura),
CONSTRAINT linies_factures_Lin_albFK FOREIGN KEY (id_albara, id_linia_albara, codpedpro, id_linia_comanda) REFERENCES linies_albara(id_albara, id_linia_albara, codpedpro, id_linia_comanda)
);

--------------------------------------------------------
-- DDL per la taula SUBMINISTRA
--------------------------------------------------------

CREATE TABLE subministra
(
id_proveidor NUMBER(6,0),
codart VARCHAR2(8),
data_inici DATE NOT NULL,
data_fi DATE,
CONSTRAINT subministraPK PRIMARY KEY (id_proveidor, codart),
CONSTRAINT subministraProveidorsFK FOREIGN KEY (id_proveidor) REFERENCES proveidors(id_proveidor),
CONSTRAINT subministraArticlesFK FOREIGN KEY (codart) REFERENCES articles(codart)
);

--------------------------------------------------------
-- DDL per la taula CLIENTS
--------------------------------------------------------

CREATE TABLE clients
(
codcli NUMBER(5,0),
nom VARCHAR2(50) NOT NULL,
direccio VARCHAR2(50) NOT NULL,
codi_postal VARCHAR2(5) NOT NULL,
codpro VARCHAR2(2) NOT NULL,
codpue VARCHAR2(5) NOT NULL,
CONSTRAINT clientsPK PRIMARY KEY (codcli),
CONSTRAINT clientsPoblesFK FOREIGN KEY (codpro, codpue) REFERENCES pobles(codpro, codpue)
);
--------------------------------------------------------
-- DDL per la taula FACTURES
--------------------------------------------------------

CREATE TABLE factures
(
codfac NUMBER(6,0),
iva NUMBER(2,0) NOT NULL,
data DATE NOT NULL,
codcli NUMBER(5,0),
CONSTRAINT facturesPK PRIMARY KEY (codfac),
CONSTRAINT facturesClientsFK FOREIGN KEY (codcli) REFERENCES clients(codcli)
);

--------------------------------------------------------
-- DDL per la taula LINIES_FACTURA_CLIENT
--------------------------------------------------------

CREATE TABLE linies_factura_client
(
codfac NUMBER(6,0),
id_linia_factura_client NUMBER(2,0),
codart VARCHAR2(8) NOT NULL,
quantitat NUMBER(5,0) NOT NULL,
descompte NUMBER(2,0) NOT NULL,
preu NUMBER(6,1) NOT NULL,
CONSTRAINT linies_factura_clientPK PRIMARY KEY (CODFAC, ID_LINIA_FACTURA_CLIENT),
CONSTRAINT linies_factura_clientFactureFK FOREIGN KEY (codfac) REFERENCES factures(codfac),
CONSTRAINT linies_factura_clientArticleFK FOREIGN KEY (codart) REFERENCES articles(codart)
);

--------------------------------------------------------
-- DDL pel trigger
--
-- Avisa a l'administrador quan algun article arriba
-- a l'estoc mínim (o cau per sota de l'estoc mínim)
--------------------------------------------------------

CREATE TABLE avisos (
avis VARCHAR2(200)
);

CREATE OR REPLACE TRIGGER Sota_stock_Minim AFTER UPDATE ON articles FOR EACH ROW
begin
if (:new.stock <= :old.stock_min) then
INSERT INTO avisos
VALUES (sysdate || ' ' || 'Articles - Stock: ' || :new.stock || ', ' || 'Stock_min: ' || :old.stock_min);
end if;
end Sota_stock_Minim;


dimarts, d’abril 26, 2011

Tutorial: Windows Server 2003

A Microsoft Windows 2003 Server Manual

Apunts teòrics / pràctics.

A continuació adjunto una sèrie d'enllaços a documents en format PDF que contenen una col.lecció d'exercicis d'administració del Windows Server 2003 realitzats en una màquina Virtual Box.


Document Windows Server 2003 Tutor 1:
  1. Rastrejador de successos d'aturada.
  2. Aturada programada.
  3. Seguretat al navegador.
  4. Seguretat a la contrasenya.

Document Windows Server 2003 Tutor 2:
  1. Dos servidors, un domini.
  2. Nivell funcional del domini.
  3. Afegir un usuari.
  4. Visor de successos.

Document Windows Server 2003 Tutor 3:
  1. Mode de restauració del servei de directori.

Document Windows Server 2003 Tutor 4:
  1. Funcions del Maestro de Operaciones (FSMO).
  2. Repartiment de la càrrega FSMO (amb comanda).
  3. Repartiment de la càrrega FSMO (amb interfície gràfica).

Document Windows Server 2003 Tutor 5:
  1. Usuaris i grups.
  2. Grups dins de grups.
  3. Grups barrejats.
  4. "Miembros" i "Miembro de".
  5. Àmbit i tipus.

Document Windows Server 2003 Tutor 6:
  1. Documents.
  2. Perfils mòbils.
  3. Usuaris mòbils.
  4. La comanda setx.
  5. Fitxer BAT: Inici de sessió amb mapeig automàtic d'unitats.
  6. Programa BgInfo.

Document Windows Server 2003 Tutor 7:
  1. Polítiques: instal.la al client el Firefox.

Document Windows Server 2003 Tutor 8:
  1. DHCP.


Altres enllaços d'interès addicionals:
  1. Instal.lar i configurar Terminal Server

dissabte, de gener 29, 2011

Recuperació del Grub2 després d'una instal.lació de Windows

Quan instal.lem el sistema operatiu Windows no respecta als altres sitemes operatius que puguem tenir intal.lats. Per aquest motiu si tens l'Ubuntu ja instal.lat i aleshores instal.les el Windows perds el Grub2.

Per recuperar-lo fes el següent:

Arrenca la màquina amb un Live CD.
Obre un gnome-terminal i executa:

$ sudo fdisk -l

Aquesta comanda mostra la taula de particions, per exemple mostra:

Dispositiu Arrenc. Inici Final Blocs Id Sistema
/dev/sda1 * 1 18701 150215751 83 Linux
/dev/sda2 18702 19457 6072570 5 Estesa
/dev/sda5 18702 19457 6072538+ 82 Intercanvi Linux / Solaris

Aquesta taula ens diu que el Linux que volem recuperar està a /dev/sda1.
Muntarem sda1 (el Linux a recuperar) i qualsevol altra partició externa de booteig que puguessim tenir (no és el meu cas).

$ sudo mount /dev/sda1 /mnt
$ sudo mount --bind /dev /mnt/dev
$ sudo mount --bind /proc /mnt/proc

Ara cambiem el direcotri arrel:

$ sudo chroot /mnt

I ara recuperem Grub2:

# grub-install --recheck /dev/sda


Ja podem sortir de chroot i reiniciar la màquina:

# exit

$ sudo umount /mnt/dev
$ sudo umount /mnt/proc
$ sudo umount /mnt

$ sudo reboot

dimarts, de gener 11, 2011

Instal.lar Oracle Database XE (Express Edition) en Ubuntu

Descarrega't de la web d'Oracle el paquet oracle-xe ... i386.deb.

Per fer-ho primer has de marcar l'opció Accept License Agreement i a continuació clicar a sobre del link oracle-xe ... i386.deb.

A continuació només t'has de validar com a usuari.



Probablement encara no et puguis validar perquè no tens cap usuari creat, per tant crea'l clicant a sobre de l'enllaç Create your Oracle account now. Et demanarà bàsicament una adreça d'email, una clau d'accés i informació com per exemple la teva ciutat ... quan estiguis prem a sobre del botó Create.
Ara ja tens un usuari creat per validar-te i descarregar el paquet.

Un cop t'has descarregat el paquet fes doble clic a sobre per instal.lar-lo. A mi em surt l'opció de Reinstal.la el paquet perquè ja l'havia instal.lat avans.


Un cop instal.lat només queda configurar-lo. Des de consola executa la comanda:

$ sudo /etc/init.d/oracle-xe configure

i especificar el port HTTP que usarà: 8080
i especificar el port de la base de dades: 1521



Per administrar gràficament la base de dades usarem la URL:
http://127.0.0.1:8080/apex i accedirem amb l'usuari SYS o SYSTEM i amb la clau d'accés que hem especificat al configurar-lo.


A través de les diferents opcions administem.


També podem entrar a través de la consola sql*plus, però primer editarem el fitxer .bashrc que es troba al nostre directori HOME:

$ cd $ gedit .bashrc&
...

# variabler per ORACLE
ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_HOME
export ORACLE_SID=XE
export PATH



Per carregar aquestes variables executarem:

$ . .bashrc


Podem comprovar fent un echo de les variables que s'han carregat correctament.


tsnames.ora es troba en el directori $ORACLE_HOME/network/admin i conté els alias de la nostra base de dades i de les altres bases de dades diferents a les que podem accedir.



Dins $ORACLE_HOME/bin acostumen a estar els executables de la base de dades (sqlplus, lsnrctl, tnsping, …) i podem comprovar si ens podem connectar a una base de dades amb la comanda tnsping.




I ens connectem a la base de dades amb la comanda sqlplus.



També podem provar d'instal.lar SQL Developer per tal d'accedir a la base de dades:

Però primer necessitem instal.lar el JDK.


Només cal especificar que és pel sistema operatiu Linux.


i triarem el fitxer amb extensió .bin


Només queda procedir donar-li permisos d'execució i executar-lo.
En aquest cas he procedir a intal.lar-lo a l'escriptori, però hagués estat millor deixar-lo en una carpeta dins del home directory.



Ara procedirem a descarregar SQL Developer.





Per descarregar SQL Developer ens hem de validar com l'usuari que ja vam crear per descarregar l'Oracle.



Transformarem el paquet RPM a DEB usant el programa alien, que prèviament instal.larem si no el tenim.


Transformem el paquet RPM que conté el SQL Developer a un paquet DEB que puguem instal.lar a l'Ubuntu.


Només queda fer doble clic al fitxer DEB que ens ha generat i clicar a sobre del botó Install Package.


Podem comprovar que SQL Developer s'ha instal.lat a la següent ruta:
/usr/local/bin/sqldeveloper


L'executem i ens demanarà la ruta a on hem instal.lat el JDK, que en el nostre cas ha estat a: /home/jr/Desktop/jdk1.6.0_23/