Вставка данных из файла .txt в базу данных SQL с ошибкой. Сказать, что нет разрешений. OpenRowSet () - PullRequest
0 голосов
/ 17 мая 2018

Я застрял с проблемой, которую мне не удалось решить, и должно быть простое объяснение.Я был бы очень признателен за любую помощь.

У нас есть сервер БД (DB01) и веб-сервер (Web02).На Web02 у нас есть страница VBScript, которая просматривает все папки Агентства на Web02 и находит новые файлы .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

Вот триггер, который запускает хранимую процедуру, расположенную на странице VBScript, которая обрабатывает файл .txt:

enter image description here

Здесьявляются изображениями настроек безопасности для наших папок Web02 с файлами .txt:

enter image description here

Такая же защита установлена ​​для всех дочерних папок, в которыхфайлы ftp'd.

Любая помощь по этому вопросу была бы замечательной ... Это может иметь какое-то отношение к openrowset, это могли быть некоторые безумные пропущенные разрешения, но мы застряли.

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Я могу ошибаться здесь, но мне не кажется, что вы когда-либо устанавливали @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)

Это только вызывает у нас больше вопросов.Но то, что сказал Гийом Гиллар, - хорошее начало.

0 голосов
/ 17 мая 2018

Рассмотрим примеры здесь , чтобы убедиться, что ваш синтаксис правильный.

У меня недавно была похожая проблема. Я исправил это, изменив расположение моих файлов в общей папке на моем компьютере.

т.е.: C:\Users\Public\Your_Path и использование этого пути в вызове OPENROWSET().

Публичная папка должна быть доступна всем пользователям .

Если вы все еще получаете ошибку разрешения, возможно, ваша проблема связана с вашим синтаксисом или файлом.

...