1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| -- Synchronized tables
CREATE TABLE sync_tables (
st_name TEXT PRIMARY KEY
);
-- Manage the sync tag on synchronized tables
CREATE OR REPLACE FUNCTION sync_tag() RETURNS TRIGGER AS $diff_triggers_set$
DECLARE
TAG_NAME CONSTANT TEXT := 'sync_tag';
request TEXT;
tagged BOOLEAN;
BEGIN
IF(TG_OP = 'UPDATE' OR TG_OP = 'DELETE') THEN
-- Check if the sync tag exists
request := 'SELECT EXISTS(SELECT column_name FROM information_schema.columns WHERE table_name = ' ||
quote_literal(OLD.st_name) || ' AND column_name = ' || quote_literal(TAG_NAME) || ');';
EXECUTE request INTO tagged;
-- Drop the sync tag column
IF(tagged = TRUE) THEN
request := 'ALTER TABLE ' || quote_ident(OLD.st_name) || ' DROP ' || quote_ident(TAG_NAME) || ';';
EXECUTE request;
END IF;
END IF;
IF(TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN
-- Check if the sync tag exists
request := 'SELECT EXISTS(SELECT column_name FROM information_schema.columns WHERE table_name = ' ||
quote_literal(NEW.st_name) || ' AND column_name = ' || quote_literal(TAG_NAME) || ');';
EXECUTE request INTO TAGGED;
-- Drop the sync tag column
IF(tagged = TRUE) THEN
request := 'ALTER TABLE ' || quote_ident(NEW.st_name) || ' DROP ' || quote_ident(TAG_NAME) || ';';
EXECUTE request;
END IF;
-- Add the sync tag column
request := 'ALTER TABLE ' || quote_ident(NEW.st_name) || ' ADD ' || quote_ident(TAG_NAME) || ' BOOLEAN;';
EXECUTE request;
-- Update previous rows with the sync tag to FALSE
request := 'UPDATE ' || quote_ident(NEW.st_name) || ' SET ' || quote_ident(TAG_NAME) || ' = FALSE;';
EXECUTE request;
-- Set the sync tag's default value to TRUE
request := 'ALTER TABLE ' || quote_ident(NEW.st_name) || ' ALTER ' || quote_ident(TAG_NAME) || ' SET DEFAULT TRUE';
EXECUTE request;
-- Set the sync tag NOT NULL
request := 'ALTER TABLE ' || quote_ident(NEW.st_name) || ' ALTER ' || quote_ident(TAG_NAME) || ' SET NOT NULL';
EXECUTE request;
END IF;
RETURN NULL;
END;
$diff_triggers_set$ LANGUAGE plpgsql;
-- Trigger on sync tables to manage sync tags
CREATE TRIGGER diff_triggers AFTER INSERT OR UPDATE OR DELETE ON sync_tables FOR EACH ROW EXECUTE PROCEDURE set_sync_tag(); |
Partager