Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
6cab3dc
Setting up GitHub Classroom Feedback
github-classroom[bot] Sep 28, 2023
623b7a6
Add assignment deadline url
github-classroom[bot] Sep 28, 2023
8ef7d16
Create makhatsa.mysql
makhatsa Oct 5, 2023
37ba55b
Create 075855-triggers.mysql
kkipyego Oct 5, 2023
6f9f4ad
Merge pull request #3 from 20230831-20231201-ADB-MIT1-1/branton
kkipyego Oct 5, 2023
dd96b10
Merge pull request #2 from 20230831-20231201-ADB-MIT1-1/kipyego-dev
kkipyego Oct 5, 2023
d55cfb7
Created table & Trigger
kkipyego Oct 5, 2023
66ca3b0
Merge pull request #4 from 20230831-20231201-ADB-MIT1-1/kipyego-dev
makhatsa Oct 5, 2023
f884278
triggers lab steps
clarianmakungu Oct 19, 2023
432c5cf
Update 170490 -triggers.mysql
clarianmakungu Oct 19, 2023
d83407f
Create Clarian_Triggers.sql
clarianmakungu Oct 19, 2023
471ef89
Create 075855-triggers.sql
kkipyego Oct 19, 2023
e37110d
Merge branch 'kipyego-dev' of https://github.com/20230831-20231201-AD…
kkipyego Oct 19, 2023
520092b
Merge pull request #5 from 20230831-20231201-ADB-MIT1-1/kipyego-dev
kkipyego Oct 19, 2023
25555b0
Create Lab2-triggers_and_check_constraints.sql
kkipyego Oct 24, 2023
f8f9c59
Merge pull request #6 from 20230831-20231201-ADB-MIT1-1/kipyego-dev
kkipyego Oct 24, 2023
649db8a
Created the transaction & implemented the triggers
kkipyego Oct 30, 2023
6ac7e4e
Merge pull request #7 from 20230831-20231201-ADB-MIT1-1/kipyego-dev
kkipyego Oct 31, 2023
f427f4c
Update Lab2-triggers_and_check_constraints.sql
makhatsa Oct 31, 2023
8c747dc
Add files via upload
clarianmakungu Oct 31, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
171 changes: 171 additions & 0 deletions .github/Clarian_Triggers.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
-- List all the databases
SHOW DATABASES;
-- switch to the current database
USE 75855_lab2_triggers;
-- list of all tables
SHOW TABLES;

-- STEP 1
SHOW CREATE TABLE employees;
CREATE TABLE `employees` (
`employeeNumber` int NOT NULL,
`lastName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`firstName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`extension` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`officeCode` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`reportsTo` int DEFAULT NULL,
`jobTitle` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
PRIMARY KEY (`employeeNumber`),
KEY `reportsTo` (`reportsTo`),
KEY `officeCode` (`officeCode`),
CONSTRAINT `employees_ibfk_1` FOREIGN KEY (`reportsTo`) REFERENCES `employees` (`employeeNumber`),
CONSTRAINT `employees_ibfk_2` FOREIGN KEY (`officeCode`) REFERENCES `offices` (`officeCode`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

CREATE TABLE `employees_undo` (
`date_of_change` timestamp(2) NOT NULL DEFAULT CURRENT_TIMESTAMP(2),
`employeeNumber` int NOT NULL,
`lastName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`firstName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`extension` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`officeCode` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`reportsTo` int DEFAULT NULL,
`jobTitle` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`change_type` varchar(50) NOT NULL,
PRIMARY KEY (`date_of_change`),
UNIQUE KEY `date_of_change_UNIQUE` (`date_of_change`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- STEP 2
CREATE

TRIGGER TRG_BEFORE_UPDATE_ON_employees
BEFORE UPDATE ON employees FOR EACH ROW

INSERT INTO `employees_undo` SET
`date_of_change` = CURRENT_TIMESTAMP(2),
`employeeNumber` = OLD.`employeeNumber` ,
`lastName` = OLD.`lastName` ,
`firstName` = OLD.`firstName` ,
`extension` = OLD.`extension` ,
`email` = OLD.`email` ,
`officeCode` = OLD.`officeCode` ,
`reportsTo` = OLD.`reportsTo` ,
`jobTitle` = OLD.`jobTitle` ,
`change_type` = 'An update DML operation was executed';

-- STEP 4
SHOW TRIGGERS;
UPDATE `employees`
SET
`lastName` = 'Muiruri'
WHERE

`employeeNumber` = '1056';
SELECT * FROM employees_undo;

-- STEP 5 Create a table to store reminders
CREATE TABLE `customers_data_reminders` (
`customerNumber` int NOT NULL COMMENT 'Identifies the customer whose data
is partly missing',
`customers_data_reminders_timestamp` timestamp(2) NOT NULL DEFAULT
CURRENT_TIMESTAMP(2) COMMENT 'Records the time when the missing data was
detected',
`customers_data_reminders_message` varchar(100) NOT NULL COMMENT 'Records
a message that helps the customer service personnel to know what data is
missing from the customer\'s record',
`customers_data_reminders_status` tinyint NOT NULL DEFAULT '0' COMMENT
'Used to record the status of a reminder (0 if it has not yet been
addressed and 1 if it has been addressed)',
PRIMARY KEY
(`customerNumber`,`customers_data_reminders_timestamp`,`customers_data_remi
nders_message`,`customers_data_reminders_status`),
CONSTRAINT `FK_1_customers_TO_M_customers_data_reminders` FOREIGN KEY
(`customerNumber`) REFERENCES `customers` (`customerNumber`)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE=InnoDB COMMENT='Used to remind the customer service personnel
about a client\'s missing data. This enables them to ask the client to
provide the data during the next interaction with the client.'

-- STEP 6 Create a trigger that has multiple statements
DELIMITER $$
CREATE TRIGGER TRG_AFTER_INSERT_ON_customers
AFTER INSERT ON customers FOR EACH ROW
BEGIN
IF NEW.postalCode IS NULL THEN
INSERT INTO `customers_data_reminders`
(`customerNumber`, `customers_data_reminders_timestamp`,
`customers_data_reminders_message`)
VALUES (NEW.customerNumber, CURRENT_TIMESTAMP(2), 'Please remember
to record the client\'s postal code');
END IF;
IF NEW.salesRepEmployeeNumber IS NULL THEN
INSERT INTO `customers_data_reminders`
(`customerNumber`, `customers_data_reminders_timestamp`,
`customers_data_reminders_message`)
VALUES (NEW.customerNumber, CURRENT_TIMESTAMP(2), 'Please remember
to assign a sales representative to the client');
END IF;
IF NEW.creditLimit IS NULL THEN
INSERT INTO `customers_data_reminders`
(`customerNumber`, `customers_data_reminders_timestamp`,
`customers_data_reminders_message`)
VALUES (NEW.customerNumber, CURRENT_TIMESTAMP(2), 'Please remember
to set the client\'s credit limit');
END IF;
END$$
DELIMITER ;

-- STEP 7 Confirm the trigger is fired when insertion is made
INSERT INTO `customers`
(`customerNumber`, `customerName`, `contactLastName`, `contactFirstName`,
`phone`, `addressLine1`, `city`, `country`)
VALUES
('497', 'House of Leather', 'Wambua', 'Gabriel', '+254 720 123 456', '9
Agha Khan Walk', 'Nairobi', 'Kenya');

-- STEP 8 Create a new table to store parts data
CREATE TABLE part (
part_no VARCHAR(18) PRIMARY KEY,
part_description VARCHAR(255),
part_supplier_tax_PIN VARCHAR (11) CHECK (part_supplier_tax_PIN REGEXP
'^[A-Z]{1}[0-9]{9}[A-Z]{1}$'),
part_supplier_email VARCHAR (55),
part_buyingprice DECIMAL(10,2 ) NOT NULL CHECK (part_buyingprice >= 0),
part_sellingprice DECIMAL(10,2) NOT NULL,
CONSTRAINT CHK_part_sellingprice_GT_buyingprice CHECK
(part_sellingprice >= part_buyingprice),
CONSTRAINT CHK_part_valid_supplier_email CHECK (part_supplier_email
REGEXP '^[a-zA-Z0-9]{3,}@[a-zA-Z0-9]{1,}\\.[a-zA-Z0-9.]{1,}$')
);

-- STEP 9. Create the following user-defined error in a trigger
DELIMITER //
CREATE TRIGGER TRG_BEFORE_UPDATE_ON_part
BEFORE UPDATE ON part FOR EACH ROW
BEGIN
DECLARE errorMessage VARCHAR(255);
DECLARE EXIT HANDLER FOR SQLSTATE '45000'
BEGIN
RESIGNAL SET MESSAGE_TEXT = errorMessage;
END;
SET errorMessage = CONCAT('The new selling price of ',
NEW.part_sellingprice, ' cannot be 2 times greater than the current selling
price of ', OLD.part_sellingprice);
IF NEW.part_sellingprice > OLD.part_sellingprice * 2 THEN
SIGNAL SQLSTATE '45000';
END IF;
END//
DELIMITER ;


-- STEP 10. Confirm that the static, dynamic, and semantic constraints are working

INSERT INTO `part` (`part_no`, `part_description`, `part_supplier_tax_PIN`,
`part_supplier_email`, `part_buyingprice`, `part_sellingprice`)
VALUES ('001', 'The tyres of a 1958 Chevy Corvette Limited Edition',
'P05120157U', 'toysRus@gmail', '100', '50');
Binary file added .github/Lab2-triggers_and_check_constraints.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
61 changes: 61 additions & 0 deletions 075855-triggers.mysql
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
-- List all the databases
SHOW DATABASES;
-- switch to the current database
USE 75855_lab2_triggers;
-- list of all tables
SHOW TABLES;

-- STEP 1
SHOW CREATE TABLE employees;
CREATE TABLE `employees` (
`employeeNumber` int NOT NULL,
`lastName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`firstName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`extension` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`officeCode` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`reportsTo` int DEFAULT NULL,
`jobTitle` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
PRIMARY KEY (`employeeNumber`),
KEY `reportsTo` (`reportsTo`),
KEY `officeCode` (`officeCode`),
CONSTRAINT `employees_ibfk_1` FOREIGN KEY (`reportsTo`) REFERENCES `employees` (`employeeNumber`),
CONSTRAINT `employees_ibfk_2` FOREIGN KEY (`officeCode`) REFERENCES `offices` (`officeCode`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

CREATE TABLE `employees_undo` (
`date_of_change` timestamp(2) NOT NULL DEFAULT CURRENT_TIMESTAMP(2),
`employeeNumber` int NOT NULL,
`lastName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`firstName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`extension` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`officeCode` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`reportsTo` int DEFAULT NULL,
`jobTitle` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`change_type` varchar(50) NOT NULL,
PRIMARY KEY (`date_of_change`),
UNIQUE KEY `date_of_change_UNIQUE` (`date_of_change`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- STEP 2
CREATE

TRIGGER TRG_BEFORE_UPDATE_ON_employees
BEFORE UPDATE ON employees FOR EACH ROW

INSERT INTO `employees_undo` SET
`date_of_change` = CURRENT_TIMESTAMP(2),
`employeeNumber` = OLD.`employeeNumber` ,
`lastName` = OLD.`lastName` ,
`firstName` = OLD.`firstName` ,
`extension` = OLD.`extension` ,
`email` = OLD.`email` ,
`officeCode` = OLD.`officeCode` ,
`reportsTo` = OLD.`reportsTo` ,
`jobTitle` = OLD.`jobTitle` ,
`change_type` = 'An update DML operation was executed';

-- STEP 3
SHOW TRIGGERS;
Loading