从 SQL 触发器启动时可执行文件无法写入文本文件



我目前在我的表上设置了一个名为 Writer 的触发器DEF_TEST该触发器在更新或插入后运行写入文本文件的可执行文件。它看起来像这样:

ALTER TRIGGER [dbo].[Writer] ON [dbo].[DEF_TEST]
AFTER INSERT, UPDATE
AS 
BEGIN
BEGIN TRY
DECLARE @cmd as varchar(500)
SET @cmd = 'PathWrite_To_File.exe'
EXEC dbo.RunCMD @cmd
--Insert ok if no error are thrown
INSERT INTO DEF_TEST(ErrorLine, ErrorMessage)
VALUES('ok', 'ok')
END TRY
BEGIN CATCH
INSERT INTO DEF_TEST(ErrorLine, ErrorMessage)
VALUES(ERROR_LINE(), ERROR_MESSAGE())
END CATCH
END

Write_To_file.exe本质上是这样的:

Imports System.IO
Module Main
Sub Main()
Try
File.WriteAllText(".test.txt", "test", System.Text.Encoding.UTF8)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
End Module

这段代码有效,因为如果我将"Write_To_File.exe"的代码更改为仅打印到控制台,触发器就可以完美运行。当我尝试通过双击它来运行"Write_To_File.exe"时,它能够在"test.txt"中创建和写入。但是当触发器启动"Write_To_File.exe"并尝试写入"test.txt"时,它什么也不做。任务管理器中没有任务启动,触发器没有引发错误。

奇怪的是,尝试在"test.txt"中编写后的任何代码都不起作用。例如,如果我尝试打印到控制台,它不起作用。

我不认为问题出在文件安全性上,因为SQL Server可以完全控制整个文件夹。

我错过了一些明显的东西吗?有没有办法看看"作家"触发时一步一步会发生什么?

我发现了问题!

我终于记录了.exe,他抛出了一个异常,即"访问路径'C:\windows\system32\test.txt被拒绝"。这是因为我试图写入".\test.txt",并且因为 sql 服务器正在从系统 32 而不是从可执行文件所在的文件夹执行.exe,他试图在未经授权的路径 (system32) 中写入测试文件。我只是在我的程序中指定了文本文件的确切路径(C:\Path.....\test.txt),一切正常。:)

最新更新