김종열 MS SQL Server MVP 엔트리브 소프트
앞서 이야기 했던 함수 종류인 Table을 리턴 하는 함수를 하나 만들어볼까 합니다. 함수의 기능은 아주 단순합니다. ASCII 파일을 읽어서 QUERY의 결과에 TABLE 형식으로 리턴해주는 주의하실 점은 지금까지는 대부분의 C# 코드는 하나의 CLASS 되었었는데
1. 기존 프로젝트인 PRJ_CLR를 OPEN합니다. 2. 사용자 정의 함수를 추가시킵니다. (PROJECT에서 오른 마우스를 클릭 > ADD > NEW ITEM) 3. NEW ITEM에서 사용자 정의 함수를 선택하고 이름을 “UDF_READ_FILE.CS”라고 입력 4. 여기까지 하고 아래와 같은 소스를 입력한다. (소스는 첨부하였습니다.) using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; using System.IO; using System.Collections; public partial class UserDefinedFunctions { [Microsoft.SqlServer.Server.SqlFunction(FillRowMethodName = "fillTable", TableDefinition="txt nvarchar(4000)")] public static IEnumerable UDF_READ_FILE(SqlString fname) { string[] sItems; StreamReader oSr; char cDelimeter = Convert.ToChar("\n"); string c_fname = Convert.ToString(fname); try { if (File.Exists(c_fname)) { oSr = new StreamReader(c_fname, System.Text.Encoding.Default); sItems = oSr.ReadToEnd().Split(cDelimeter); oSr.Close(); return (sItems); } else { throw new System.Exception("File Not found"); } } catch { return null; } } private static void fillTable(object obj, out SqlString sItem) { string sTemp = Convert.ToString(obj); sItem = (SqlString)sTemp; } }; 갑자기 기존의 코드보다 복잡하다고 혹시 당황해하시고 있는 것은 아닌지 모르겠습니다. 5. Visual Studio의 컴파일 및 배포를 이용하자. SELECT * FROM DBO.UDF_READ_FILE('C:\TEMP\SAMPLE.TXT'); 데이터베이스를 선택한 다음 Database 그리고 permition level을 외부 라고 지정합니다. pub한 뒤 배포를 하면 텍스트에 직접 쿼리를 하신 결과를 만나게 됩니다. (5, 6과정) USE YOULYDB GO SELECT * FROM DBO.UDF_READ_FILE('C:\TEMP\SAMPLE.TXT'); /* txt -------------------- www.sqllearder.com www.naver.co.kr www.empas.kr (4 row(s) affected) */ Permission level이란? (Query에서는 Permission_set {safe|Extrnal_access | Unsafe} CLR은 결국 외부에서 만든 dll의 모듈을 사용하게 되는데요. 이 코드에 액세스할 때는 부여된 코드에 액세스 권한을 지정합니다. 지정하지 않으면 기본적으로 safe가 됩니다. Safe는 가장 제한적인 권한으로 파일, 네트워크, 환경변수, 레지스트리, 외부 시스템 리소스에 액세스 할 수 없습니다. 즉 자신의 시스템에서 가벼운(강의로 따지면 이 이전까지?) 레벨의 처리라고 할 수 있으며, 시스템에 영향을 줄 수 있는 것을 못 쓰게 하는 것입니다. 즉 시스템에게는 safe라고 할 수 있겠네요. External access는 safe와 반대로 외부의 리소스 및 파일, 네트워크 등등을 호출할 수 있슴을 나타냅니다. Unsafe를 사용하게 되면 sql server 인스턴스의 내부 리소스와 외부 리소스 모두 제한 없이 액세스하게 되며, unsafe mode에서 실행되는 코드는 비관리 코드를 호출할 수 있습니다 도움파일 : UDF_READ_FILE.CS SAMPLE.TXT |
'연구개발 > CLR' 카테고리의 다른 글
CLR 강좌 - TEXT파일 읽기2 (0) | 2009.06.22 |
---|---|
등록된 DLL 정보 확인하기 (0) | 2009.06.22 |
CLR 강좌_ 함수 인자 주고 받기 (0) | 2009.06.22 |
CLR 권한 처리 문제 (0) | 2009.06.22 |
CLR 강좌 - CLR_수동배포 (0) | 2009.06.22 |