Trigger is invoked by Oracle engine automatically whenever a specified event occurs. Trigger is stored into database and invoked repeatedly, when specific condition match. Triggers are stored programs, which are automatically executed or fired when some event occurs. Triggers could be defined on the table, view, schema, or database with which the event is associated. Triggers are written to be executed in response to any of the following events:
DELETE
, INSERT
, or UPDATE
).CREATE
, ALTER
, or DROP
).SERVERERROR
, LOGON
, LOGOFF
, STARTUP
, or SHUTDOWN
).INSERTING
: A row is being inserted.UPDATING
: A row is being updated.DELETING
: A row is being deleted.CREATE [OR REPLACE ] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF } {INSERT [OR] | UPDATE [OR] | DELETE} [OF col_name] ON
table_name [REFERENCING OLD AS o NEW AS n]
[FOR EACH ROW] WHEN (condition)
DECLARE --Declaration statements
BEGIN --Executable statements
EXCEPTION --Exception handling statements
END;
1. CREATE [OR REPLACE] TRIGGER name_of_trigger:
2. {BEFORE | AFTER | INSTEAD OF}:
3. {INSERT [OR] | UPDATE [OR] | DELETE}:
4. [OF col_name]:
5. [ON table_name]:
6. [REFERENCING OLD AS o NEW AS n]:
7. [FOR EACH ROW]:
8. WHEN (condition):
Create a trigger to insert details of employee entry made, in EmpLog table.
-- STEP:01 TABLE
CREATE TABLE Employees(
Eid INT PRIMARY KEY,
Ename varchar(20) NOTNULL,
City varchar(20),
Salary number(8, 2) NOT NULL
);
CREATE TABLE EmpLog (
Eid INT PRIMARY KEY,
Ename varchar(20) NOTNULL,
City varchar(20),
Salary number(8, 2) NOT NULL,
Uname varchar(20),
EntryDate date
);
-- STEP:02 TRIGGER
create or replace Trigger After_Insert_Emp
After Insert on
Employees
For Each Row
Declare
Begin
Insert into Emplog
values (:New.eid, :New.ename, :New.city, :New.salary,(Select userfrom dual), (Select sysdate from dual));
dbms_output.put_line('After Insert trigger Successfully executed');
End;
Consider the below given tables. Create a trigger to update details of employee entry made, in EmpUpdLog table
-- STEP:01 TABLES
CREATE TABLE Employees(
Eid INT PRIMARY KEY,
Ename varchar(20) NOTNULL,
City varchar(20),
Salary number(8, 2) NOT NULL
);
CREATE TABLE EmpUpdLog (
Eid INT PRIMARY KEY,
Ename varchar(20) NOT NULL,
OldCity varchar(20),
NewCity varchar(20),
oldSalary number(8, 2) NOT NULL,
NewSalary number(8, 2) NOT NULL,
Uname varchar(20),
UpdateDate date
);
-- STEP:02 TRIGGERS
create or replace Trigger After_Update_Emp
After Update on
Employees
For Each Row
Declare
Begin
Insert into EmpUpdLog
values (:New.eid, :New.ename, :old.city, :New.city, :old.salary, :New.salary, (Select user from dual), (Select sysdate from dual));
dbms_output.put_line('After Update trigger Successfully executed');
End;
UPDATE Employees SET Salary=30000 WHERE Eid=1;
SELECT * FROM EmpUpdLog
Consider the below given tables. Create a trigger to delete details of employee entry made, in EmpDelLog table.
-- STEP:01 TABLE
CREATE TABLE Employees(
Eid INT PRIMARY KEY,
Ename varchar(20) NOTNULL,
City varchar(20),
Salary number(8, 2) NOT NULL
);
CREATE TABLE EmpDelLog (
Eid INT PRIMARY KEY,
Ename varchar(20) NOTNULL,
City varchar(20),
Salary number(8, 2) NOT NULL,
uname varchar(20),
DelDate date
);
-- STEP:02 TRIGGER
create or replace trigger Trig_After_Del
After delete on
employees
for each row
declare
begin
insert into EmpDelLog
values (:old.Eid, :old.Ename, :old.city, :old.salary, (Select user from dual), (Select sysdate from dual));
dbms_output.put_line('After Delete trigger Successfully executed');
end;
DELETE FROM Employees
After Delete trigger Successfully executed
SELECT * FROM EmpDelLog
Create table given below and calculate percentage, total and grade before inserting record.
-- STEP:01 TABLE
Create Table Stu_Table (
Stu_Id int Primary key,
Stu_Name Varchar(15),
Sub1 int,
Sub2 int,
Sub3 int,
Sub4 int,
Sub5 int,
total int,
per float,
status varchar(15)
);
-- STEP:02 TRIGGER
CREATE orreplace TRIGGER Trig_Bef_Insert Before
Insert ON
stu_table
FOR EACH ROW BEGIN
:new.total:= :new.sub1 + :new.sub2 + :new.sub3 +:new.sub4 +:new.sub5;
:new.per:= :new.total / 5;
if : new.per >= 70 then : new.status := 'Dist';
elsif : new.per >= 60
and : new.per < 70 then : new.status := 'First';
elsif : new.per >= 50
and : new.per < 60 then : new.status := 'Second';
elsif : new.per >= 40
and : new.per < 50 then : new.status := 'Third';
else : new.status := 'Pass class';
end if;
dbms_output.put_line('Before Update Trigger Executed');
END;
INSERT INTO Stu_Table (stu_id, stu_name, sub1, sub2, sub3, sub4, sub5)
values
(1, 'John', 89, 76, 72, 80, 78)
SELECT * FROM Stu_Table
Create table given below and create a trigger that checks, if updated account balance is negative, trigger change that to 0.
-- STEP:01 TABLE
CREATE TABLE cust_accounts(
cust_id INT,
cust_name VARCHAR(255),
account_no VARCHAR(255),
account_balance INT
);
INSERT INTO cust_accounts(cust_id, cust_name, account_no, account_balance)
VALUES (2, 'Venzi', '58756500', 89876);
-- STEP:02 TRIGGER
CREATE or replace TRIGGER before_update_cust_accounts BEFORE
UPDATE ON
cust_accounts
FOR EACH ROW declare
BEGIN
IF:NEW.account_balance < 0 THEN:NEW.account_balance:= 0;
END IF;
End;
SELECT * FROM cust_accounts
UPDATE cust_accounts SET account_balance=-90 WHERE cust_id=2;
Create tables given below. Write a trigger that makes detail entry of entry made in salaries table.
-- STEP:01 TABLE
CREATE TABLE Salaries (
employeeNumber INT PRIMARY KEY,
validFrom DATE NOT NULL,
amount DEC(12, 2) NOT NULL
);
CREATE TABLE SalaryArchives (
employeeNumberINT PRIMARY KEY,
validFrom DATE NOT NULL,
amount DEC(12, 2) NOT NULL,
deletedAt TIMESTAMP
);
-- STEP:02 TRIGGER
CREATE orreplace TRIGGER before_salaries_delete
BEFORE DELETE
ON salaries FOR EACH ROW
DECLARE
BEGIN
INSERT INTO SalaryArchives(employeeNumber,validFrom,amount,deletedat)
VALUES(:OLD.employeeNumber,:OLD.validFrom,:OLD.amount,(select current_date from dual));
dbms_output.put_line('Before Trigger Successfully executed');
END;
SELECT * FROM Salaries
DELETE FROM Salaries WHERE employeeNumber = 1;
"Before Trigger Successfully Executed. 1 row(s) deleted."
SELECT * FROM Salaries
SELECT * FROM SalaryArchives
In other words, a statement-level trigger executes once for each transaction.
For example, if you update 1000 rows in a table, then a statement-level trigger on that table would only be executed once.
By default, the statement CREATE TRIGGER
creates a statement-level trigger when you omit the FOR EACH ROW
clause.
Create table given below and make a statement level trigger.
-- STEP:01 TABLE
create table customersCredit (
cid number(5) primary key,
name varchar(20),
address varchar(20),
website varchar(20),
creditlimit number(5)
);
insert into customersCredit
values (1, 'Manika', 'Surat', 'www.amazon.com', 50000);
-- STEP:02 TRIGGER
CREATE OR REPLACE TRIGGER customers_credit_trg BEFORE
UPDATE OF creditlimit
ON customersCredit
DECLARE
l_day_of_month NUMBER;
BEGIN
l_day_of_month := EXTRACT(DAY FROM sysdate);
END;
UPDATE customersCredit SET creditlimit = 9000 WHERE cid = 1
"1 row(s) updated"
UPDATE customersCredit SET creditlimit = 9000 WHERE cid = 1
Made By SOU Student for SOU Students