
рдкрд┐рдЫрд▓реЗ
рд▓реЗрдЦ рдореЗрдВ , рд╣рдордиреЗ рд╕реНрдерд╛рдирд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЙрди рддрдХ рдкрд╣реБрдВрдЪ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреА рдЬрд╛рдВрдЪ рдХреАред
рдЕрдм рдЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдСрдбрд┐рдЯ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╣рдо рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ: рдХреМрди, рдХрдм рдФрд░ рдХреНрдпрд╛ рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ред рдХреМрди рд╕рд╛ рд░рд┐рдХреЙрд░реНрдб (рдкрдврд╝реЗрдВ "рдСрдмреНрдЬреЗрдХреНрдЯ") рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдХреМрди рд╕рд╛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕реЗ рдПрдХ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЖрдЧреЗ "рдЧрд▓рддрдлрд╣рдореА" рди рд╣реЛред
рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдореМрдЬреВрджрд╛ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рдкреНрд░рддрд┐рдпреЛрдВ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдиреНрдп рдирд╛рдореЛрдВ рд╕реЗ рдмреБрд▓рд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЯреЗрдмрд▓ рднреА рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
CREATE TABLE audit_building AS SELECT * FROM building1;
рдЕрдЧрд▓рд╛, рдСрдбрд┐рдЯ рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдирдП рдХреЙрд▓рдо рдЬреЛрдбрд╝реЗрдВ:
ALTER TABLE audit_building ADD COLUMN operation char(1);
рдЙрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рдЯреНрд░рд┐рдЧрд░ рдмрдирд╛рдПрдВ рдЬреЛ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░реЗрдЧрд╛:
CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $audit_building$ BEGIN IF (TG_OP = 'DELETE') THEN INSERT INTO audit_building SELECT 'D', now(), user, OLD.*; RETURN OLD; ELSIF (TG_OP = 'UPDATE') THEN INSERT INTO audit_building SELECT 'U', now(), user, NEW.*; RETURN NEW; ELSIF (TG_OP = 'INSERT') THEN INSERT INTO audit_building SELECT 'I', now(), user, NEW.*; RETURN NEW; END IF; RETURN NULL; END; $audit_building$ LANGUAGE plpgsql; CREATE TRIGGER audit_building AFTER INSERT OR UPDATE OR DELETE ON building1 FOR EACH ROW EXECUTE PROCEDURE process_emp_audit();
рдпрд╣ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдСрдбрд┐рдЯ рдЯреЗрдмрд▓ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдмрдирд╛рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╕реМрдВрдкрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ:
GRANT SELECT ON audit_building TO user2;
рдФрд░ рдЖрдк рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!
рдпрд╣рд╛рдБ рдкрд░рдд рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╣реЗрд░рдлреЗрд░ рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рд╣реБрдЖ рд╣реИ:

рдпрд╣рд╛рдБ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ user2 рдиреЗ 3 рдирдИ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (I) рдмрдирд╛рдИрдВ, рдмрджрд▓реА (U) рдФрд░ рдбрд┐рд▓реАрдЯ (D) рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯред рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░рдд рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рд╕реНрддрдВрднреЛрдВ рдХреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреМрди рд╕реЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рд╣реИред рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд╣ рд╕рдм рд╣реИ! рдЕрдм рд╣рдордиреЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдХрд┐рдП рдЧрдП рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред