【问题标题】:Inserting Data from .txt file into SQL DB getting Error Saying no permissions OpenRowSet()将 .txt 文件中的数据插入 SQL DB 时出现错误说没有权限 OpenRowSet()
【发布时间】:2018-05-17 16:29:44
【问题描述】:

我遇到了一个我无法克服的问题,必须有一个简单的解释。我将不胜感激。

我们有一个 DB 服务器 (DB01) 和一个 Web 服务器 (Web02)。在 Web02 上,我们有一个 VBScript 页面,该页面查看 Web02 上所有代理文件夹的内部,并找到从第 3 方发送以供使用的新 .txt 文件。我们正在使用存储过程来完成将逗号分隔文件中的数据插入到 DB01 上的数据库中。有一段时间,这工作得很好,但现在我们遇到了一些问题。我们不确定权限是否已更改或发生了什么,但我们知道文本文件正在被读取,并且当我将插入命令复制到本地 SSMS 并执行它时,它会毫无问题地插入,所以命令也很好。 DB01 在运行插入时似乎存在问题,就好像它无法读取文件一样。这是我们收到的错误:

Microsoft SQL Server Native Client 11.0 error '80040e14'

Cannot process the object "SELECT * FROM [Edit Error Management Report_3008963.txt]". The OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" indicates that either the object has no columns or the current user does not have permissions on that object.

/billing/EditErrors_ProcFiles.asp, line 319

这是我们可以在本地使用的插入命令,它可以工作:

INSERT INTO RealMedEditErrors (AgencyID, BatchName, DateofService, ErrorDesc, ErrorNumber, MajorCategory, MinorCategory, PatientControlNumber, PatientName, PayerName, RealMedClaimID, RenderingProvider, StatusInEE, SubmissionDate, TotalCharges, ClaimInstanceID) 
SELECT 200, [Batch Name], [Date of Service], [Error Description], [Error Number], [Major Category], [Minor Category], [Patient Control #], [Patient Name], [Payer Name], [Availity Claim ID], [Rendering Provider Name], [Status in EE Mgmt], [Submission Date], [Total Charges], [Claim Instance ID] 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text; Database=\\INTEG2-WEB02\EDIGateways\DEV\Availity\AgencyName\Reports\Queue\;HDR=Yes;','SELECT * FROM [Edit Error Management Report_3008963.txt]') 
WHERE NOT ([Batch Name] IS NULL)

这是存储过程:

USE [checkpoint_dev]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[usp_InsertEditError] 
     @AgencyID Int,
     @FileName varchar(150),
     @UnityDir varchar(150)


AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    BEGIN

INSERT INTO AppLog (Msg, FileName, Comments) VALUES (@AgencyID, @FileName, @UnityDir);

Declare @sql nvarchar(max)

Set @sql='INSERT INTO RealMedEditErrors (AgencyID, BatchName, DateofService, ErrorDesc, ErrorNumber, MajorCategory, MinorCategory, PatientControlNumber, PatientName, PayerName, RealMedClaimID, RenderingProvider, StatusInEE, SubmissionDate, TotalCharges, ClaimInstanceID)';

SET @sql = @sql + ' SELECT '+CAST(@AgencyID AS NVARCHAR(10))+', [Batch Name], [Date of Service], [Error Description], [Error Number],  [Major Category], [Minor Category], [Patient Control #], [Patient Name], [Payer Name], [Availity Claim ID], [Rendering Provider Name], [Status in EE Mgmt], [Submission Date], [Total Charges], [Claim Instance ID]';

SET @sql = @sql + ' FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'',
''Text;Database=\\INTEG2-WEB02\EDIGateways\Dev\Availity\'+@UnityDir+'\REPORTS\Queues\;HDR=Yes;'',
''SELECT * FROM ['+@FileName+']'')';

 Exec(@sql)

    END
END

GO

这里是触发存储过程的触发器,该存储过程位于处理 .txt 文件的 VBScript 页面中:

以下是包含 .txt 文件的 Web02 文件夹的安全设置图片:

为所有子文件夹设置相同的安全性,这是文件被 ftp'​​d 所在的位置。

在这方面的任何帮助都会很棒...... 它可能与 openrowset 有关,可能是一些疯狂的被忽略的权限,但我们被卡住了。

感谢您的帮助!

【问题讨论】:

    标签: sql sql-server vbscript permissions asp-classic


    【解决方案1】:

    考虑示例here 以确保您的语法正确。

    我最近遇到了类似的问题。我通过将文件位置更改为计算机上的公用文件夹来解决此问题。

    即:C:\Users\Public\Your_Path,并在 OPENROWSET() 调用中使用该路径。

    Public 文件夹应该可供所有用户使用。

    如果您仍然收到权限错误,则您的问题可能与您的语法或文件有关。

    【讨论】:

    • 我将尝试将它放入公用文件夹中作为测试,看看它会做什么。我会尽快报告。谢谢!编辑:就语法而言,这在昨天有效,但是权限已经改变(或者至少我们认为),这就是为什么我几乎可以肯定它与代码无关。我可能大错特错,但这就是我的推论引导我的地方。
    • 好吧,所以我刚刚注意到一些非常奇怪的事情......路径如下“INTEG2-WEB02\EDIGateways\Dev\Availity\'+@UnityDir+'\REPORTS\Queues\ 当我放置 . txt 文件并更改存储过程以具有 INTEG2-WEB02\EDIGateways\Dev\Availity\'+@UnityDir+'\REPORTS\ 并让网页指向 INTEG2-WEB02\EDIGateways\Dev\Availity\' +@UnityDir+'\REPORTS\Queues\ 虽然该文件也在该目录中,但它可以正常工作......但如果它只是 inQueues,它将无法工作并且会出现主帖子中的错误。权限是相同的。
    【解决方案2】:

    我在这里可能错了,但在我看来,您从未将 @UnityDir@FileName 设置为任何特定值,因此您的 @sql 变量可能会回来看起来像这样:

    INSERT INTO RealMedEditErrors (AgencyID, BatchName, DateofService, ErrorDesc, ErrorNumber, 
    MajorCategory, MinorCategory, PatientControlNumber, PatientName, PayerName, RealMedClaimID, 
    RenderingProvider, StatusInEE, SubmissionDate, TotalCharges, ClaimInstanceID) 
    FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
    'Text;Database=\\INTEG2-WEB02\EDIGateways\Dev\
    Availity\\REPORTS\Queues\;HDR=Yes;',
    'SELECT * FROM []')
    

    您可能已经对您的内部程序做了一些事情:

    ALTER PROCEDURE [dbo].[usp_InsertEditError] 
         @AgencyID Int,
         @FileName varchar(150),
         @UnityDir varchar(150)
    

    这只会给我们带来更多问题。但是@Guillaume Gillard 所说的是一个很好的起点。

    【讨论】:

    • 请查看我更新的帖子以了解这些值的来源。我忘了添加那部分。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多