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 或更高版本。

  1. 您需要 SQL 服务器或管理它的任何人的管理员权限才能登录,并且 运行 PowerShell 作为管理员。

  1. 然后运行以下命令对任何提示都使用“是”:

Install-Module SharePointPnPPowerShellOnline

  1. 如果您收到错误 运行 连接关闭或无法通信的命令,则可能与 PowerShell 中未启用 Tls12 有关。 运行 以下命令启用 Tls12 协议:

[Net.ServicePointManager]::SecurityProtocol =[Net.SecurityProtocolType]::Tls12

  1. 然后重新运行“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 以访问本地文件。