Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们是否可以将表上的触发器限制为仅基于其调用的函数执行插入?(PostgreSQL)_Sql_Postgresql_Function_Triggers - Fatal编程技术网

我们是否可以将表上的触发器限制为仅基于其调用的函数执行插入?(PostgreSQL)

我们是否可以将表上的触发器限制为仅基于其调用的函数执行插入?(PostgreSQL),sql,postgresql,function,triggers,Sql,Postgresql,Function,Triggers,在PostgreSQL中是否有任何方法可以限制触发器仅基于所调用的函数执行插入操作?比如说,我在fact_活动上创建了一个触发器,但是每当我执行任何插入操作时,触发器都应该执行函数,以便仅对函数中定义的表执行插入操作 --这是执行函数的触发器 CREATE TRIGGER test_insert BEFORE INSERT ON fact_activity FOR EACH ROW EXECUTE PROCEDURE insert_function(); --插入函数

在PostgreSQL中是否有任何方法可以限制触发器仅基于所调用的函数执行插入操作?比如说,我在fact_活动上创建了一个触发器,但是每当我执行任何插入操作时,触发器都应该执行函数,以便仅对函数中定义的表执行插入操作

--这是执行函数的触发器

CREATE TRIGGER test_insert
    BEFORE INSERT ON fact_activity
    FOR EACH ROW
    EXECUTE PROCEDURE insert_function();
--插入函数

CREATE OR REPLACE FUNCTION insert_function()
  RETURNS trigger AS
$BODY$
DECLARE
l_part_date TEXT;
l_table_name TEXT;

BEGIN 
  l_part_date := to_char(TO_date(NEW.activity_date_key ::text,'YYYYMMDD'),'YYYY_MM');
  l_table_name := TG_TABLE_NAME ||'_'|| l_part_date;


EXECUTE 'INSERT INTO ' || l_table_name || ' SELECT $1.*' USING NEW;

RETURN NULL;
END;
$BODY$
  LANGUAGE plpgsql;

Note: activity_date_key is of integer format (20150512). Hence the conversion.
上述脚本将在事实活动和事实活动中插入一条记录。但我只需要插入一条记录,即事实上的活动2015 05

--DDL for the tables:
CREATE TABLE fact_activity
(
  gc_activity_key bigint NOT NULL DEFAULT nextval('fact_gc_activity_key_seq'::regclass),
  user_key bigint,
  user_category_key integer,
  user_geographic_region_key integer,
  activity_date_key integer
 );


CREATE TABLE fact_activity_2015_05 ( )
INHERITS  (fact_activity);

-- DML:
INSERT INTO fact_gc_activity(user_key, user_category_key, user_geographic_region_key,activity_date_key)
VALUES (6, 1, 1,20150515);

提前谢谢

触发器应返回
NULL

CREATE OR REPLACE FUNCTION insert_function()
  RETURNS trigger AS
$BODY$
DECLARE
l_part_date TEXT;
l_table_name TEXT;

BEGIN 
  l_part_date := to_char(TO_date(NEW.activity_date_key ::text,'YYYYMMDD'),'YYYY_MM');
  l_table_name := TG_TABLE_NAME ||'_'|| l_part_date;


EXECUTE 'INSERT INTO ' || l_table_name || ' SELECT $1.*' USING NEW;

RETURN NULL;
END;
$BODY$
  LANGUAGE plpgsql;

您只需返回NULL而不必返回NEW。您能带来基本的
事实活动
事实活动\u 2015\u 05
ddl吗?还有一个要插入的数据示例,因此,您正在调用
insert\u函数
,而不是
partition\u insert\u函数()
!我已经添加了DDL。对于输入错误
insert\u函数
,我深表歉意。