Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用存储过程时,审核表更新触发器不起作用_Sql_Sql Server - Fatal编程技术网

Sql 使用存储过程时,审核表更新触发器不起作用

Sql 使用存储过程时,审核表更新触发器不起作用,sql,sql-server,Sql,Sql Server,我有表tblA 其中定义了一个触发器,如果更新了任何行,它会将更改写入审核表 现在,如果在SQL Server上我右键单击并直接编辑一行,我会看到更改转到审核表 如果调用存储过程进行更新,我确实会看到tblA已更新,但更改的值不会进入审核表。看起来扳机根本没有被触发 直接编辑一个表和通过正在触发的触发器的存储过程更新有什么区别 不触发触发器的存储过程示例: 好吧,我快疯了,但如果我直接在DB中运行这个非常简单的存储过程,tirgger就会被解雇。但若我从我的C#web运行,存储过程将在tblS

我有表
tblA

其中定义了一个触发器,如果更新了任何行,它会将更改写入审核表

现在,如果在SQL Server上我右键单击并直接编辑一行,我会看到更改转到审核表

如果调用存储过程进行更新,我确实会看到
tblA
已更新,但更改的值不会进入审核表。看起来扳机根本没有被触发

直接编辑一个表和通过正在触发的触发器的存储过程更新有什么区别


不触发触发器的存储过程示例:

好吧,我快疯了,但如果我直接在DB中运行这个非常简单的存储过程,tirgger就会被解雇。但若我从我的C#web运行,存储过程将在tblSurvey更新后运行,但触发器不会被触发

ALTER PROCEDURE [dbo].[spUpdateSurveyDataTest]


AS
BEGIN

Update tblSurvey

Set 
[s1FirstName]='YES TRIGGER WORKS  for sureYES'
Where Survey_Id=327


END

触发器仅在更新和删除时触发,这就是为什么在编辑表时触发。存储过程正在执行触发器未检测到的插入。你的触发因素应该是插入、更新、删除。问题的关键是我在问题中提到的:

触发器无法从应用程序运行,但我可以直接从数据库更新启动它

问题是应用程序正在使用自己的通用用户连接到DB,该用户没有触发器的执行权限

为了使事情更加复杂,在应用程序级别也没有例外

解决办法是增加

WITH EXECUTE AS OWNER 

到触发器。

请发布触发器代码并尝试sp代码???@Ajmot。在问题中,你应该认真地重新考虑你设计这个的整个方式。游标、字段查找、逻辑问题。。。如果一个值从NULL变为“---”,该怎么办?反之亦然?如果您曾经不得不从大规模更新中恢复大量更改,那么您将如何使用此审计结构进行恢复?在您的过程中,您将插入“auSurvey”,但您的触发器位于“tblSurvey”上,因此不会触发它。如果这是一个打字错误,请在你的问题中更正它,因为它混淆了问题。这应该是基于而不是一行一行地设置。这场比赛的表现将非常糟糕。游标对于性能来说是可怕的,您将它们嵌套在触发器中。这就像在行李中隐藏一颗滴答作响的定时炸弹。SP执行更新“不插入更新tblSurvey Set[s1FirstName]=“是触发器适用于sureYES”,其中Survey_Id=327`
ALTER PROCEDURE [dbo].[spUpdateSurveyDataTest]


AS
BEGIN

Update tblSurvey

Set 
[s1FirstName]='YES TRIGGER WORKS  for sureYES'
Where Survey_Id=327


END
WITH EXECUTE AS OWNER