2017-10-22 17 views
0

나는 이것을 사용하고 있습니다.폴더 및 파일을 생성하여 xml 파일에 데이터를 쓰고 있는데 C에있는 clr 저장 프로 시저에 없으면 #

public partial class StoredProcedures 
{ 
    [Microsoft.SqlServer.Server.SqlProcedure] 
    public static void ExportXML_v1_2(string file_path, string file_name, string xml_data, out int status, out string error_messages) 
    { 
     string Folder1 = file_path; 
     string xml = xml_data; 
     error_messages = ""; 
     status = 0; 
     try 
     { 
      if (!Directory.Exists(Folder1)) 
      { 
       Directory.CreateDirectory(Folder1); 
      } 

이 오류가 발생합니다.

System.Security.SecurityException : 형식의 허가 'System.Security.Permissions.FileIOPermission, mscorlib에, 버전 = 4.0.0.0, 중립 문화 =, PublicKeyToken = b77a5c561934e089' 실패 요청. StoredProcedures에서 System.IO.Directory.InternalCreateDirectoryHelper에서 System.Security.CodeAccessPermission.Demand()에서 System.Security.CodeAccessSecurityEngine.Check (객체 수요, StackCrawlMark & stackMark, 부울 isPermSet) (문자열 경로, 부울 checkHost)에서 .ExportXML_v1_2 (문자열 FILE_PATH, 문자열 FILE_NAME, 문자열 xml_data, INT32 & 상태, 문자열 & error_messages)이었다 실패

동작은 :이었다 실패한 첫 번째 권한
의 유형 수요 : System.Security.Permissions를 .FileIOPermission
실패 어셈블리의 영역이었다 : 내 컴퓨터

+0

웹 애플리케이션입니까? –

+0

아니요, sql server clr 저장 프로 시저 – VASU

+0

확인했습니다. https://social.msdn.microsoft.com/Forums/sqlserver/en-US/58b01172-1487-46a9-88bc-bd0970782d1d/accessing-io-resources-from- clr-stored-procedure? forum = sqlnetfx –

답변

1

당신은 WITH PERMISSION_SET = EXTERNAL_ACCESS으로 어셈블리를 표시해야합니다. 그리고 순서대로 당신이 필요로하는 것을해야 할 일에 :

  1. EXTERNAL ACCESS ASSEMBLY 권한을 로그인이 비대칭 키
  2. 부여에서 로그인을 만들기 마스터의 비대칭 키 만들기 어셈블리
  3. 서명

물론 Visual Studio/SSDT를 사용하고 있는지, 특히 SQL Server 2017에 최근에 도입 된 변경 사항을 고려하여이 작업을 수행하는 방법에 차이가 있습니다.

또한, 입력/출력 변수 형태로 string 유형을 사용해서는 안된다. 적절한 Sql* 유형을 사용해야하며,이 경우 SqlString이됩니다. 그런 다음 Value 속성을 통해 실제 문자열 값을 가져옵니다. xml_data 매개 변수의 경우 SqlXml 유형을 사용하면 XmlReader을 약간 더 빨리 만들 수 있지만 인코딩 변경 (UTF-8 가능성이 가장 높음) 및 상단에 <?xml ... ?> 선언을 올바르게 처리합니다.예를 들어 : Stairway to SQLCLR (특히 레벨 5) : 일반 SQLCLR 작업에 대한 자세한 내용은

public static void ExportXML_v1_2(SqlString file_path, SqlString file_name, 
    SqlXml xml_data, out int status, out SqlString error_messages) 
{ 
    if (file_path.IsNull) 
    { 
     error_messages = "@file_path cannot be NULL."; 
     return; 
    } 

    string Folder1 = file_path.Value; 

, 내가 SQL Server 중앙에이 주제에 쓰고 있어요 시리즈를 참조하십시오.

그리고 FWIW, 파일에 XML을 저장하는 기능은합니다 (<?xml ... ?> 선언에 지정 포함) 형식 (예를 들어, 들여 쓰기 등), 덮어 쓰기 대 추가, 및 인코딩 (내가 쓴) SQL#에서 사용할 수를 처리 . 이 기능은 XML_SaveToFile이며 무료 버전에서 많은 기능을 사용할 수 있지만이 기능은 전체 (유료) 버전에서만 사용할 수 있습니다.

+0

'Sql * '유형을 사용하는 것이 가장 좋은 방법일까요? 아니면 일반적으로 본 성능 향상이 있습니까? – thomas

+0

@thomas 성능 이상의 기능. 초기에는 널 (NULL) 입력 가능 유형이 존재하기 전에 'NULL'처리에 대한 내장 지원이있었습니다. 또한 네이티브 .NET 유형, 특히'string'을 사용할 때 잃어버린 속성들과 메소드들도 있습니다 :'SqlString'은 당신에게'VARCHAR' 바이트와 LCID와 비교 스타일을 줄 수 있습니다; 'SqlChars'는 처음 접근 할 때까지 어떤 데이터도 보내지 않습니다. 어떤 이유로 든 사용되지 않을 수도있는 큰 값이 있으면 편리 할 수 ​​있습니다. 또한, 이들은 시스템이 SQLCLR API에 사용하는 유형입니다. 그들은 암묵적으로 변환하지만 의도 한 것을 사용하는 것이 가장 좋습니다. –