가장 좋은 방법은 무엇입에 대한 검사 파일이 있는 SQL Server2005 저장 프로시저는?

StackOverflow https://stackoverflow.com/questions/16634

  •  08-06-2019
  •  | 
  •  

문제

우리가 사용하는"문서화되지 않"xp_fileexist 저장에 대한 절차 년에는 SQL Server2000 문제가 없었습니다.2005 년에,그것은 보인다는 수정된 동작이 약간 항상을 반환하는 경우 0 을 실행하면 사용자 계정하지 않은 시스템 관리자.그것은 또한 것을 반환하는 경 SQL 서버 서비스를 실행하 LocalSystem 계정은 파일을 확인하려면에서 네트워크입니다.

나는 멀리에서 얻을 수 xp_fileexist.지지 않는 더 나은 방법을 확인하는의 존재에 대한 파일에서는 네트워크에서 위치 내부에 저장된 절차?

도움이 되었습니까?

해결책

어쩌면 CLR 저장 프로시저는 당신이 무엇을 찾고 있습니다.이들은 일반적으로 사용할 때 상호 작용하는 데 필요한 시스템에서 어떤 방법입니다.

다른 팁

당신은 마크 CLR 로 EXTERNAL_ACCESS 에 대한 액세스를 얻기 위해 이 시스템입니다.IO 네임스페이스,그러나 가지지 않은 나쁜 이동하는 방법에 대해니다.

안전은 기본 권한 설정이지만,그것은 매우 제한적입니다.안전한 설정에 액세스할 수 있습만에서 데이터를 로컬에 데이터베이스를 수행할 수의 논리 연산에서는 데이터입니다.EXTERNAL_ACCESS 이에서 다음 단계 권한 계층 구조입니다.이 설정에 액세스할 수 있습니다 외부 리소스 등의 파일 시스템,Windows 이벤트 뷰어,웹 서비스를 사용하고 있습니다.이 형식의 리소스에 액세스할 수 없는 SQL Server2000 하고 있습니다.이 권한 설정은 또한 제한과 같은 작업을 포인터넷에 영향을 미치는 견고성의 당신의 어셈블리입니다.안전하지 않은 권한 설정이 전체의 신뢰를 어셈블리고,따라서 부과하지 않"코드의 액세스 보안에"제한 사항이 있습니다.이 설정은 비교하는 방법을 확장 저장 프로시저는 기능을 가정한 모든 코드가 안전합니다.그러나 이 설정을 제한하지 창조의 안전하지 어셈블리에는 사용자가 사용이버 권한이 있습니다.는 것이 좋습니다 당신이를 만들지 않도록 안전하지 어셈블리로 가능합니다.

나는 여전히 믿는 CLR 절차를 수 있습니다.그래서 나는 받아들이 대답합니다.그러나 중요하지 않는 것이 밝거나 그것을 구현하기가 매우 어렵다.우리의 SQL 서버 서비스를 실행하고 지역정 때문에 따라,Mircosoft,그것을 얻을 수있는 유일한 방법 iSeries 연결된 서버에서 작업하고 64-bit SQL Server2005 년 인스턴스입니다.을 변경하는 경우,SQL 서버를 실행하는 서비스로 도메인 계정 xp_fileexist 명령을 잘 작동에 위치한 파일 네트워크에 있습니다.

내가 만들어 이 CLR 저장 프로시저장으로 사용 권한 수준을 설정하는 외부 및 서명:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Security.Principal;

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void FileExists(SqlString fileName, out SqlInt32 returnValue)
    {
        WindowsImpersonationContext originalContext = null;

        try
        {
            WindowsIdentity callerIdentity = SqlContext.WindowsIdentity;
            originalContext = callerIdentity.Impersonate();

            if (System.IO.File.Exists(Convert.ToString(fileName)))
            {
                returnValue = 1;
            }
            else
            {
                returnValue = 0;
            }
        }
        catch (Exception)
        {
            returnValue = -1;
        }
        finally
        {
            if (originalContext != null)
            {
                originalContext.Undo();
            }
        }
    }
}

그때 나는 이러한 명령이 TSQL:

USE master
GO
CREATE ASYMMETRIC KEY FileUtilitiesKey FROM EXECUTABLE FILE = 'J:\FileUtilities.dll' 
CREATE LOGIN CLRLogin FROM ASYMMETRIC KEY FileUtilitiesKey 
GRANT EXTERNAL ACCESS ASSEMBLY TO CLRLogin 
ALTER DATABASE database SET TRUSTWORTHY ON;

그때 나는 배포 CLR 저장 proc 내 목표 데이터베이스 Visual Studio 에서 사용이 TSQL 하에서 실행 SSMS 으로 로그인 윈도우 인증

DECLARE @i INT
--EXEC FileExists '\\\\server\\share\\folder\\file.dat', @i OUT
EXEC FileExists 'j:\\file.dat', @i OUT
SELECT @i

는지 여부도는 로컬 파일 또는 네트워크 파일에 항 0.도 나중에 다시 시도 하십시오,하지만 지금,나는 아래로 이동하려고 다른 도로입니다.만약 누군가가 어떤 빛을 흘리고,그것은 많이 주시면 감사하겠습니다.

@폴,는 코드는 다음과 같습니다.당신은 시도를 넣어서 추적하는 방법을 확인하는 Convert.ToString(fileName) 지 않게 물을 뿌리 경로는?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top