我目前在我的表DEF_TEST上有一个名为Writer的触发器,在更新或插入后,它会运行一个写入文本文件的可执行文件。它看起来像这样:
ALTER TRIGGER [dbo].[Writer] ON [dbo].[DEF_TEST]
AFTER INSERT, UPDATE
AS
BEGIN
BEGIN TRY
DECLARE @cmd as varchar(500)
SET @cmd = 'Path\Write_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可以完全控制整个文件夹。
我错过了一些明显的东西吗?有没有办法看到当#34; Writer"触发?
答案 0 :(得分:0)
我发现了问题!
我终于记录了.exe并且他抛出了一个异常,即"访问路径' C:\ windows \ system32 \ test.txt'被拒绝。" 。这是因为我试图写入"。\ test.txt",并且因为sql server正在从系统32执行.exe而不是从可执行文件所在的文件夹执行.exe尝试在未经授权的路径中编写测试文件(system32)。我刚刚在程序中指定了文本文件的确切路径(C:\ Path ..... \ test.txt),一切正常。 :)