Skip to content

Commit c9aaeca

Browse files
Stefanos GeorgakisStefanos Georgakis
authored andcommitted
[SQL-519] What is a trigger in SQL
1 parent 4e3d348 commit c9aaeca

File tree

3 files changed

+147
-0
lines changed

3 files changed

+147
-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,
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: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
CREATE TABLE IF NOT EXISTS Student_Audit_Log (
2+
id SERIAL PRIMARY KEY,
3+
student_id INT,
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+
CREATE TRIGGER student_audit_trigger
29+
AFTER INSERT OR UPDATE OR DELETE ON Student
30+
FOR EACH ROW EXECUTE FUNCTION log_student_changes();
31+
32+
CREATE OR REPLACE FUNCTION log_bulk_deletion_student()
33+
RETURNS TRIGGER AS $$
34+
BEGIN
35+
INSERT INTO Student_Audit_Log (action)
36+
VALUES ('BULK_DELETION');
37+
RETURN NULL;
38+
END;
39+
$$ LANGUAGE plpgsql;
40+
41+
CREATE TRIGGER log_bulk_deletion_student_trigger
42+
AFTER DELETE ON Student
43+
FOR EACH STATEMENT EXECUTE FUNCTION log_bulk_deletion_student();
44+
45+
CREATE OR REPLACE VIEW Department_View AS
46+
SELECT * FROM Department;
47+
48+
CREATE OR REPLACE FUNCTION prevent_department_delete()
49+
RETURNS TRIGGER AS $$
50+
BEGIN
51+
RETURN NULL;
52+
END;
53+
$$ LANGUAGE plpgsql;
54+
55+
CREATE TRIGGER prevent_department_deletion_trigger
56+
INSTEAD OF DELETE ON Department_View
57+
FOR EACH ROW
58+
EXECUTE FUNCTION prevent_department_delete();
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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,
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;
46+
47+
CREATE TRIGGER prevent_department_deletion_trigger
48+
ON Department
49+
INSTEAD OF DELETE
50+
AS
51+
BEGIN
52+
RETURN;
53+
END;

0 commit comments

Comments
 (0)