我有一个要求,我必须禁止删除除一个用户之外的所有用户的表记录,即 user1。为此,我使用了如下触发器。
CREATE OR REPLACE FUNCTION prevent_deletion() RETURNS trigger AS $$
declare
cur_user varchar(30);
BEGIN
Select current_user into cur_user;
IF cur_user != 'user1' THEN
RAISE EXCEPTION 'You cannot delete records from this table!';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
触发器阻止删除 user1 以外的用户的表记录,这很好,但它不适用于用户 user1。我的意思是它不会删除 user1 的表记录。
我的代码哪里错了?
提前致谢。
我有一个a包含 3 个触发器的表,每当插入、更新或删除b行时,它们a都会插入、更新或删除相应的行。所有 3 个触发器使用相同的触发功能p。
CREATE OR REPLACE FUNCTION p ()
RETURNS TRIGGER
AS $$
BEGIN
IF (TG_OP = 'INSERT') THEN
-- INSERT INTO b ...
RETURN NEW;
ELSIF (TG_OP = 'UPDATE') THEN
-- UPDATE b ...
RETURN NEW;
ELSIF (TG_OP = 'DELETE') THEN
-- DELETE FROM b ...
RETURN NEW;
ELSE
RETURN NULL;
END IF;
END;
$$ LANGUAGE PLPGSQL;
CREATE TRIGGER i AFTER INSERT ON a FOR EACH ROW EXECUTE PROCEDURE …Run Code Online (Sandbox Code Playgroud) 我正在尝试按照此处的建议创建一个用于存储时间序列数据的垂直分区表。
到目前为止,我的架构如下所示:
CREATE TABLE events
(
topic text,
t timestamp,
value integer,
primary key(topic, t)
);
CREATE TABLE events_2014
(
primary key (topic, t),
check (t between '2014-01-01' and '2015-01-01')
) INHERITS (events);
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试创建一个INSTEAD OF INSERT触发器,以便可以在events表中插入事件,并且该行将最终出现在正确的子表中。但是文档说INSTEAD OF INSERT触发器只能在视图上创建,不能在表(或子表)上创建:
CREATE OR REPLACE FUNCTION insert_events () RETURNS TRIGGER AS $insert_events$ BEGIN
IF new.t between '2014-01-01' and '2015-01-01' THEN
INSERT INTO events_2014 SELECT new.*;
...
END IF
RETURN NULL;
END;
$insert_events$ LANGUAGE PLPGSQL;
CREATE TRIGGER …Run Code Online (Sandbox Code Playgroud) 我有一个桌面应用程序,应该在任何表更改时收到通知。因此,我只找到了两个非常适合我的情况的解决方案:SqlDependency和SQLCLR。(我想知道 .NET 堆栈中是否有更好的)我已经构建了两个结构并使它们工作。我只能比较从 SQL Server 到客户端的 s̲i̲n̲gl̲e̲ 响应的持续时间。
持续时间:从 100 毫秒到 4 秒
持续时间:从 10ms 到 150ms
我希望这个结构能够处理高速率通知*,我已经阅读了一些 SO 和博客文章(例如:here),并且我的同事也警告说,在大量请求时 SqlDependency 可能会出错。在这里,MS 提供了一些我没有得到的东西,这可能是我问题的另一种解决方案。
*:不是所有时间,而是一个季节;在 1-2 个服务器上每秒 50-200 个请求。
基于高通知率和性能,我应该继续使用这两个中的哪一个,还是有其他选择?
我找到了一些 postgresql 触发器教程。有这个示例函数:
CREATE OR REPLACE FUNCTION add_log_trigg_function() RETURNS trigger AS
$BODY$
DECLARE
account_type varchar;
BEGIN
IF (TG_TABLE_NAME = 'account_current') THEN
account_type := 'Current';
RAISE NOTICE 'TRIGER called on %', TG_TABLE_NAME;
ELSIF (TG_TABLE_NAME = 'account_savings') THEN
account_type := 'Savings';
RAISE NOTICE 'TRIGER called on %', TG_TABLE_NAME;
END IF;
RETURN null;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION add_log_trigg_function()
OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)
我知道这会$BODY$启动身体功能。但是为什么要命名呢?这个名字BODY可以或通常用于其他地方吗?除了LANGUAGE,COST和ALTER FUNCTION命令之外,还有哪些命令通常留在外面$BODY$?
我目前正在用 Java 构建一个使用 Cassandra 数据库的应用程序,我想要一个表,当它在另一个 Cassandra 表中过期时接收数据。有没有办法实现可以做到这一点的触发器?
这就是我想要实现的目标:
CREATE FUNCTION f() RETURNS trigger AS $$
BEGIN
SELECT COUNT(*) AS total_num, SUM(width) AS total_width
FROM some_table WHERE foo = NEW.foo;
IF total_num > 0 AND total_width > 100
THEN
RAISE EXCEPTION 'this is bad';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
但它在语法上还不正确。
我读过我首先需要DECLARE变量(在本例中total_num为 和total_width),以便我可以使用它们并使用SELECT INTO,但我见过SELECT仅包含单个变量/语句的示例。如果我有更多怎么办?
我不是 SQL 的高级程序员,也许我的问题很愚蠢,但我还没有在谷歌中找到答案。我们有一些 SQL 结构来实现更改包:
...
BEGIN TRY
BEGIN TRANSACTION;
<User Code Is Here>
...
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
...
END CATCH;
...
Run Code Online (Sandbox Code Playgroud)
如何放置 CREATE TRIGGER 块链而不是<User Code Is Here>没有错误:
-- Table1
CREATE TRIGGER trTable1_Dates ON dbo.Table1
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
...
SET NOCOUNT OFF;
END
GO
...
-- TableN
CREATE TRIGGER trTableN_Dates ON dbo.TableN
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
...
SET NOCOUNT OFF;
END
GO
Run Code Online (Sandbox Code Playgroud)
目的是创建所有触发器或不创建任何触发器,并在失败时在 CATCH 代码块中打印消息。 …
我将在 postgresql 中表的特定列的更新之前/之后创建一个触发器,但我不能这样做。
我可以在更新特定表的特定列后绑定触发器以触发,但我不能对多个列执行此操作。我想知道这可能吗?
我不想在我的触发器函数中使用 IF(UPDATE(column series)) 来解决它
--我试过下面的代码,但它给了我','附近的错误
create trigger save_information after update of table_name on day, month
for each row
execute procedure save_function();
Run Code Online (Sandbox Code Playgroud)
-- 但下面的代码(只提到一列)工作正常:
create trigger save_information after update of table_name on day
for each row
execute procedure save_function();
Run Code Online (Sandbox Code Playgroud)
我不想更改我的 save_function 来解决它或使用 'IF(update(column series)' 语句。请原谅我写得不好。
我很难理解这个错误:
第 3 行错误:PLS-00103:在预期以下情况之一时遇到符号“&”:
) , * & - + / 在 mod 余数 rem 和 or as || 多集
代码是:
CREATE OR REPLACE TRIGGER class_trigger
BEFORE INSERT ON Class FOR EACH ROW
BEGIN
IF (type = 'vl' && mass < 15000) THEN
mass := 15000;
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
我的代码有什么问题?我正在使用 Oracle 的 APEX。谢谢。
database-trigger ×10
postgresql ×6
plpgsql ×3
sql ×3
sql-server ×2
cassandra ×1
java ×1
join ×1
oracle ×1
oracle-apex ×1
partitioning ×1
plsql ×1
signalr ×1
sqlclr ×1
t-sql ×1
transactions ×1
triggers ×1
try-catch ×1
ttl ×1