SSIS:通过 SQL 服务器代理作业访问 Sharepoint UNC
SSIS: Accessing Sharepoint UNC via SQL Server Agent Job
我有一个通过 UNC 路径连接到 Sharepoint 站点的 SSIS 包连接,如下所示:
\[Site URL]\DavWWWRoot\sites\DTS_BURM\DARBenchmarks\FileName.csv
我的包读取文件并将其导入 SQL 数据库。这个过程在 VS 中运行良好。但是,如果我想 运行 来自 SQL 服务器代理的程序包,它会给我提供以下错误:
Import RAW Data:Error: Cannot open the datafile "[Site URL]\DavWWWRoot\sites\DTS_BURM\DARBenchmarks\FileName.csv".
最初这对我来说似乎很明显。 运行 执行 SQL 作业的帐户无权访问 SharePoint。因此,我向 Credentials 文件夹添加了一个服务帐户,然后使用这些凭据为 SQL Server Agent 创建了一个代理。此外,我将该服务帐户作为所有者添加到 SharePoint,因此它具有 read/write 权限。
即便如此,我仍然收到“无法打开数据文件”的错误消息。我不确定我还能做什么,如果有人有建议,我将不胜感激。
正如我在评论中提到的,当部署到服务器时,我们在将 SharePoint UNC 与 SSIS 一起使用时运气不佳或稳定性不佳。我们最终在代理作业步骤中使用 PowerShell 脚本在 SSIS 步骤之前下载本地文件。
由于代理使用的 PowerShell 版本以及安装 SharePoint 模块的需要,这仅适用于 SQL Server 2014 或更高版本。
- 您需要 SQL 服务器或管理它的任何人的管理员权限才能登录,并且 运行 PowerShell 作为管理员。
- 然后运行以下命令对任何提示都使用“是”:
Install-Module SharePointPnPPowerShellOnline
- 如果您收到错误 运行 连接关闭或无法通信的命令,则可能与 PowerShell 中未启用 Tls12 有关。 运行 以下命令启用 Tls12 协议:
[Net.ServicePointManager]::SecurityProtocol =[Net.SecurityProtocolType]::Tls12
- 然后重新运行“Install-ModuleSharePointPnPPowerShellOnline”,现在应该会成功了。
完成后,我们专门为此设置了一个服务帐户,并发现该帐户需要属于您从中下载文件的 SharePoint 网站的“网站所有者”组。
然后使用以下代码添加一个 PowerShell 代理作业步骤,为 SSIS 下载本地文件。更新您的环境。
$SharepointBaseURL = "https://yoursharepoint.com/sites/sitename/" #base URL of your site
$SharepointDocumentFolder = "Shared Documents/path to folder" #path to the folder where the files are located
$LocalShare = "\server\localshare" #where you download local, sql proxy account needs access
$un = "YourAccount@domain.com"
$pw = "Password"
Set-Location "c:\" #we had to have this when running in agent job
try
{
$sp = $pw | ConvertTo-SecureString -AsPlainText -Force
$plainCred = New-Object system.management.automation.pscredential -ArgumentList $un, $sp
Connect-PnPOnline -Url $SharepointBaseURL -Credentials $plainCred -ErrorAction Stop
$SharePointFileList = Get-PnPFolderItem -FolderSiteRelativeUrl $SharepointDocumentFolder -ItemType File #gets a list of all files in the sharepoint directory
foreach ($File in $SharePointFileList)
{
Get-PnPFile -Url $File.ServerRelativeUrl -Path $LocalShare -Filename $File.Name -AsFile -ErrorAction Stop #Add "-Force" parameter if you want to override if the file already exists
}
}
Catch
{
Throw $_.Exception.Message #any errors/exceptions this bubbles it out into job history
}
然后从那里配置 SSIS 以访问本地文件。
我有一个通过 UNC 路径连接到 Sharepoint 站点的 SSIS 包连接,如下所示:
\[Site URL]\DavWWWRoot\sites\DTS_BURM\DARBenchmarks\FileName.csv
我的包读取文件并将其导入 SQL 数据库。这个过程在 VS 中运行良好。但是,如果我想 运行 来自 SQL 服务器代理的程序包,它会给我提供以下错误:
Import RAW Data:Error: Cannot open the datafile "[Site URL]\DavWWWRoot\sites\DTS_BURM\DARBenchmarks\FileName.csv".
最初这对我来说似乎很明显。 运行 执行 SQL 作业的帐户无权访问 SharePoint。因此,我向 Credentials 文件夹添加了一个服务帐户,然后使用这些凭据为 SQL Server Agent 创建了一个代理。此外,我将该服务帐户作为所有者添加到 SharePoint,因此它具有 read/write 权限。
即便如此,我仍然收到“无法打开数据文件”的错误消息。我不确定我还能做什么,如果有人有建议,我将不胜感激。
正如我在评论中提到的,当部署到服务器时,我们在将 SharePoint UNC 与 SSIS 一起使用时运气不佳或稳定性不佳。我们最终在代理作业步骤中使用 PowerShell 脚本在 SSIS 步骤之前下载本地文件。
由于代理使用的 PowerShell 版本以及安装 SharePoint 模块的需要,这仅适用于 SQL Server 2014 或更高版本。
- 您需要 SQL 服务器或管理它的任何人的管理员权限才能登录,并且 运行 PowerShell 作为管理员。
- 然后运行以下命令对任何提示都使用“是”:
Install-Module SharePointPnPPowerShellOnline
- 如果您收到错误 运行 连接关闭或无法通信的命令,则可能与 PowerShell 中未启用 Tls12 有关。 运行 以下命令启用 Tls12 协议:
[Net.ServicePointManager]::SecurityProtocol =[Net.SecurityProtocolType]::Tls12
- 然后重新运行“Install-ModuleSharePointPnPPowerShellOnline”,现在应该会成功了。
完成后,我们专门为此设置了一个服务帐户,并发现该帐户需要属于您从中下载文件的 SharePoint 网站的“网站所有者”组。
然后使用以下代码添加一个 PowerShell 代理作业步骤,为 SSIS 下载本地文件。更新您的环境。
$SharepointBaseURL = "https://yoursharepoint.com/sites/sitename/" #base URL of your site
$SharepointDocumentFolder = "Shared Documents/path to folder" #path to the folder where the files are located
$LocalShare = "\server\localshare" #where you download local, sql proxy account needs access
$un = "YourAccount@domain.com"
$pw = "Password"
Set-Location "c:\" #we had to have this when running in agent job
try
{
$sp = $pw | ConvertTo-SecureString -AsPlainText -Force
$plainCred = New-Object system.management.automation.pscredential -ArgumentList $un, $sp
Connect-PnPOnline -Url $SharepointBaseURL -Credentials $plainCred -ErrorAction Stop
$SharePointFileList = Get-PnPFolderItem -FolderSiteRelativeUrl $SharepointDocumentFolder -ItemType File #gets a list of all files in the sharepoint directory
foreach ($File in $SharePointFileList)
{
Get-PnPFile -Url $File.ServerRelativeUrl -Path $LocalShare -Filename $File.Name -AsFile -ErrorAction Stop #Add "-Force" parameter if you want to override if the file already exists
}
}
Catch
{
Throw $_.Exception.Message #any errors/exceptions this bubbles it out into job history
}
然后从那里配置 SSIS 以访问本地文件。