就像我的第一个问题中详细介绍的那样,我有一个Postgres 9.1数据库,其中有多个表,这些表具有完全相同的列名,它们仅在列值上有所不同:
tbl_log_a
tbl_log_b
tbl_log_c
...
Run Code Online (Sandbox Code Playgroud)
26 个表(从 a 到 z)。trfn_tbl_log_%letter%每个表都有一个触发器,它调用名为(from ato )的触发器函数z,该函数执行完全相同的操作:
CREATE OR REPLACE FUNCTION trfn_tbl_log_a_timetypespan()
RETURNS trigger AS
$BODY$
DECLARE
v_timetype character varying;
v_timestmp_timetype timestamp without time zone;
v_timetypespan_resume interval;
v_stmtserial real;
v_sumtimetypespan_fnname interval;
BEGIN
IF NEW.timetype = 'lap' THEN
SELECT timetype, timestmp, timetypespan FROM tbl_log_a WHERE fnname = NEW.fnname AND (timetype = 'start' OR timetype = 'resume') ORDER BY stmtserial DESC LIMIT 1 INTO v_timetype, v_timestmp_timetype, v_timetypespan_resume; …Run Code Online (Sandbox Code Playgroud) 我正在搜索为什么 TRUNCATE 被放置在 DDL 而不是 DML 中的主题,我在这里找到了以下答案 Why is truncate DDL?
我这个答案我发现了一个句子如下
“TRUNCATE 不运行 ON DELETE 触发器这一事实也使其与正常的 DML 操作区分开来”
这与MYSQL 参考手册相冲突,其中说
“如果 FOREIGN KEY 约束指定 DELETE CASCADE,则子(引用)表中的行将被删除,并且截断的表将变为空。”
我正处于一种迷茫的状态。请详细说明这个问题。
谢谢
在 PostgreSQL 中的触发器过程上指定CALLED ON NULL INPUT, RETURNS NULL ON NULL INPUTor STRICT( https://www.postgresql.org/docs/current/static/sql-createfunction.html ) 会起到什么作用吗?
由于触发器过程必须声明为不带参数的函数(https://www.postgresql.org/docs/current/static/plpgsql-trigger.html),我怀疑它有任何效果,但我找不到明确的答案关于这一点。
有时为了重构,我使用视图来抽象更改并使用INSTEAD OF触发器来模仿以前的功能。
我过去遇到过错误 414(或 415)
不允许 UPDATE,因为该语句更新参与联接并具有 INSTEAD OF UPDATE 触发器的视图“%.*ls”。
我可以将其重写UPDATE FROM为MERGE语句并且有效。但为什么?
我找到了这些参考资料,但没有一个能回答原因。
https://sqlserverfast.com/blog/hugo/2008/03/lets-deprecate-update-from/
出于性能原因,我们正在对大量数据进行非规范化处理。基本上,通常将 JOIN 超过 10 个表的 Query 替换为没有 JOIN 的 Query,但所有必要的数据都存储/缓存在初始表中。
我是触发器的坚定拥护者,它可以帮助我保持所有数据的更新绝对透明。公司中还有其他决策者反对使用触发器(出于多种原因)并建议改为构建 VIEW,希望 VIEW 已经针对更好的数据检索进行了优化。
在 MySQL 中是这种情况吗?
我有两个 SQL Server 之间的事务复制。出于测试目的,我在订阅者处删除了许多仍然存在于发布者处的记录。
我现在知道,如果有人在发布者处更新或删除了我的订阅者上不存在的一些记录,那么我的复制将会崩溃。
我知道我也可以在分发服务器上过滤数据,但这意味着重新初始化我的订阅者,这意味着通过慢速链接传输近 40GB。
因此,当我测试我订阅的数据库时,我希望限制用户只能在发布者端更新或删除记录。我的源表有一个日期字段,我想根据日期限制更新或删除。
为此使用触发器还是约束更好?
如何尽可能避免记录锁定?
我是 MySQL 的新手,我在创建BEFORE INSERT触发器时遇到了问题。
我收到一个unexpected END错误。
我有一个以verlof_aanvragen列命名的表datum(还有 6 列)。
我想要完成的只是日期介于now()+8和之间now()+365或 CURDATE() + INTERVAL 8 DAY AND CURDATE() + INTERVAL 365 DAY)
可以插入的行。日期超出该间隔的插入应该失败。
我使用的是 MySQL 5.5.24 版。
这是代码:
CREATE TRIGGER chk_dates
BEFORE INSERT ON verlof_aanvragen
FOR EACH ROW
BEGIN
IF (NEW.datum < CURDATE() + INTERVAL 8 DAY OR NEW.datum > CURDATE() + INTERVAL 365 DAY)
THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Any Message'
END IF
END
Run Code Online (Sandbox Code Playgroud) 在我的数据库中,我有两个表:projects和comp_types. 创建新项目时,会触发一个触发器,该触发器会在projects表中的列中插入一个串联值。
一个完全工作的SQL Fiddle。
请运行它,你会看到,它有效。
但是,当我尝试在 SQL Server 中运行它时,我收到以下错误:
子查询返回了 1 个以上的值。当子查询跟随 =、!=、<、<=、>、>= 或当子查询用作表达式时,这是不允许的。
截图:http : //i.stack.imgur.com/38rKV.jpg
SQL Server 中的所有表都是新鲜的,没有数据(就像小提琴一样)。
我究竟做错了什么?
我在 MySQL 数据库中的列的 UPDATE 之后创建了一个触发器。当触发器检测到某个值时,它应该执行一些操作。这就是我目前所拥有的并且工作正常。
CREATE TRIGGER `order_gereed` AFTER UPDATE ON `oc_order`
FOR EACH ROW IF new.order_status_id = "15"
THEN
UPDATE push_voorraad SET actie = '1';
END IF
Run Code Online (Sandbox Code Playgroud)
但是现在我需要在new.order_status_id匹配 15时执行更多 SQL 。我不知道如何在纯 SQL 中执行此操作,但我现在可以在 php 中执行此操作。所以我希望通过发布我的 php 代码,有人可以告诉我如何在 SQL 中做到这一点。
$query = "SELECT
oc_order_product.quantity,
oc_order_option.option_value_id,
product.id
FROM oc_order_product
JOIN oc_order_option
ON oc_order_option.order_id = oc_order_product.order_id
JOIN product
ON product.oc_product_id = oc_order_product.model
WHERE oc_order_product.order_id = '25' AND oc_order_product.store_url = 'http://www.someurl.com/'";
$result = $mysqli->query($query);
while($row = $result->fetch_object()){
$query = "UPDATE product_option_value …Run Code Online (Sandbox Code Playgroud) 我正在尝试使更新视图的触发器起作用。如果我正在做并插入它就可以了!但是当我尝试进行 UPDATE 时,它只是不运行。
CREATE OR REPLACE FUNCTION test_trigger_function()
RETURNS trigger AS
$$
BEGIN
RAISE NOTICE 'hi';
RETURN NEW;
END;
$$ LANGUAGE PLPGSQL;
CREATE TRIGGER test_trigger
INSTEAD OF INSERT OR UPDATE
ON specific_view
FOR EACH ROW
EXECUTE PROCEDURE test_trigger_function();
Run Code Online (Sandbox Code Playgroud)
然后在另一个地方我执行它:
RAISE NOTICE 'before';
UPDATE specific_view SET gender='randomstuff';
RAISE NOTICE 'after';
Run Code Online (Sandbox Code Playgroud)
结果:
psql:test_function.pgsql:134: NOTICE: before
psql:test_function.pgsql:134: NOTICE: after
Run Code Online (Sandbox Code Playgroud)
插入时:
RAISE NOTICE 'before';
INSERT INTO specific_view (gender)
VALUES ('randomstuff');
RAISE NOTICE 'after';
Run Code Online (Sandbox Code Playgroud)
返回:
psql:test_function.pgsql:134: NOTICE: before
psql:test_function.pgsql:134: NOTICE: hi
CONTEXT: SQL statement "INSERT …Run Code Online (Sandbox Code Playgroud) trigger ×10
mysql ×4
postgresql ×3
sql-server ×3
constraint ×1
ddl ×1
dynamic-sql ×1
functions ×1
merge ×1
mysql-5.0 ×1
mysql-5.5 ×1
plpgsql ×1
replication ×1
truncate ×1
view ×1