Beruflich Dokumente
Kultur Dokumente
SCENARIO
CONSIDER THE FOLLOWING REQUIREMENT FOR NEWS MART.THE NEWS MART PROVIDES NEWSPAPERS AND MAGAZINES TO A PARTICULAR LOCATION I.E ADAYAR WHERE THE MART IS SITUATED. MAGAZINES ARE ORDERED THROUGH THE PUBLISHER AND THE NEWSPAPERS THROUGH THE PRESS. CUSTOMER CAN BUY ANY NUMBER OF MAGAZINES AND/OR NEWSPAPERS.THE BILL IS GENERATED ACCORDLINGLY.
BUSINESS RULES
4. THE CUSTOMER DETAILS AND THEIR PUCHASES ARE KEPT TRACK OF.
PU_ID
P_NAME
NAME
E_ID GENDER
CON_NO
SU_NO
P_ID
P_LOC
LOC
1 PUBLISHER 1 1
SUPE RVISE
MART
1 1
GIVES ORDER TO
PRESS
1
SUPP LIES
WORKS FOR
PAYS
PRINTS
N
CUS_ID
M_NAME
1
N_NAME N_PRICE
C_NAME
MAGAZINE
M_PRICE GENDER
CUSTOMER
BILL_NO
BILL
TOT_AMT
NEWSPAPER
ADDRESS C_LOC
NO_NEWS
NEWS_AMT
NO_MAG MAG_AMT
BUYS
RELATIONSHIP TABLE
PUBLISHER MART
PID PNAME
EID
EID
LOCATION SUP_NO
MAGAZINE
PRESS
MAG_NAME M_PRICE
CUSTOMER
CUS_ID CNAME
N_NAME N_PRICE
CUST_MAG
CUS_ID
MAG_NAME
CUS_ID
N_NAME
CUST_NEWS
BILL
B_NO
TOT_AMT
BILL_ITEM
B_NO
ITEM_NAME
TABLES IN MYSQL
1. TABLE FOR MART mysql> CREATE TABLE MART(EMP_ID INTEGER PRIMARY KEY,NAME CHAR(10), -> GENDER ENUM('M','F'),CONTACT_NO INTEGER, -> LOCATION CHAR(20),SUP_NO INTEGER REFERENCES MART(EMP_ID)); Query OK, 0 rows affected (0.17 sec)
2. TABLE FOR PUBLISHER mysql> CREATE TABLE PUBLISHER(PUB_ID INTEGER PRIMARY KEY,P_NAME VARCHAR(15), -> EMP_ID INTEGER REFERENCES MART(EMP_ID)); Query OK, 0 rows affected (0.16 sec)
3. TABLE FOR MAGAZINE mysql> CREATE TABLE MAGAZINE(MAG_NAME CHAR(15) PRIMARY KEY,M_PRICE INTEGER, -> SUP_NO INTEGER,SUP_NAME CHAR(15)); Query OK, 0 rows affected (0.11 sec)
4. TABLE FOR PRESS mysql> CREATE TABLE PRESS(PR_ID INTEGER PRIMARY KEY,PR_NAME CHAR(10),EMP_ID INTEGER -> REFERENCES MART(EMP_ID)); Query OK, 0 rows affected (0.11 sec)
5. TABLE FOR NEWSPAPER mysql> CREATE TABLE NEWSPAPER(N_NAME CHAR(15) PRIMARY KEY,N_PRICE INTEGER); Query OK, 0 rows affected (0.13 sec)
6. TABLE FOR CUSTOMER mysql> CREATE TABLE CUSTOMER(CUST_ID INTEGER PRIMARY KEY,CUST_NAME CHAR(15), -> GENDER ENUM('M','F'),ADDRESS CHAR(25), -> CUST_LOCATION CHAR(10),EMP_ID INTEGER REFERENCES MART(EMP_ID)); Query OK, 0 rows affected (0.14 sec)
7. TABLE FOR BILL: mysql>CREATE TABLE BILL(BILL_NO INTEGER PRIMARY KEY,NO_OF_MAG INTEGER,NO_OF_NEWS INTEGER ,MAG_AMT INTEGER,NEWS_AMT INTEGER);TABLE FOR BILL_ITEM
8. TABLE FOR BILL_ITEM: mysql> CREATE TABLE BILL_ITEM(BILL_NO INTEGER REFERENCES BILL(BILL_NO),ITEM_NAME CHAR(15), -> PRIMARY KEY(BILL_NO,ITEM_NAME)); Query OK, 0 rows affected (0.13 sec)
9.TABLE FOR CUST_MAG mysql> CREATE TABLE CUST_MAG(CUST_ID INTEGER REFERENCES CUSTOMER(CUST_ID),MAG_NAME CHAR(15) -> REFERENCES MAGAZINE(MAG_NAME), -> PRIMARY KEY(CUST_ID,MAG_NAME)); Query OK, 0 rows affected (0.13 sec)
10. TABLE FOR CUST_NEWS mysql> CREATE TABLE CUST_NEWS(CUST_ID INTEGER REFERENCES CUSTOMER(CUST_ID),N_NAME CHAR(15) -> REFERENCES NEWSPAPER(N_NAME), -> PRIMARY KEY(CUST_ID,N_NAME)); Query OK, 0 rows affected (0.13 sec)
TRIGGERS IN MYSQL
1. TRIGGER FOR CHECKING LOCATION: DELIMITER // CREATE TRIGGER CUST_LOC AFTER INSERT ON CUSTOMER FOR EACH ROW BEGIN IF(NEW.CUST_LOCATION!='ADAYAR') THEN RAISE_APPLICATION_ERROR('LOCATION OUT OF BOUND'); END IF; END; //
DELIMITER // CREATE TRIGGER BILL_COUNT00 AFTER INSERT ON BILL_ITEM FOR EACH ROW BEGIN DECLARE NO_OF_NEWS INTEGER; DECLARE NO_OF_MAG INTEGER; UPDATE BILL SET NO_OF_NEWS=(SELECT COUNT(*) FROM CUST_NEWS WHERE BILL_NO=CUST_ID); UPDATE BILL SET NO_OF_MAG=(SELECT COUNT(*) FROM CUST_MAG WHERE BILL_NO=CUST_ID); UPDATE BILL SET MAG_AMT=(SELECT SUM(M_PRICE) FROM MAGAZINE WHERE MAG_NAME IN(SELECT MAG_NAME FROM CUST_MAG WHERE BILL_NO=CUST_ID)); UPDATE BILL SET NEWS_AMT=(SELECT SUM(N_PRICE) FROM NEWSPAPER WHERE N_NAME IN(SELECT N_NAME FROM CUST_NEWS WHERE BILL_NO=CUST_ID)); UPDATE BILL SET TOTAL_AMOUNT=MAG_AMT + NEWS_AMT; END;
//
TABLES IN POSTGRES
1. TABLE FOR MART postgres=# CREATE TABLE MART(EMP_ID VARCHAR(5) PRIMARY KEY,NAME VARCHAR(10), postgres(# GENDER VARCHAR(1) CHECK(GENDER IN('M','F')),CONTACT_NO VARCHAR(10), postgres(# LOCATION VARCHAR(20),SUP_NO VARCHAR(5) REFERENCES MART);
2. TABLE FOR PUBLISHER postgres=# CREATE TABLE PUBLISHER(PUB_ID VARCHAR(5) PRIMARY KEY,P_NAME VARCHAR(15), postgres(# EMP_ID VARCHAR(5) REFERENCES MART(EMP_ID));
3. TABLE FOR MAGAZINE postgres=# CREATE TABLE MAGAZINE(MAG_NAME VARCHAR(15) PRIMARY KEY,M_PRICE VARCHAR(3), postgres(# SUP_NO VARCHAR(5),SUP_NAME VARCHAR(15));
4. TABLE FOR PRESS postgres=# CREATE TABLE PRESS(PR_ID VARCHAR(5) PRIMARY KEY,PR_NAME VARCHAR(10),EMP_ID VARCHAR(5) postgres(# REFERENCES MART(EMP_ID));
5. TABLE FOR NEWSPAPER postgres=# CREATE TABLE NEWSPAPER(N_NAME VARCHAR(15) PRIMARY KEY,N_PRICE VARCHAR(2));
6. TABLE FOR CUSTOMER postgres=# CREATE TABLE CUSTOMER(CUST_ID VARCHAR(5) PRIMARY KEY,CUST_NAME VARCHAR(15), postgres(# GENDER VARCHAR(1) CHECK(GENDER IN('M','F')),ADDRESS VARCHAR(25), postgres(# CUST_LOCATION VARCHAR(10),EMP_ID VARCHAR(5) REFERENCES MART(EMP_ID));
7. TABLE FOR BILL postgres=# CREATE TABLE BILL(BILL_NO VARCHAR(5) PRIMARY KEY,NO_OF_MAG VARCHAR(3) ,NO_OF_NEWS VARCHAR(3), postgres(# MAG_AMT VARCHAR(6),NEWS_AMT VARCHAR(6));
8. TABLE FOR BILL_ITEM postgres=# CREATE TABLE BILL_ITEM(BILL_NO VARCHAR(5) REFERENCES BILL(BILL_NO),ITEM_NAME VARCHAR(15), postgres(# PRIMARY KEY(BILL_NO,ITEM_NAME));
9. TABLE FOR CUST_MAG postgres=# CREATE TABLE CUST_MAG(CUST_ID VARCHAR(5) REFERENCES CUSTOMER(CUST_ID),MAG_NAME VARCHAR(15) postgres(# REFERENCES MAGAZINE(MAG_NAME), Opostgres(# PRIMARY KEY(CUST_ID,MAG_NAME));
10. TABLE FOR CUST_NEWS postgres=# CREATE TABLE CUST_NEWS(CUST_ID VARCHAR(5) REFERENCES CUSTOMER(CUST_ID),N_NAME VARCHAR(15) postgres(# REFERENCES NEWSPAPER(N_NAME), postgres(# PRIMARY KEY(CUST_ID,N_NAME));
TRIGGERS IN POSTGRES
1. TRIGGER FOR MAGAZINE COUNT: postgres=# CREATE OR REPLACE FUNCTION MCNT() postgres-# RETURNS TRIGGER AS $$ postgres$# BEGIN postgres$# UPDATE BILL SET NO_OF_ITEMS=(SELECT COUNT(*) FROM CUST_MAG postgres$# WHERE CUST_ID=NEW.CUST_ID); postgres$# RETURN NEW; postgres$# END; postgres$# $$ LANGUAGE PLPGSQL; CREATE FUNCTION
postgres=# CREATE TRIGGER BILL_COUNT postgres-# AFTER INSERT ON CUST_MAG postgres-# FOR EACH ROW postgres-# EXECUTE PROCEDURE MCNT(); CREATE TRIGGER
2. TRIGGER FOR NEWSPAPER COUNT: postgres=# CREATE OR REPLACE FUNCTION NCNT() postgres-# RETURNS TRIGGER AS $$ postgres$# BEGIN postgres$# UPDATE BILL SET NO_OF_ITEMS=(SELECT COUNT(*) FROM CUST_NEWS postgres$# WHERE CUST_ID=NEW.CUST_ID); postgres$# RETURN NEW; postgres$# END; postgres$# $$ LANGUAGE PLPGSQL; CREATE FUNCTION postgres=# CREATE TRIGGER BILL_COUNT1 postgres-# AFTER INSERT ON CUST_NEWS postgres-# FOR EACH ROW postgres-# EXECUTE PROCEDURE NCNT(); CREATE TRIGGER
3. TRIGGER FOR MAGAZINE AMOUNT: postgres=# CREATE OR REPLACE FUNCTION M_AMT() postgres-# RETURNS TRIGGER AS $$ postgres$# DECLARE postgres$# MAG_AMT VARCHAR(12); postgres$# BEGIN postgres$# IF(NEW.BILL_NO IS NOT NULL) postgres$# THEN postgres$# UPDATE BILL SET MAG_AMOUNT=(SELECT SUM(M_PRICE) FROM MAGAZINE postgres$# WHERE postgres$# MAG_NAME IN(SELECT MAG_NAME FROM CUST_MAG WHERE BILL_NO=CUST_ID)); postgres$# ELSE postgres$# RAISE EXCEPTION'BILL_NO IS NULL'; postgres$# END IF; postgres$# RETURN NEW; postgres$# END; postgres$# $$ LANGUAGE PLPGSQL; CREATE FUNCTION postgres=# CREATE TRIGGER BILL_AMOUNT postgres-# AFTER INSERT ON BILL_ITEM postgres-# FOR EACH ROW postgres-# EXECUTE PROCEDURE M_AMT(); CREATE TRIGGER
4. TRIGGER FOR NEWS AMOUNT: postgres=# CREATE OR REPLACE FUNCTION N_AMT() postgres-# RETURNS TRIGGER AS $$ postgres$# DECLARE postgres$# NEWS_AMT VARCHAR(12); postgres$# BEGIN postgres$# IF(NEW.BILL_NO IS NOT NULL) postgres$# THEN postgres$# UPDATE BILL SET NEWS_AMOUNT=(SELECT SUM(N_PRICE) FROM NEWSPAPER postgres$# WHERE postgres$# N_NAME IN(SELECT N_NAME FROM CUST_NEWS WHERE BILL_NO=CUST_ID)); postgres$# ELSE postgres$# RAISE EXCEPTION'BILL_NO IS NULL'; postgres$# END IF; postgres$# RETURN NEW; postgres$# END; postgres$# $$ LANGUAGE PLPGSQL; CREATE FUNCTION postgres=# CREATE TRIGGER BILL_AMOUNT00 postgres-# AFTER INSERT ON BILL_ITEM postgres-# FOR EACH ROW postgres-# EXECUTE PROCEDURE N_AMT(); CREATE TRIGGER
TABLES IN INGRES
1. TABLE FOR MART CREATE TABLE MART(EMP_ID VARCHAR(5) PRIMARY KEY,NAME VARCHAR(10), GENDER VARCHAR(1) CHECK(GENDER IN('M','F')),CONTACT_NO VARCHAR(10), LOCATION VARCHAR(20),SUP_NO VARCHAR(5) REFERENCES MART(EMP_ID))\g
2. TABLE FOR PUBLISHER CREATE TABLE PUBLISHER(PUB_ID VARCHAR(5) PRIMARY KEY,P_NAME VARCHAR(15), EMP_ID VARCHAR(5) REFERENCES MART(EMP_ID))\g
3. TABLE FOR MAGAZINE CREATE TABLE MAGAZINE(MAG_NAME VARCHAR(15) PRIMARY KEY,M_PRICE VARCHAR(3))\g
4. TABLE FOR PRESS CREATE TABLE PRESS(PR_ID VARCHAR(5) PRIMARY KEY,PR_NAME VARCHAR(10),EMP_ID VARCHAR(5) REFERENCES MART(EMP_ID))\g
5. TABLE FOR NEWSPAPER CREATE TABLE NEWSPAPER(N_NAME VARCHAR(15) PRIMARY KEY,N_PRICE VARCHAR(9))\g
6. TABLE FOR CUSTOMER CREATE TABLE CUSTOMER(CUST_ID VARCHAR(5) PRIMARY KEY,CUST_NAME VARCHAR(15), GENDER VARCHAR(1) CHECK(GENDER IN('M','F')),ADDRESS VARCHAR(25), CUST_LOCATION VARCHAR(10),EMP_ID VARCHAR(5) REFERENCES MART(EMP_ID))\g
7. TABLE FOR BILL CREATE TABLE BILL(BILL_NO VARCHAR(5) PRIMARY KEY,NO_OF_MAG VARCHAR(3),NO_OF_NEWS VARCHAR(3), MAG_AMT VARCHAR(6),NEWS_AMT VARCHAR(6))\g
8. TABLE FOR BILL_ITEM CREATE TABLE BILL_ITEM(BILL_NO VARCHAR(5) REFERENCES BILL(BILL_NO) NOT NULL,ITEM_NAME VARCHAR(15) NOT NULL,PRIMARY KEY(BILL_NO,ITEM_NAME))\g
9. TABLE FOR CUST_MAG CREATE TABLE CUST_MAG(CUST_ID VARCHAR(5) REFERENCES CUSTOMER(CUST_ID) NOT NULL,MAG_NAME VARCHAR(15) REFERENCES MAGAZINE(MAG_NAME) NOT NULL,PRIMARY KEY(CUST_ID,MAG_NAME))\g
10. TABLE FOR CUST_NEWS CREATE TABLE CUST_NEWS(CUST_ID VARCHAR(5) REFERENCES CUSTOMER(CUST_ID) NOT NULL,N_NAME VARCHAR(15) REFERENCES NEWSPAPER(N_NAME) NOT NULL,PRIMARY KEY(CUST_ID,N_NAME))\g
TRIGGERS IN INGRES
1. TRIGGER FOR MAGAZINE COUNT: * CREATE PROCEDURE BCNT(BILL_NO VARCHAR(5)) AS * BEGIN * UPDATE BILL SET NO_OF_MAG=(SELECT COUNT(*) FROM CUST_MAG * WHERE BILL_NO=CUST_ID); * END;\G Executing . . .
continue * CREATE TRIGGER BILL_COUNT * AFTER INSERT ON BILL_ITEM * FOR EACH ROW * EXECUTE PROCEDURE BCNT(BILL_NO=NEW.BILL_NO);\G Executing . . .
2. TRIGGER FOR COUNTING NEWSPAPER: * CREATE PROCEDURE NCNT(BILL_NO VARCHAR(5)) AS * BEGIN * UPDATE BILL SET NO_OF_NEWS=(SELECT COUNT(*) FROM CUST_NEWS * WHERE BILL_NO=CUST_ID); * END;\G Executing . . .
continue * CREATE TRIGGER BILL_COUNT1 * AFTER INSERT ON BILL_ITEM * FOR EACH ROW * EXECUTE PROCEDURE NCNT(BILL_NO=NEW.BILL_NO);\G Executing . . .
continue
3.TRIGGER FOR MAGAZINE AMOUNT: * CREATE PROCEDURE MAMT(BILL_NO VARCHAR(5)) AS * * * * DECLARE MAG VARCHAR(6); BEGIN SELECT MAG_AMT INTO MAG FROM BILL WHERE BILL_NO=BILL_NO;
* UPDATE BILL SET MAG_AMT=(SELECT SUM(M_PRICE) PRICE FROM BILL_PRO * WHERE BILL_NO=CUST_ID AND CUST_ID=CUST_ID AND MAG_NAME=MAG_NAME); * END;\G
Executing . . .
continue * CREATE TRIGGER BILL_AMOUNT * * * AFTER INSERT ON BILL_ITEM FOR EACH ROW EXECUTE PROCEDURE MAMT(BILL_NO=NEW.BILL_NO);\G
Executing . . .
4.TRIGGER FOR NEWS AMOUNT: * CREATE PROCEDURE NAMT(BILL_NO VARCHAR(5)) AS * * * * DECLARE NEWS VARCHAR(6); BEGIN SELECT NEWS_AMT INTO NEWS FROM BILL WHERE BILL_NO=BILL_NO;
* UPDATE BILL SET NEWS_AMT=(SELECT SUM(N_PRICE) PRICE FROM BILL_PRO1 * WHERE BILL_NO=CUST_ID AND CUST_ID=CUST_ID AND N_NAME=N_NAME); * END;\G
Executing . . .
continue * CREATE TRIGGER BILL_AMOUNT1 * * * AFTER INSERT ON BILL_ITEM FOR EACH ROW EXECUTE PROCEDURE NAMT(BILL_NO=NEW.BILL_NO);\G
Executing . . .
VIEWS IN INGRES