我有一个使用sqlcmd在某个文件夹中写入文件的查询。
EXEC master..xp_cmdshell'sqlcmd -q "set nocount on; use [myDB] SELECT top 1 T.Field1, T.Fieldn FROM [dbo].[myTable] AS T" -oc:\Outputfolder\FileName.csv -E -m 1 -h2 -s","'
EXEC Master指令在触发器内部自行工作正常,它会生成一个循环:文件已创建,但sql卡在“执行查询”中
触发器的结构是:
ALTER TRIGGER CreateCsvFile_Trigger ON [dbo].[TempProjectCsv] AFTER INSERT
AS
<Variables>
BEGIN
SET NOCOUNT ON;
EXEC master..xp_cmdshell'sqlcmd -q "set nocount on; use [myDB] SELECT top 1 T.Field1, T.Fieldn FROM [dbo].[myTable] AS T" -oc:\Outputfolder\FileName.csv -E -m 1 -h2 -s","'
END
GO
任何人都可以告诉我它为什么单独工作但它会从触发器中断开? 一如既往,谢谢!
答案 0 :(得分:1)
执行触发器时,它会在执行插入操作的人员的安全上下文中执行。
默认情况下,DML和DDL触发器都在调用触发器的用户的上下文中执行。触发器的调用者是执行导致触发器运行的语句的用户。 (MSDN)
因此,当您测试命令shell时,您可能是一名DBA,他有权执行各种操作,运行插件的用户(有权在表上插入)没有权限混淆文件系统来自SQL Server。您知道该文件将写在服务器上吗?