Re: Converting sql anywhere to postgres - Mailing list pgsql-general
From | Georg H. |
---|---|
Subject | Re: Converting sql anywhere to postgres |
Date | |
Msg-id | b99a285f-6fb3-b1b8-0c2b-ca08dd23f6e2@silentrunner.de Whole thread Raw |
In response to | Converting sql anywhere to postgres (Russell Rose | Passfield Data Systems <russellrose@passfield.co.uk>) |
Responses |
Re: Converting sql anywhere to postgres
Re: Converting sql anywhere to postgres |
List | pgsql-general |
Hi,
@font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4;}p.MsoNormal, li.MsoNormal, div.MsoNormal {margin:0cm; font-size:11.0pt; font-family:"Calibri",sans-serif; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}span.EmailStyle17 {mso-style-type:personal-compose; font-family:"Calibri",sans-serif; color:windowtext;}.MsoChpDefault {mso-style-type:export-only; font-family:"Calibri",sans-serif; mso-ligatures:standardcontextual; mso-fareast-language:EN-US;}div.WordSection1 {page:WordSection1;} Hi there
I am trying to convert a SQL Anywhere database to postgres. Within SQL anywhere a field can have a default value of ‘last user’. This means that when you perform an update on a table, if the field is not explicitly set then the current user is used. So for instance if I have a field called mod_user in a table, but when I do an update on the table and do not set mod_user then SQL Anywhere sets the field to current_uer. I have tried to replicate this using a postgres trigger in the before update. However, if I do not set the value then it automatically picks up the value that was already in the field. Is there a way to tell the difference between me setting the value to the same as the previous value and postgres automatically picking it up.
If the field myfield contains the word ‘me’. Can I tell the difference between:
Update table1 set field1=’something’,myfield=’me’
And
Update table1 set field1=’something’
maybe this is what you're looking for (without a trigger)
CREATE TABLE mytest.autovalues
(
key serial NOT NULL,
product text,
updated_by text DEFAULT current_user,
updated_at timestamp without time zone DEFAULT current_timestamp,
PRIMARY KEY (key)
)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS mytest.autovalues
OWNER to postgres;
-- instead of current_user you may also use session_user see https://www.postgresql.org/docs/current/functions-info.html
then try:
insert into mytest.autovalues (product) values ('apple') ;
insert into mytest.autovalues (product,updated_by) values ('apple','justanotheruser') ;
insert into mytest.autovalues (product,updated_by) values ('peach','justanotheruser') ;
select * from mytest.autovalues;
update mytest.autovalues set product='pear', updated_by=DEFAULT where key=2;
select * from mytest.autovalues;
In case you want to "automate" the update command (not setting
updated_by and if they are different you could set new.updated_by to DEFAULT (or whatever logic fits your needs)updated_by to DEFAULT manually/programmatically)
you may use an on update trigger that compares current_user/session_user with old.
kind regards
Georg
pgsql-general by date: