Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >从%current%表中选择的PostgreSQL触发器函数

从%current%表中选择的PostgreSQL触发器函数
EN

Database Administration用户
提问于 2015-08-25 16:47:35
回答 3查看 7.6K关注 0票数 7

我有多个具有相同列名的表,它们仅在列值上有所不同,例如:

代码语言:javascript
代码运行次数:0
复制
tbl_log_a
tbl_log_b
tbl_log_c
...

从a到z的26个表。每个表都有一个触发器,该触发器调用一个触发器函数,该函数执行完全相同的操作:

代码语言:javascript
代码运行次数:0
复制
SELECT columnname FROM tbl_log_a

除此之外,我所有的触发函数都做同样的事情。它们的不同之处在于:

代码语言:javascript
代码运行次数:0
复制
select columnname FROM tbl_log_a
select columnname FROM tbl_log_b
select columnname FROM tbl_log_c
...

因此,我必须创建26个触发器函数,每个tbl_log_%letter%一个。是否有一种方法可以告诉触发器函数:

代码语言:javascript
代码运行次数:0
复制
SELECT columnname FROM %currenttable%

%currenttable%是指放置触发器的表。或者:

代码语言:javascript
代码运行次数:0
复制
SELECT columnname FROM tbl_log_%letter%

在Postgres 9.1中有可能吗?我正在阅读关于动态确定的表。有线索吗?我希望将表名本身存储在一个变量中,而不是存储在该表中的列中,因为触发器函数在该表中的多个列上工作。

代码语言:javascript
代码运行次数:0
复制
TG_TABLE_NAME
TG_TABLE_SCHEMA
EN

回答 3

Database Administration用户

回答已采纳

发布于 2015-08-25 17:50:42

我建议您使用触发器参数,但实际上没有必要。您可以使用自动变量 TG_TABLE_SCHEMATG_TABLE_NAME,也可以使用TG_RELID。这些与动态SQL的EXECUTE一起,允许您做您想做的事情:

代码语言:javascript
代码运行次数:0
复制
BEGIN
    EXECUTE format('SELECT colname FROM %I', TG_RELID)
END;

代码语言:javascript
代码运行次数:0
复制
BEGIN
    EXECUTE format('SELECT colname FROM %I.%I', TG_TABLE_SCHEMA, TG_TABLE_NAME)
END;

(当然,由于SELECT没有数据的目的地,这些数据将无法正常工作。您必须使用EXECUTE format(..) INTO ...将结果存储到DECLAREd变量中)。

代码语言:javascript
代码运行次数:0
复制
DECLARE
    _colvar integer;
BEGIN
    EXECUTE format('SELECT colname FROM %I.%I', TG_TABLE_SCHEMA, TG_TABLE_NAME) INTO _colvar;
    RAISE NOTICE 'colname value was %',_colvar;
END;
票数 10
EN

Database Administration用户

发布于 2015-08-26 06:56:00

在plpgsql中,与虚SELECT columnname FROM %currenttable%对应的实际语法是:

代码语言:javascript
代码运行次数:0
复制
execute format('SELECT columnname FROM %I.%I',
                TG_TABLE_SCHEMA, TG_TABLE_NAME);

TG_*内置变量记录在触发程序中,executeformat plpgsql构造在基本陈述中。

上面的查询本身是荒谬的(它选择不去任何地方的结果);目的只是显示可以构建实际查询的基本语法。

票数 3
EN

Database Administration用户

发布于 2015-08-26 07:20:48

或者您可以使用TG_RELID,但是由于它的数据类型是普通的oid,而不是regclass,所以必须显式地将其转换为regclass,以获得对模式限定的自动转换(仅在当前search_path需要的情况下),并明确转义表名。文件:

TG_RELID数据类型oid;引发触发器调用的表的对象ID。

大胆强调我的。我不知道为什么他们不让它regclass开始.

代码语言:javascript
代码运行次数:0
复制
EXECUTE format('SELECT columnname FROM %s', TG_RELID::regclass);

现在还不清楚你对结果做了什么。通常,您可以在INSERT / UPDATE / DELETE语句或将结果写入变量中使用它:

代码语言:javascript
代码运行次数:0
复制
EXECUTE format('SELECT columnname FROM %s', TG_RELID::regclass)
INTO my_variable;

只分配第一个值。如果SELECT找到更多行,则其余行将被丢弃。您可能需要添加ORDER BY ... LIMIT 1

相关信息:

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/112184

复制
相关文章
聊聊jest的IdleConnectionReaper
jest-common-6.3.1-sources.jar!/io/searchbox/client/config/idle/IdleConnectionReaper.java
code4it
2019/04/22
9790
聊聊jest的IdleConnectionReaper
边缘计算如何实现5G的承诺
前几年在巴塞罗那举行的世界移动通信大会(Mobile World Congress)——世界上首屈一指的移动消费电子产品大会——关注的主题是如何让下一个10亿人上网。在今年的活动上,你每走一分钟都能看到有人在兜售5G的承诺。5G是下一代蜂窝移动通信,有望带来更高的数据速率、更低的延迟和大规模设备连接。
边缘计算
2019/07/03
8680
边缘计算如何实现5G的承诺
聊聊jest的NodeChecker
jest-common-6.3.1-sources.jar!/io/searchbox/client/config/discovery/NodeChecker.java
code4it
2019/04/21
1.1K0
聊聊jest的NodeChecker
聊聊jest的NodeChecker
jest-common-6.3.1-sources.jar!/io/searchbox/client/config/discovery/NodeChecker.java
code4it
2019/05/06
8070
Cloudera对开源的承诺
7 月 10 日,合并后的 Cloudera 宣布了新的开源许可模式,并计划对所有产品的新版本实施许可证变更,不追溯已经发布的版本。在合并之前,这两家公司是在不同的开源许可模式下发布各自的产品,新模式将 Hortonworks 和 Cloudera 之前使用的许可模式进行了整合。
Fayson
2019/07/17
3.7K1
【全面AI,微软刷新】Windows部门被拆,纳德拉宣布上任以来最大重组
精彩回顾 2018 新智元产业跃迁 AI 技术峰会今天隆重启幕,点击链接观看大会盛况: 爱奇艺 http://www.iqiyi.com/l_19rr3aqz3z.html 腾讯新闻 http://v.qq.com/live/p/topic/49737/preview.html 新浪科技 http://video.sina.com.cn/l/p/1722511.html 云栖社区 https://yq.aliyun.com/webinar/play/419 斗鱼直播 https://www.
新智元
2018/04/18
7310
【全面AI,微软刷新】Windows部门被拆,纳德拉宣布上任以来最大重组
jest如何执行单组测试用例
假如有这个文件tests/test.test.ts: describe('test-group', () => { it('t1', async() => { console.log('t1'); }); it('t2', () => { console.log('t2'); }); }); 我只想运行里面的t2,则可以这样: npx jest tests/test.test.ts --testNamePattern="test-group t
黒之染
2022/03/22
6740
【自动化测试】【Jest-Selenium】(01)—— Jest 入门
按照软件工程自底而上的概念,前端测试一般分为单元测试(Unit Testing )、集成测试(Integration Testing)和端到端测试(E2E Testing)。
WEBJ2EE
2020/09/24
1.8K0
Excel如何刷新模型
但老师
2022/03/22
1.1K0
Excel如何刷新模型
昨天承诺的SweetPotato提权
一开始发到了t00ls,结果很多师傅问我用法,录了个小视频,大家可以看下用法,工具在文末,需要的自取。
鸿鹄实验室
2021/04/15
2.4K0
学习笔记——在vue中如何配置Jest(一)
  最近在搞Jest单元测试,如何在vue中安装和使用jest我就不说了,前一篇文章简单的说了一下在使用jest时遇到的一些问题,但是我觉得并没有真正的解决的很好。后面会在学习过程中更新前面的那篇文章,加入后续遇到的问题以及解决问题的方法,持续的做一个记录。
全栈程序员站长
2022/07/21
2K0
学习笔记——在vue中如何配置Jest(一)
学习笔记——在vue中如何配置Jest(一)
  最近在搞Jest单元测试,如何在vue中安装和使用jest我就不说了,前一篇文章简单的说了一下在使用jest时遇到的一些问题,但是我觉得并没有真正的解决的很好。后面会在学习过程中更新前面的那篇文章,加入后续遇到的问题以及解决问题的方法,持续的做一个记录。
zaking
2019/04/09
1.8K0
学习笔记——在vue中如何配置Jest(一)
Linkerd对开放治理的承诺
考虑到谷歌最近宣布它不会向中立基金会捐赠KNative或Istio,现在似乎是描述Linkerd对开放治理主题的方法的合适时机。
CNCF
2019/12/04
6580
【自动化测试】【Jest-Selenium】(03)—— Jest 异步测试
在JavaScript中执行异步代码是很常见的。当你有以异步方式运行的代码时,Jest 需要知道当前它测试的代码是否已完成,然后它可以转移到另一个测试。
WEBJ2EE
2020/10/09
1.4K0
【自动化测试】【Jest-Selenium】(03)—— Jest 异步测试
如何刷新cdn缓存 cdn缓存的任务
众所周知,网络技术对于一个国家拥有着非常重大的作用,现如今我国投入了大量的科研经费在网络技术的发展中,其主要目的就是为了利用网络技术来造福百姓。目前大家熟知的cdn就是在普通网络技术之上编辑形成的一个新的虚拟网络,利用这个虚拟网络传输数据就会更加的轻松简单。但是大家在生活中同样也要学会如何刷新cdn缓存。
用户8715145
2021/09/18
13.4K0
如何刷新cdn缓存 cdn缓存的任务
聊聊springboot jest autoconfigure
spring-boot-autoconfigure-2.1.4.RELEASE-sources.jar!/org/springframework/boot/autoconfigure/elasticsearch/jest/JestProperties.java
code4it
2019/04/20
1.2K0
聊聊springboot jest autoconfigure
Volatile 可见性承诺
Java Volatile 关键字是一种轻量级的数据一致性保障机制,之所以说是轻量级的是因为 volatile 不具备原子性,它对数据一致性的保障体现在对修改过的数据进行读取的场景下(也就是数据的可见性)。比起对读操作使用互斥锁, volatile 是一种很高效的方式。因为 volatile 不会涉及到线程的上下文切换,以及操作系统对线程执行的调度运算。同时 volidate 关键字的另一个功能是解决“指令重排序问题”。
不会飞的小鸟
2020/03/17
6930
【自动化测试】【Jest-Selenium】(02)—— Jest 匹配器
Use .toBe to compare primitive values or to check referential identity of object instances. It calls Object.is to compare values, which is even better for testing than === strict equality operator.
WEBJ2EE
2020/10/09
8260
如何手动刷新cdn缓存 为何要手动刷新cdn缓存
cdn是一个新型的模拟内容分发网络,虽然cdn和大家在生活中使用的网络有一切的区别,但是cdn出现确实能够使网速得到大大的提高。然而,大家在使用cdn的时候会需要注意很多问题,其中最主要的就是要学会如何手动刷新cdn缓存。一旦长时间不刷新cdn缓存会给cdn使用带来一些困难,最终同样也会影响网络数据的传输。
用户8715145
2021/09/18
11.7K1
如何手动刷新cdn缓存 为何要手动刷新cdn缓存
点击加载更多

相似问题

如何嘲笑jest承诺

117

如何用Jest模拟拒绝承诺

110

Jest中的测试承诺

22

Jest:测试嵌套承诺

11

带有超时Jest的测试承诺

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档