Sql Server 触发器和 PHP
Posted
技术标签:
【中文标题】Sql Server 触发器和 PHP【英文标题】:Sql Server Trigger and PHP 【发布时间】:2018-06-20 18:51:09 【问题描述】:我在 al Sql Server 中有以下触发器
AFTER INSERT AS
BEGIN
DECLARE @exe nvarchar(255);
DECLARE @exe2 nvarchar(255);
DECLARE @idEmpl nvarchar(255);
DECLARE @fecha nvarchar(255);
DECLARE @entSal nvarchar(255);
SELECT @idEmpl = Id_de_People, @fecha = CONVERT(varchar,cast(60*60*24*(cast(Fecha as float)-25567) as int)-3600-7200), @entSal = EntSal FROM inserted;
SET @exe = 'C:\Program Files\php\v7.2\php.exe -f "C:\inetpub\wwwroot\marcaje_to_attendance.php" idEmpl=' + @idEmpl +' fecha='+ @fecha +' entSal='+ @entSal +'';
EXEC xp_cmdshell @exe;
SET @exe2 = '"C:\Program Files\PHP\v7.2\php.exe" -f C:\inetpub\wwwroot\attendance_bulk_2.php idEmpl=' + @idEmpl +' fecha='+ @fecha +' entSal='+ @entSal +'';
EXEC xp_cmdshell @exe2;
INSERT INTO log_trigger (log_fecha, log_id_empleado, momento_entrada, ent_o_sal) VALUES (@fecha, @idEmpl, GETDATE(), @entSal) ;
此代码调用任何插入(数据库每秒接收几个插入)到一个 php 文件,该文件接收该值以与其他系统连接。
我的问题是我的 php 没有收到任何调用,因为我为它们的任何调用写了一个日志。
我不知道如何查看触发器的 SQL Server 日志,也不知道触发器代码中是否有任何错误。
我将插入插入到其他表中,以了解触发器是否有效并且没关系,因为我看到了每一行的插入。
你能帮帮我吗?
谢谢
【问题讨论】:
我在您的触发代码中看到的唯一问题是,如果它被多行插入触发,它只会处理其中一行。您的log_trigger
表中没有写任何内容吗?如果触发器引发错误,则触发它的插入应该回滚,因此您不会将插入插入到触发器所在的表中。有这种情况吗?
如何处理多行插入?感谢您的回答。当我收到批量或多行插入时,我放入 log_trigger 中的插入具有所有记录。但在我的 php 文件中,我没有收到任何内容。我看不到对我的 php 的任何调用
通常,您可以通过加入inserted
表而不是从中选择来填充变量来处理多行插入。尽管在您的情况下,要对inserted
中的每一行执行一次 xp_cmdshell 调用,您需要使用游标。
我建议首先不要在触发器中执行所有这些逻辑。而是使用您的触发器将值插入临时表。然后创建一个 sql 作业来完成这里的其余工作,并根据需要定期安排它。您不想让触发器等待网页加载。
感谢 Sean 的回答。插入只是为了验证触发器是否有效,因为当我尝试在 php 中查看日志记录时,我什么也没看到,因为我认为 php 调用可能是错误的
【参考方案1】:
你说插入到log_trigger
是有效的,但是对 php.exe 的调用似乎没有发生。
在这种情况下,问题可能出在您的 php 文件内部,或者可能是您指定的位置不存在 php.exe 的结果。您在 SQL Server 的那个位置安装了 php.exe?
【讨论】:
你好,是的,php.exe在那个位置,sql有权限访问。等于php文件。位置正确并授予它的权限以上是关于Sql Server 触发器和 PHP的主要内容,如果未能解决你的问题,请参考以下文章