Skip to content

Commit 00ae6b9

Browse files
committed
[SQL-519] What is a trigger in SQL
1 parent 277080a commit 00ae6b9

File tree

201 files changed

+2059
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

201 files changed

+2059
-0
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
CREATE TABLE IF NOT EXISTS student_audit_log (
2+
id INT AUTO_INCREMENT PRIMARY KEY,
3+
student_id INT NOT NULL,
4+
action VARCHAR(255) NOT NULL,
5+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
6+
);
7+
8+
DROP TRIGGER IF EXISTS after_student_insert;
9+
DROP TRIGGER IF EXISTS after_student_update;
10+
DROP TRIGGER IF EXISTS after_student_delete;
11+
12+
DELIMITER //
13+
CREATE TRIGGER after_student_insert
14+
AFTER INSERT ON Student
15+
FOR EACH ROW
16+
BEGIN
17+
INSERT INTO student_audit_log(student_id, action)
18+
VALUES (NEW.id, 'INSERT');
19+
END//
20+
21+
CREATE TRIGGER after_student_update
22+
AFTER UPDATE ON Student
23+
FOR EACH ROW
24+
BEGIN
25+
INSERT INTO student_audit_log(student_id, action)
26+
VALUES (NEW.id, 'UPDATE');
27+
END//
28+
29+
CREATE TRIGGER after_student_delete
30+
AFTER DELETE ON Student
31+
FOR EACH ROW
32+
BEGIN
33+
INSERT INTO student_audit_log(student_id, action)
34+
VALUES (OLD.id, 'DELETE');
35+
END//
36+
DELIMITER ;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
CREATE TABLE IF NOT EXISTS student_audit_log (
2+
id SERIAL PRIMARY KEY,
3+
student_id INT NOT NULL,
4+
action VARCHAR(255) NOT NULL,
5+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
6+
);
7+
8+
CREATE OR REPLACE FUNCTION log_student_changes()
9+
RETURNS TRIGGER AS $$
10+
BEGIN
11+
IF TG_OP = 'INSERT' THEN
12+
INSERT INTO student_audit_log(student_id, action)
13+
VALUES (NEW.id, 'INSERT');
14+
RETURN NEW;
15+
ELSIF TG_OP = 'UPDATE' THEN
16+
INSERT INTO student_audit_log(student_id, action)
17+
VALUES (NEW.id, 'UPDATE');
18+
RETURN NEW;
19+
ELSIF TG_OP = 'DELETE' THEN
20+
INSERT INTO student_audit_log(student_id, action)
21+
VALUES (OLD.id, 'DELETE');
22+
RETURN OLD;
23+
END IF;
24+
RETURN NULL;
25+
END;
26+
$$ LANGUAGE plpgsql;
27+
28+
-- Drop existing triggers if they exist
29+
DROP TRIGGER IF EXISTS student_audit_trigger ON Student;
30+
31+
-- Create the trigger
32+
CREATE TRIGGER student_audit_trigger
33+
AFTER INSERT OR UPDATE OR DELETE ON Student
34+
FOR EACH ROW EXECUTE FUNCTION log_student_changes();
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Student_audit_log]') AND type in (N'U'))
2+
BEGIN
3+
CREATE TABLE Student_audit_log (
4+
id INT IDENTITY(1,1) PRIMARY KEY,
5+
student_id INT NOT NULL,
6+
action VARCHAR(255) NOT NULL,
7+
created_at DATETIME DEFAULT GETDATE()
8+
);
9+
END
10+
11+
-- Drop existing triggers if they exist
12+
IF EXISTS (SELECT * FROM sys.triggers WHERE name = 'trg_student_audit')
13+
DROP TRIGGER trg_student_audit;
14+
GO
15+
16+
CREATE TRIGGER trg_student_audit
17+
ON Student
18+
AFTER INSERT, UPDATE, DELETE
19+
AS
20+
BEGIN
21+
SET NOCOUNT ON;
22+
23+
24+
IF EXISTS (SELECT * FROM inserted) AND NOT EXISTS (SELECT * FROM deleted)
25+
BEGIN
26+
INSERT INTO student_audit_log (student_id, action)
27+
SELECT id, 'INSERT'
28+
FROM inserted;
29+
END
30+
31+
IF EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted)
32+
BEGIN
33+
INSERT INTO student_audit_log (student_id, action)
34+
SELECT id, 'UPDATE'
35+
FROM inserted;
36+
END
37+
38+
IF EXISTS (SELECT * FROM deleted) AND NOT EXISTS (SELECT * FROM inserted)
39+
BEGIN
40+
INSERT INTO student_audit_log (student_id, action)
41+
SELECT id, 'DELETE'
42+
FROM deleted;
43+
END
44+
END
45+
GO

mysql-queries/README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
### Relevant Articles:
2+
- [How to Find the Engine for a Specific Table in MySQL?](https://www.baeldung.com/sql/mysql-find-table-storage-engine)
3+
- [Changing a Table’s Storage Engine in MySQL](https://www.baeldung.com/sql/mysql-change-table-storage-engine)
4+
- [Pattern Matching in MySQL](https://www.baeldung.com/sql/mysql-pattern-matching)
5+
- [Comments in MySQL](https://www.baeldung.com/sql/mysql-comments-single-line-multiline-hint)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
ALTER TABLE Student ENGINE=MyISAM;
2+
3+
SELECT
4+
engine
5+
FROM
6+
information_schema.tables
7+
WHERE
8+
table_schema = 'University'
9+
AND table_name = 'Student';
10+
11+
ALTER TABLE Student ENGINE=InnoDB;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
SELECT
2+
engine
3+
FROM
4+
information_schema.tables
5+
WHERE
6+
table_schema = 'University'
7+
AND table_name = 'Student';
8+
9+
SHOW TABLE STATUS LIKE 'Student';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
SHOW ENGINES;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-- This query returns all Students in the University
2+
SELECT * FROM Student;
3+
SELECT * FROM Student -- WHERE NAME = 'John';
4+
5+
SELECT * FROM Student WHERE NAME /* wild card matching for name */ LIKE '%John%';
6+
7+
SELECT * FROM Student WHERE NAME
8+
/* wild card matching for name.
9+
Change it based on the requirement
10+
*/
11+
LIKE '%John%';
12+
13+
SELECT /*! STRAIGHT_JOIN */ * FROM Student /*+ USE INDEX (PRIMARY) */ WHERE id = 1001;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
SELECT * FROM performance_schema.metadata_locks
2+
WHERE OBJECT_TYPE = 'USER LEVEL LOCK';
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
LOCK TABLES Student WRITE;
2+
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
UNLOCK TABLES;
2+
3+
SELECT RELEASE_LOCK('Student');
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
SHOW OPEN TABLES WHERE `Table` LIKE 'Student' AND `Database` LIKE 'University' AND In_use > 0;
2+
3+
SHOW OPEN TABLES WHERE In_use > 0;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
-- specify the database
2+
USE University;
3+
4+
-- find the engine of University.Student
5+
-- using the information_schema.tables
6+
SELECT engine
7+
FROM information_schema.tables
8+
WHERE table_schema = 'University'
9+
AND table_name = 'Student';
10+
11+
-- find the engine of all the tables in University
12+
-- using the information_schema.tables
13+
SELECT table_name, engine
14+
FROM information_schema.tables
15+
WHERE table_schema = 'University'
16+
AND table_type = 'BASE TABLE'
17+
AND table_name = 'Student';
18+
19+
-- find the engine of University.Student
20+
-- using the information_schema.tables
21+
SHOW TABLE STATUS
22+
FROM University
23+
WHERE name = 'Student';

mysql-queries/mysql-images/images.sql

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
-- SQL Script for the article Images in MySQL
2+
3+
-- Change schema to University
4+
USE University;
5+
6+
-- Check max image size you can upload
7+
SHOW VARIABLES LIKE 'max_allowed_packet';
8+
SHOW VARIABLES LIKE 'secure_file_priv';
9+
10+
-- Grant access
11+
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
12+
FLUSH PRIVILEGES;
13+
14+
-- DIRECT STORAGE
15+
16+
-- Create Tables
17+
CREATE TABLE DepartmentComplete
18+
(
19+
id INT PRIMARY KEY NOT Null,
20+
name VARCHAR (50),
21+
code VARCHAR (4),
22+
logo BLOB,
23+
UNIQUE (id)
24+
);
25+
26+
CREATE TABLE StudentComplete
27+
(
28+
id INT PRIMARY KEY NOT null,
29+
name VARCHAR (60),
30+
national_id BIGINT NOT Null,
31+
birth_date DATE,
32+
enrollment_date DATE,
33+
graduation_date DATE,
34+
gpa FLOAT,
35+
profile_pic BLOB,
36+
UNIQUE (id)
37+
);
38+
39+
-- Adding data for DepartmentComplete
40+
INSERT INTO DepartmentComplete (id, name, code, logo) VALUES
41+
(1, 'Computer Science', 'CS', LOAD_FILE('/usr/local/mysql/data/cs_logo.png')),
42+
(2, 'Electronics and Communications', 'EC', LOAD_FILE('/usr/local/mysql/data/ece_logo.png')),
43+
(3, 'Social Sciences', 'SS', LOAD_FILE('/usr/local/mysql/data/ss_logo.png')),
44+
(4, 'Computational Biology', 'CB', LOAD_FILE('/usr/local/mysql/data/cb_logo.png')),
45+
(5, 'Mathematics', 'MA', LOAD_FILE('/usr/local/mysql/data/ma_logo.png'));
46+
47+
-- Adding data for StudentComplete
48+
INSERT INTO StudentComplete (id, name, national_id, birth_date, enrollment_date, graduation_date, gpa, profile_pic) VALUES
49+
(1001, 'John Liu', 123345566, '2001-04-05', '2020-01-15', '2024-06-15', 4, LOAD_FILE('/usr/local/mysql/data/john_pp.jpeg')),
50+
(1003, 'Rita Ora', 132345166, '2001-01-14', '2020-01-15', '2024-06-15', 4.2, LOAD_FILE('/usr/local/mysql/data/rita_pp.jpeg')),
51+
(1007, 'Philip Lose', 321345566, '2001-06-15', '2020-01-15', '2024-06-15', 3.8, LOAD_FILE('/usr/local/mysql/data/philip_pp.jpeg')),
52+
(1010, 'Samantha Prabhu', 3217165566, '2001-03-21', '2020-01-15', '2024-06-15', 4.9, LOAD_FILE('/usr/local/mysql/data/cs_logo.png')),
53+
(1011, 'Vikas Jain', 321345662, '2001-7-18', '2020-01-15', NULL, 3.3, LOAD_FILE('/usr/local/mysql/data/vikas_pp.jpeg'));
54+
55+
SELECT * from DepartmentComplete;
56+
57+
SELECT * from StudentComplete;
58+
59+
-- INDIRECT STORAGE
60+
-- Alter Table DepartmentComplete to drop logo
61+
ALTER TABLE DepartmentComplete
62+
DROP COLUMN logo;
63+
64+
-- Alter Table DepartmentComplete to add logo_path
65+
ALTER TABLE DepartmentComplete
66+
ADD logo_path VARCHAR (256);
67+
68+
-- Alter Table StudentComplete to drop profile_pic
69+
ALTER TABLE StudentComplete
70+
DROP COLUMN profile_pic;
71+
72+
-- Alter Table StudentComplete to add profile_pic_path
73+
ALTER TABLE StudentComplete
74+
ADD profile_pic_path VARCHAR (256);
75+
76+
77+
-- Update data
78+
UPDATE DepartmentComplete SET logo_path='/usr/local/mysql/data/cs_logo.png' WHERE code ='CS';
79+
UPDATE DepartmentComplete SET logo_path='/usr/local/mysql/data/ece_logo.png' WHERE code ='EC';
80+
UPDATE DepartmentComplete SET logo_path='/usr/local/mysql/data/ss_logo.png' WHERE code ='SS';
81+
UPDATE DepartmentComplete SET logo_path='/usr/local/mysql/data/cb_logo.png' WHERE code ='CB';
82+
UPDATE DepartmentComplete SET logo_path='/usr/local/mysql/data/ma_logo.png' WHERE code ='MA';
83+
84+
UPDATE StudentComplete SET profile_pic_path='/usr/local/mysql/data/john_pp.jpeg' WHERE name ='John Liu';
85+
UPDATE StudentComplete SET profile_pic_path='/usr/local/mysql/data/rita_pp.jpeg' WHERE name ='Rita Ora';
86+
UPDATE StudentComplete SET profile_pic_path='/usr/local/mysql/data/philip_pp.jpeg' WHERE name ='Philip Lose';
87+
UPDATE StudentComplete SET profile_pic_path='/usr/local/mysql/data/samantha_pp.jpeg' WHERE name ='Samantha Prabhu';
88+
UPDATE StudentComplete SET profile_pic_path='/usr/local/mysql/data/vikas_pp.jpeg' WHERE name ='Vikas Jain';
89+
90+
-- END
1.55 KB
Loading
1.67 KB
Loading
3.16 KB
Loading
2.63 KB
Loading
3.19 KB
Loading
5.02 KB
Loading
2.63 KB
Loading
Loading
1.74 KB
Loading
3.93 KB
Loading
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
-- Change schema to University
2+
USE University;
3+
4+
-- LIKE
5+
SELECT * FROM Student
6+
WHERE name LIKE LOWER ('R%');
7+
8+
SELECT * FROM Student
9+
WHERE name LIKE BINARY 'r%';
10+
11+
SELECT * FROM Student
12+
WHERE name LIKE '_________';
13+
14+
-- REGEXP_LIKE
15+
SELECT * FROM Student
16+
WHERE REGEXP_LIKE(name, '^R');
17+
18+
SELECT * FROM Student
19+
WHERE REGEXP_LIKE(name, '^r', 'c');
20+
21+
SELECT Department.name, Course.name
22+
FROM Department LEFT JOIN Course ON Department.id = Course.department_id
23+
WHERE REGEXP_LIKE(Course.name, 'to')
24+
AND Department.code="CS";
25+
26+
-- LOCATE
27+
SELECT * FROM Student
28+
WHERE LOCATE('R', name, 1)=1;
29+
30+
SELECT * FROM Department
31+
WHERE LOCATE('a', name) < 0
32+
AND LOCATE('a', name) < 0
33+
AND LOCATE('e', name) < 0
34+
AND LOCATE('i', name) < 0
35+
AND LOCATE('o', name) < 0
36+
AND LOCATE('u', name) < 0;

0 commit comments

Comments
 (0)