在最近对默认跟踪输出的分析中注意到 100 个 sort_warning 错误后,我正在尝试获取导致这些警告的查询文本。

SQL Server Profiler 有一个名为 Sort Warnings 的事件,但它没有 TextData 列。
2008 R2 无法使用扩展事件,因为 sort_warning 事件在 2008 R2 的扩展事件中不可用。
我想在我用来存储分析器结果的表上放置一个触发器,以捕获来自 DBCC INPUTBUFFER 的输出。
-- table to store the results of dbcc inputbuffer
CREATE TABLE Trace_Results(EventType NVARCHAR(30), Parameters INT, EventInfo NVARCHAR(255))
CREATE TRIGGER [dbo].[Trace_Trigger]
ON [dbo].Trace_Table
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL VARCHAR(MAX)
SELECT @SQL = 'DBCC INPUTBUFFER(' + CONVERT(VARCHAR(10), ins.SPID) + ')'
FROM inserted ins
--PRINT @SQL
INSERT INTO Trace_Results (EventType, Parameters, EventInfo)
EXEC(@SQL) …Run Code Online (Sandbox Code Playgroud) 尝试向附加到经常使用的表的触发器添加一行
ALTER TRIGGER [dbo].[name_of_trigger] ON [dbo].[name_of_table] AFTER UPDATE
BEGIN
IF ORIGINAL_LOGIN() in ('username') RETURN
....somecode
END
Run Code Online (Sandbox Code Playgroud)
陷入僵局,唯一的解决方案似乎是每隔几秒钟重试一次,到目前为止还没有奏效。除了按 F5 并希望它有效之外,还有其他方法可以让我的 if 条件处于何种状态吗?
谢谢,
克雷格
在新项目的数据库中,我已经开始约定让每个表都有一个最后修改的时间戳列。为了实现这一点,我为每个表编写了一个触发器:
CREATE TRIGGER touch_users
BEFORE UPDATE
ON users
FOR EACH ROW
WHEN (OLD.modification_time IS NOT DISTINCT FROM NEW.modification_time)
EXECUTE PROCEDURE touch_modification_time();
CREATE TRIGGER touch_company
BEFORE UPDATE
ON company
FOR EACH ROW
WHEN (OLD.modification_time IS NOT DISTINCT FROM NEW.modification_time)
EXECUTE PROCEDURE touch_modification_time();
-- etc for each table
Run Code Online (Sandbox Code Playgroud)
这很快就会变得乏味;特别是因为它们完全相同,除了表名。
有没有办法可以减少每个表所需的样板文件?或者甚至可能通过一个默认作用于每个表的触发器完全消除它?
我创建了一个视图和一个 INSTEAD OF 触发器,用于从该视图中插入/更新/删除。现在我尝试向视图中插入一些数据,PostgreSQL 返回以下错误(捷克语翻译:“chyba”=“error”,“Stav SQL”=“SQL state”):
ERROR: cannot insert into view "ukaz_lok"
DETAIL: Views that return columns that are not columns of their base relation are not automatically updatable.
HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.
********** Chyba **********
ERROR: cannot insert into view "ukaz_lok"
Stav SQL: 55000
Run Code Online (Sandbox Code Playgroud)
这发生在其他一些 INSTEAD OF 触发器之前 - 这个错误只持续了一段时间(几个小时?我不记得了)然后 PostgreSQL 找到了触发器。我尝试了各种事情(更改触发器,删除所有触发器和视图并重新创建它们等),但我不确定什么有效,只是有些东西有效。那么究竟如何让 PostgreSQL 识别触发器呢?
我在 Windows XP 32 位上有 PostgreSQL …
我在 2 个不同的服务器(.246 和 .252)中有 2 个数据库。我需要为 252 服务器中的所有存储过程、触发器和函数创建备份,并在 246 服务器中恢复它。两台服务器中的数据库名称都是 transcredit。252台服务器中大约有500SP。谁能帮我?
我试图解析和理解 MySQL 文档所说的何时创建触发器需要 SUPER 权限。他们说:
如果启用了二进制日志,CREATE TRIGGER 可能需要 SUPER 权限[1]
这种暗示在某些情况下它不需要 SUPER 特权。他们指的是 log_bin_trust_function_creators=1 设置,还是还有其他东西?
其次,在[2]中他们说:
... 信任不会创建将导致不安全事件写入二进制日志的存储函数。
这里究竟有什么危险?二进制日志中哪些类型的事件可能是“不安全的”,对谁来说?
[1] https://dev.mysql.com/doc/refman/5.7/en/create-trigger.html
在问这个问题之前,让我先解释一下场景。
我有一个包含一组表的数据库。一个表,比如表 A,包含用户名详细信息,而另一个表,比如表 B,包含用户活动日志。当从表 A 中删除特定用户条目时,我想从表 B 中删除特定用户日志。我可以使用触发器来执行此操作,但要求在某个时间后(例如 5 分钟后)应删除表 B 中的条目),而不是立即。
是否可以将触发器执行延迟 5 分钟?触发器的可能设计是什么。在这种情况下,延迟触发是否会有所帮助。
每当在 CUSTOMER 表中发生 INSERT 时,我需要调用“ StoredProcedure1 ”并且在 CUSTOMER 表中发生 UPDATE,我需要在触发器中调用“ StoredProcedure2 ”。 如何确定是在 SQL Server 2008的触发器中插入还是更新。
有人可以请帮我如何解决?
代码:
CREATE TRIGGER Notifications ON CUSTOMER
FOR INSERT,UPDATE
AS
BEGIN
DECLARE @recordId varchar(20);
set @recordId= new.Id;
//if trigger is insert at the time I call to SP1
EXEC StoredProcedure1 @recordId
//if trigger is Upadeted at the time I call to SP2
EXEC StoredProcedure2 @recordId
END
Run Code Online (Sandbox Code Playgroud) 在触发器主体中,如何NEW通过其字段名称为其分配值?
这就是我想要做的:
some_key = "some_column";
NEW[some_key] = 5;
Run Code Online (Sandbox Code Playgroud) 我是一个数据库/postgres 初学者,所以请耐心等待。
如果我有一张桌子,就像这样。
CREATE TABLE testy (
id INTEGER REFERENCES other_table,
name varchar(128) PRIMARY KEY,
json JSONB NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我在寻找插入或更新,将设置列之前创建一个触发器id,并name与在相同名称字段的值json。
因此,例如,如果testy包含以下内容UPDATE testy SET json = '{"id":2,"name":"jim"}' WHERE id = 1并被调用。
id | name | json
---+------+-----
1 | "jim"| {"id":1,"name":"jim"}
Run Code Online (Sandbox Code Playgroud)
想要的结果是
id | name | json
---+------+-----
2 | "jim"| {"id":2,"name":"jim"}
Run Code Online (Sandbox Code Playgroud)
我希望使其相当通用,因此不需要对列名进行硬编码。如果相应的 json 字段不存在,则将该列设置为 NULL 即可。到目前为止我有
CREATE TABLE testy_index (
id INTEGER PRIMARY KEY
);
INSERT INTO testy_index VALUES …Run Code Online (Sandbox Code Playgroud)