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

时间:2017-05-09 16:13:58

标签: sql vb.net text-files

我目前在我的表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"触发?

1 个答案:

答案 0 :(得分:0)

我发现了问题!

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