Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sH738-003PZb-0m for pgsql-general@arkaria.postgresql.org; Tue, 11 Jun 2024 19:20:54 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1sH735-0094n9-Sc for pgsql-general@arkaria.postgresql.org; Tue, 11 Jun 2024 19:20:52 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sH735-0094n0-HR for pgsql-general@lists.postgresql.org; Tue, 11 Jun 2024 19:20:52 +0000 Received: from mail-ej1-x62d.google.com ([2a00:1450:4864:20::62d]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1sH72y-0019NV-UM for pgsql-general@lists.postgresql.org; Tue, 11 Jun 2024 19:20:51 +0000 Received: by mail-ej1-x62d.google.com with SMTP id a640c23a62f3a-a6f09eaf420so365754966b.3 for ; Tue, 11 Jun 2024 12:20:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718133642; x=1718738442; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=21JzYcdrqNBdyEFZ6L+yBCqxxZKmAiOL6FMrNYPo4cA=; b=b2YF4JBgwPd0wc90rtogsJxRDrxdBZbtn9tDnPD0DbxF+AlLy3BJVtUQoFqEbzLc6a WAeMgUZdMz4TKT4O7A1ybGEIzco1/l24BoNA3FZOU7YXOrlgdcDscRShFEVWoYzL8HKu HiREKEfmNKoqbKmgrnD8W9gu9p8shm+sM8KVs18pfPjUwxbHNsOYCzTCl7pj6NQtU5oS /zYf2lsdZQnmfLxOCZUxN8P9ubiE5QReUYeGiMFahyaVbOGEyCQZ0lNfI+6PD+JL0oD3 1lrW/z0WlGl9VUA4tMXi4AZbJijM9tXFHq5lyQnhYQSmvQZ22mzym/ET7GrgTi5o0c5A ejkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718133642; x=1718738442; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=21JzYcdrqNBdyEFZ6L+yBCqxxZKmAiOL6FMrNYPo4cA=; b=jVnX3MBj0ECgFjCishhPiNsIwIdRjVRGnwStgkfvgYeBA9UWJ7wb7XydfcEmEKr70J 475ry2YKk0dvBEg3IT4E4SD0nJ1DZC5uSlEi7aETidjagfLozW3ewTWIzLr5RTq2ehyc tW/AJRNCd/r8giiniLTnLVhDyzlN/+vPGIfkv8eSdAGuYnj3803qsTxhwgCWbxwkhSIT grRZ0mBcYnpUgytiIzjby82ikK0gwgqqVLyV3Da84da80XjvCVvOWkMMEBSrfdNcKtX5 FwRwUGta8KMZ5jxpIVkjDgljJKXDLitAHMJeQK5dDL0jhwVc/2J+8CJqgkk9I0l97MTv Pj6A== X-Gm-Message-State: AOJu0YwWVIepduWDLNDcheB5btHOCTBnWiz6nEPemfTneTH3IXuCc1ld p8IHGEyQXC0++qgT5AnKVkesoFEJ4ka52KGUbrxBF3rvmonRcE3o5AHgAz/vlv6flF50m/X7iux aXOyEkDK599Iot/BsMrgny+z5sHk= X-Google-Smtp-Source: AGHT+IE7jmtrc+9fubPksx/og7cugtUx5vO4zLuEnTKSs50KC+zsuzwnDRSMJ0kNErAcoWnzTPl8F3DjiWzux55AHIQ= X-Received: by 2002:a17:906:39d5:b0:a6e:fb9b:676c with SMTP id a640c23a62f3a-a6efb9b69aamr598240766b.68.1718133641993; Tue, 11 Jun 2024 12:20:41 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: veem v Date: Wed, 12 Jun 2024 00:50:27 +0530 Message-ID: Subject: Re: Does trigger only accept functions? To: depesz@depesz.com Cc: pgsql-general Content-Type: multipart/alternative; boundary="00000000000068635e061aa22903" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000068635e061aa22903 Content-Type: text/plain; charset="UTF-8" On Wed, 12 Jun 2024 at 00:26, hubert depesz lubaczewski wrote: > > > No, I meant building dynamic queries and then EXECUTE-ing, like docs > show: > > https://www.postgresql.org/docs/current/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN > > Best regards, > > depesz > > My apology, if interpreting it wrong way. It doesn't make much difference though, but do you mean something like below? CREATE OR REPLACE FUNCTION log_deletes() RETURNS TRIGGER AS $$ DECLARE audit_table_name TEXT; audit_query TEXT; BEGIN IF TG_TABLE_NAME = 'source_table1' THEN audit_table_name := 'delete_audit1'; audit_query := 'INSERT INTO ' || audit_table_name || ' (record_id, delete_timestamp, col1, col2, col3) VALUES ( $2, $3, $4)'; EXECUTE audit_query USING OLD.id, OLD.col1, OLD.col2, OLD.col3; ELSIF TG_TABLE_NAME = 'source_table2' THEN audit_table_name := 'delete_audit2'; audit_query := 'INSERT INTO ' || audit_table_name || ' ( col4, col5, col6) VALUES ( $2, $3, $4)'; EXECUTE audit_query USING OLD.id, OLD.col4, OLD.col5, OLD.col6; ELSE RAISE EXCEPTION 'Audit table not defined for %', TG_TABLE_NAME; END IF; RETURN OLD; END; $$ LANGUAGE plpgsql; --00000000000068635e061aa22903 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable


=
On Wed, 12 Jun 2024 at 00:26, hubert = depesz lubaczewski <depesz@depesz.c= om> wrote:
http= s://www.postgresql.org/docs/current/plpgsql-statements.html#PLPGSQL-STATEME= NTS-EXECUTING-DYN

Best regards,

depesz


My apology, if interpreting it wrong w= ay. It doesn't=C2=A0make much difference though, but do you mean someth= ing like below?

CREATE OR REPL= ACE FUNCTION log_deletes()
RETURNS TRIGGER AS $$
DECLARE
=C2=A0 = =C2=A0 audit_table_name TEXT;
=C2=A0 =C2=A0 audit_query TEXT;
BEGIN=C2=A0 =C2=A0 IF TG_TABLE_NAME =3D 'source_table1' THEN
=C2=A0= =C2=A0 =C2=A0 =C2=A0 audit_table_name :=3D 'delete_audit1';
=C2= =A0 =C2=A0 =C2=A0 =C2=A0 audit_query :=3D 'INSERT INTO ' || audit_t= able_name || ' (record_id, delete_timestamp, col1, col2, col3) VALUES (= $2, $3, $4)';
=C2=A0 =C2=A0 =C2=A0 =C2=A0 EXECUTE audit_query USING= OLD.id, OLD.col1, OLD.col2, OLD.col3;
=C2=A0 =C2=A0 ELSIF TG_TABLE_NAME= =3D 'source_table2' THEN
=C2=A0 =C2=A0 =C2=A0 =C2=A0 audit_tabl= e_name :=3D 'delete_audit2';
=C2=A0 =C2=A0 =C2=A0 =C2=A0 audit_q= uery :=3D 'INSERT INTO ' || audit_table_name || ' ( col4, col5,= col6) VALUES ( $2, $3, $4)';
=C2=A0 =C2=A0 =C2=A0 =C2=A0 EXECUTE au= dit_query USING OLD.id, OLD.col4, OLD.col5, OLD.col6;
=C2=A0 =C2=A0
= =C2=A0 =C2=A0 ELSE
=C2=A0 =C2=A0 =C2=A0 =C2=A0 RAISE EXCEPTION 'Audi= t table not defined for %', TG_TABLE_NAME;
=C2=A0 =C2=A0 END IF;
=
=C2=A0 =C2=A0 RETURN OLD;
END;
$$ LANGUAGE plpgsql;=C2=A0
--00000000000068635e061aa22903--