我必须在db字段上创建一个特定状态的进程调用.我听说你可以使用数据库触发器执行cURL调用,但谷歌不太友好地返回我可以使用的任何东西.
所以我想我的问题分为三个部分:
工作流程:
db字段用状态更新,需要启动脚本/请求/进程,运行我的工作流程中的下一步(这是一个PHP脚本),它将拉入记录在数据库中并处理另一步,然后更新数据库结果.
我需要使用SQL Server数据库表中的insert事件中的单个参数调用restful Web服务.我知道这不是理想的设计,但我无法控制任何一个终点.在最大负载下,此功能的使用不会超过100个事件/分钟.
我对其他想法持开放态度,但我想出的两个选择是;
我一直在研究选项2并在Visual Studio中创建了一个SQL CLR触发器项目但是在我添加System.Web对项目的引用之后将不会构建并且没有构建错误,而只是在输出窗口中说"构建失败".
是否可以在CLR触发器中使用哪些CLR库?
使用服务代理让我感到害怕,因为我只与服务代理一起处理过一个项目,发现很难实现.
关于如何从触发事件调用Web服务的任何想法将不胜感激.
大卫
我需要在触发器中基于以下条件在BEGIN语句之后创建一个CURSOR:
IF :OLD.DWF_STATUS = 'P' AND :NEW.DWF_STATUS = 'C' THEN
DECLARE CURSOR cur_list IS
SELECT DISTINCT DR_PRJ_ID, STR_EMAIL, DWFU_US_ID
FROM DOC_WORKFLOW JOIN DOC_WF_USERS ON DWFU_DWF_ID = DWF_ID
JOIN DOCUMENT_REF ON DWF_DR_ID = DR_ID AND DR_TYPE = 'P'
LEFT OUTER JOIN ST_REGISTER ON STR_ID = DWFU_STR_ID
WHERE DWF_ID = :NEW.DWF_ID;
END IF;
Run Code Online (Sandbox Code Playgroud)
当我编译时,我收到此错误:
错误(99,5):PLS-00103:遇到以下其中一项时遇到符号"END":
begin function pragma procedure子类型
当前游标删除存在之前
如何在Oracle中触发BEGIN语句后声明游标?
我的postgresql数据库中有54个表.并且大多数表包括创建数据的日期.我想为包含CreatedDate列的所有表创建一个全局触发器.插入记录时,此触发器将更新列.
我正在尝试通过pgadmin创建一个触发器,以便有一个计算列.
我需要这样做:c = a/b
我创建了一个函数UpdateC,它包含以下代码:
UPDATE table_name
SET c = a / b
WHERE id = @id
Run Code Online (Sandbox Code Playgroud)
我将@id声明为参数.
然后我想我会创建一个触发器并将它链接到该函数,但我发现我需要将它链接到触发器函数而不是函数.
现在我正在尝试使用与上面完全相同的SQL创建触发器函数,但是我收到了下一个错误:
"UPDATE"或其附近的语法错误
在定义选项卡下我必须选择一种语言,所以我选择了"plpgsql"(其他选项是"c"和"internal").
任何帮助将深表感谢!
这是实际情况的简化;在哪里可以看到表B上缺少的记录。
假设有两个数据库表A;B.
表A上有一个on insert触发器;它可以对表B进行插入(但它没有COMMIT;)。如果我们通过JDBC连接器打开数据库连接;并在表A上插入;并提交;触发器的行为是什么?是否将它自动提交到表B上的插入语句?
我有Range带列的表
Start (date), RangeTypeId (integer), ChannelId (integer), IsActive (bit)
Run Code Online (Sandbox Code Playgroud)
我有这个索引:
CREATE UNIQUE NONCLUSTERED INDEX [IX_Range_Unique]
ON [dbo].[Range] ([Start] ASC, [RangeTypeId] ASC, [ChannelId] ASC, [IsActive] ASC)
Run Code Online (Sandbox Code Playgroud)
我希望我的索引仅在 2 行带有IsActive = 1. 所以,我想指数或某种触发,将允许有多个的Ranges与IsActive = 0和相同的开始日期,频道标识和类型,但只有一个IsActive = 1和相同的开始日期,频道标识和类型。
有效的数据库表状态示例:
Start | RangeTypeId | ChannelId | IsActive
------------------------------------------
23:00 5 1 0
23:00 5 1 0
23:00 5 1 0
23:00 5 1 1
Run Code Online (Sandbox Code Playgroud)
无效的:
Start | RangeTypeId | ChannelId | IsActive
------------------------------------------
23:00 …Run Code Online (Sandbox Code Playgroud) 我有以下触发器:
ALTER TRIGGER [Staging].[tr_UriData_ForInsert]
ON [Staging].[UriData]
FOR INSERT
AS
BEGIN
DECLARE @_Serial NVARCHAR(50)
DECLARE @_Count AS INT
IF @@ROWCOUNT = 0
RETURN
SET NOCOUNT ON;
IF EXISTS(SELECT * FROM inserted)
BEGIN
SELECT @_Count = COUNT(Id) FROM inserted
SELECT @_Serial = SerialNumber FROM inserted
INSERT INTO [Staging].[DataLog]
VALUES (CURRENT_TIMESTAMP, @_Serial + ': Data Insert --> Rows inserted: ' + @_Count, 'New data has been received')
END
END
Run Code Online (Sandbox Code Playgroud)
该表一次接收多行.我希望能够在日志表中添加一行告诉我插入已经发生.
插入一行时效果很好,但是有多行,触发器不会触发.我在这里阅读了其他项目,很明显你不应该使用ROW_NUMBER().
总结:我想在另一个名为UriData的表中发生多行插入时更新我的日志表.
使用以下内容从C#插入数据:
using (var sqlBulk = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, transaction)) …Run Code Online (Sandbox Code Playgroud) 更新我的表时出现此错误
UPDATE "Username"."EMPPROJECT"
SET ENDDATE = TO_DATE('2016-09-11 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
WHERE ROWID = 'AAF+8XAAEAAGBIGAAB'
AND ORA_ROWSCN = '537035617'
Run Code Online (Sandbox Code Playgroud)
保存对表"Username"的更改时出错."EMPPROJECT":第8行:
ORA-04091:表Username.EMPPROJECT正在变异,触发器/函数可能看不到它ORA-06512:在"Username.CHECKOVERLAPDATEUPDATE",第4行
ORA-04088 :执行触发器'Username.CHECKOVERLAPDATEUPDATE'时出错
触发器的定义如下:
create or replace trigger checkOverlapDateUpdate
before Update on EmpProject
for each row
declare
countOfOverlap integer;
begin
select count(*)
into countOfOverlap
from EmpProject EP
where isOverlapping(:new.startDate, :new.endDate, startDate, endDate) = 1
and EP.EmpID = :new.EmpId;
if countOfOverlap > 0
then
RAISE_APPLICATION_ERROR(-00000, 'Overlapping Insertion Dates');
rollback;
end if;
end;
Run Code Online (Sandbox Code Playgroud) 我正在寻找对公司表之一中非常特定的记录子集进行更改的方法。我意识到更新触发器可以完成此任务,但是一天要调用数千次。
虽然我相当精通SQL,但是T-SQL和触发器在我的常规操场之外有点。我不想写一些会持续运行且几乎无法完成的事情(或使我们的DBA烦恼)。
似乎解决方案将是仅拉出我感兴趣的行,然后基于此写触发器的视图。看来这是“不良形式”,它告诉我有一种更好的方法来完成同一件事。
我正在寻找使用触发器的原因,因为我正在寻找可能会很快重置的值更改。(例如,它将更改为1,然后在几个小时后更改回0)。
此触发器将在SQL SERVER EXPRESS 10.50.4000上运行
我主要只是需要一个方向-不需要太多特定的代码。
database-trigger ×10
sql-server ×4
oracle ×3
postgresql ×3
sql ×3
database ×2
plsql ×2
triggers ×2
c# ×1
indexing ×1
pgadmin ×1
php ×1
rest ×1
sql-update ×1
t-sql ×1