我的postgresql数据库中有54个表。并且大多数表包括创建数据的日期。我想为包含 CreatedDate 列的所有表创建一个全局触发器。当插入记录时,此触发器将更新列。
答案 0 :(得分:5)
每个表都需要自己的触发器,但您可以使用单个触发器函数:
CREATE TRIGGER set_createddate
BEFORE INSERT ON <table name>
FOR EACH ROW EXECUTE PROCEDURE set_created_date();
对于每个表,你应该有一个这样的触发器:
DO $$
DECLARE
t record;
BEGIN
FOR t IN
SELECT * FROM information_schema.columns
WHERE column_name = 'createddate'
LOOP
EXECUTE format('CREATE TRIGGER set_createddate
BEFORE INSERT ON %I.%I
FOR EACH ROW EXECUTE PROCEDURE set_created_date()',
t.schema_name, t.table_name);
END LOOP;
END;
$$ LANGUAGE plpgsql;
您可以使用此代码设置所有54个表的触发器(首先创建触发器功能):
createddate
这显然假设没有其他表具有名为information_schema.columns
的列。您可以通过查询def findValue(value):
try:
myfile = open(file, "r")
try:
for line in myfile:
if value in line:
line = do_something
return line
finally:
myfile.close()
except IOError:
print "File does not exist!"
sys.exit()
except None as e:
print "Value not found in file"
sys.exit()
表格轻松查看。
答案 1 :(得分:0)
对于那些与帕特里克解决方案有些问题的人。 这里的代码相同但有一些改进:
DO $$
DECLARE
t text;
BEGIN
FOR t IN
SELECT table_name FROM information_schema.columns
WHERE column_name = 'createddate'
LOOP
EXECUTE format('CREATE TRIGGER set_createddate
BEFORE INSERT ON %I
FOR EACH ROW EXECUTE PROCEDURE set_created_date()',
t);
END LOOP;
END;
$$ LANGUAGE plpgsql;