Download presentation
Presentation is loading. Please wait.
Published byMarcus Matthews Modified over 9 years ago
2
강성재 Developer Evangelist Microsoft Korea D&PE 개발자 관점에서 바라본 SQL Server 2005 (2)
3
목차 SQL CLR 클라이언트 새로운 기능 SQL 관리 객체 (SMO : SQL Management Objects)
4
1. SQL CLR Managed Code vs. Transact-SQL 기존 어셈블리 가져오기 Managed Code 를 사용해서 데이터베이스 객체 생성 Managed Code 구현
5
Managed Code vs. Transact-SQL managed code 사용 : – 복잡한 기능의 프로시저 –.NET Framework 클래스 라이브러리 접근 –CPU 집중적 기능 Transact-SQL 은 기본적인 프로시저의 데이터 접근에 사용
6
기존 어셈블리 가져오기 어셈블리에 데이터베이스 객체 이름 결정 1 1 어셈블리 참조 2 2 보안 권한 결정 3 3 CREATE ASSEMBLY HelperLibrary FROM '\\Server1\Private\AProject\bin\HelperLibrary.dll' WITH PERMISSION_SET SAFE -- default value CREATE ASSEMBLY Contacts FROM 'C:\AProject\bin\Contacts.dll' WITH PERMISSION_SET EXTERNAL_ACCESS CREATE ASSEMBLY HelperLibrary FROM '\\Server1\Private\AProject\bin\HelperLibrary.dll' WITH PERMISSION_SET SAFE -- default value CREATE ASSEMBLY Contacts FROM 'C:\AProject\bin\Contacts.dll' WITH PERMISSION_SET EXTERNAL_ACCESS
7
Managed Code 를 사용해서 데이터베이스 객체 생성 적절한 CREATE 문 사용 1 1 어셈블리와 연결 2 2 데이터 베이스 객체 사용 3 3 CREATE PROCEDURE Person.UpdatePhoneList AS EXTERNAL NAME Contacts. PhoneList.SaveList GO EXEC Person.UpdatePhoneList CREATE PROCEDURE Person.UpdatePhoneList AS EXTERNAL NAME Contacts. PhoneList.SaveList GO EXEC Person.UpdatePhoneList
8
기존 어셈블리 가져오기 데모 데모
9
Managed Code 구현 Visual Studio 2005 내에 SQL Server Projects System.Data.SqlServer 네임스페이스 Managed 저장 프로시저 Managed 트리거 Managed 사용자 정의 함수 Managed Aggregates Managed 사용자 정의 데이터 타입
10
managed 데이터베이스 객체 생성 프로젝트 필요한 참조 포함 –sqlaccess.dll –System.Data.dll 각 객체 타입에 대한 템플릿 포함 배포와 디버깅 직접 지원 Visual Studio 2005 내에 SQL Server Projects
11
System.Data.SqlServer 네임스페이스 ClassDescription SqlContextProvides access to other objects, like a connection SqlConnectionAn open connection to a SQL Server database SqlCommandUsed to send a command to the database server SqlParameterSupplies a parameter for a SqlCommand object SqlPipeUsed to send results or information to the client SqlDataReaderReads the data one row at a time, forward only SqlResultSetFor working with flexible server-side cursors SqlTransactionFor providing transactional behavior SqlTriggerContextProvides information about the trigger action
12
Managed 저장 프로시저 클래스에 public static method 생성 1 1 배포를 위해 SqlProcedure attribute 추가 2 2 managed 저장 프로시저 로직추가 3 3 public class ContactCode { [SqlProcedure(Name="GetContactNames")] public static void GetContactNames() { SqlCommand cmd = SqlContext.GetCommand(); cmd.CommandText = "SELECT FirstName + ' ' + LastName" + " AS [Name] FROM Person.Contact"; SqlDataReader rdr = cmd.ExecuteReader(); SqlPipe sp = SqlContext.GetPipe(); sp.Send(rdr); }
13
Managed 트리거 클래스에 public static method 생성 1 1 배포를 위해 SqlTrigger attribute 추가 2 2 managed trigger 로직 추가 3 3 public class ContactCode { [SqlTrigger(Name="ContactUpdTrg", Target="Person.Contact", Event="FOR UPDATE")] public static void ChangeEmail() { SqlTriggerContext trg = SqlContext.GetTriggerContext(); if (trg.TriggerAction == TriggerAction.Update) { if (trg.ColumnsUpdated[7] == true) //send e-mail to each new contact }
14
Managed 사용자 정의 함수 클래스에 public static method 생성 1 1 SqlFunction attribute 추가 2 2 managed function 구현 3 3 public class MyFunctions { [SqlFunction(Name="GetLongDate" )] public static SqlString GetLongDate(SqlDateTime DateVal) { // Return the date as a long string return DateVal.Value.ToLongDateString(); } public class MyFunctions { [SqlFunction(Name="GetLongDate" )] public static SqlString GetLongDate(SqlDateTime DateVal) { // Return the date as a long string return DateVal.Value.ToLongDateString(); }
15
Managed Aggregates public class 생성 1 1 Serializable 과 SqlUserDefinedAggregate attributes 추가 2 2 Init, Accumulate, Merge, and Terminate methods 생성 3 3 [Serializable, SqlUserDefinedAggregate(…)] public class CommaDelimit { public void Init() {…} public void Accumulate(SqlString Value) {…} public void Merge(CommaDelimit Group) {…} public SqlString Terminate() {…} } [Serializable, SqlUserDefinedAggregate(…)] public class CommaDelimit { public void Init() {…} public void Accumulate(SqlString Value) {…} public void Merge(CommaDelimit Group) {…} public SqlString Terminate() {…} }
16
Managed 사용자 정의 데이터 타입 public class 또는 struct 생성 1 1 Serializable 과 SqlUserDefinedType attributes 추가 2 2 Handle NULLability 3 3 문자열 변환 지원 4 4 Provide public properties 에서 private data 접근 지원 5 5
17
Visual Studio 2005 데이터베이스 객체 배포 managed code 생성 시 attributes 사용 1 1 Deploy 옵션 사용 2 2 [SqlProcedure(Name="ProcName")] public static void Proc ( )
18
Implementing Managed Code (VS.NET 2005) 데모 데모
19
2. 클라이언트 새로운 기능 Multiple Active Result sets (MARS) System.Transactions
20
MARS SQL Server 2005 이전 버전 까지, SQL Server 는 다중 연결을 지원하지 않았다 – 커낵션은 단일 DataReader 지원 – 다중 서버 커서와 함께 작업 가능 Multiple Active Result Sets 는 다중 연결 지원 – 다중 스트림과 다중 트랜잭션
21
MARS
22
기존 방식 SqlConnection conn = new SqlConnection( "server=.;integrated security=sspi;database=pubs"); SqlCommand cmd = new SqlCommand( "select * from authors",conn); conn.Open(); SqlDataReader rdr = cmd.ExecuteReader(); Console.WriteLine("got first reader"); // second reader, same connection – This will not work cmd.CommandText = "select * from jobs"; SqlDataReader rdr2 = cmd.ExecuteReader(); // attempt to use both readers, but never get to here rdr.Read(); rdr2.Read(); Console.WriteLine(rdr2[0]);
23
MARS 방식 // MARS is the default with SQL Server 2005 DB SqlConnection conn = new SqlConnection( "server=zmv43;integrated security=sspi;database=pubs"); SqlCommand cmd = new SqlCommand("select * from authors",conn); // must use a separate SqlCommand instance SqlCommand cmd2 = new SqlCommand("select * from jobs",conn); conn.Open(); SqlDataReader rdr = cmd.ExecuteReader(); // second reader, same connection - THIS DOES WORK SqlDataReader rdr2 = cmd2.ExecuteReader(); rdr2.Read(); rdr.Read(); // both readers on same connection Console.WriteLine(rdr[0]); Console.WriteLine(rdr2[0]);
24
System.Transactions System.Transactions 는 가벼운 DTC 엑세스 지원 API – 단순한 분산 트랜잭션 기능 지원 – 엔터프라이즈 서비스와 유사하지만, 카탈로그를 필요로 하지 않는다 transaction 범위 – 하나의 DBMS 와 인스턴스 사용 시 로컬 트랜잭션 – 하나 이상의 데이터베이스 사용 시 분산 트랜잭션 –transaction 승격 가능 Local 에서 시작 분산 트랜잭션으로만 가능 SQL Server 2005 만 가능
25
TransactionScope 사용 using (TransactionScope ts = new TransactionScope()) { SqlConnection conn1 = new SqlConnection( "server=.;integrated security=sspi;database=pubs")) // start local tx if SQL 2005, distributed tx if not conn1.Open(); SqlCommand cmd1 = new SqlCommand( "INSERT jobs 'job1', 10, 10", conn1); cmd1.ExecuteNonQuery(); SqlConnection conn2 = new SqlConnection( "server=other;integrated security=sspi;database=pubs")) // promote to distributed tx if SQL 2005 conn2.Open(); SqlCommand cmd2 = new SqlCommand( "INSERT jobs 'job2', 10, 10", conn2); cmd2.ExecuteNonQuery(); ts.Consistent = true; // commit transaction // dispose SqlCommands and SqlConnections here }
26
3. SQL 관리 객체 (SMO : SQL Management Objects) SQL Server 7, 2000, 과 2005 에 대해 프로그램에 입각한 관리 제공.NET 어셈블리 내부 클래스로 구현 가능 Distributed Management Objects (DMO) 대체 기능 : – 초기화 최적화 – 캡춰 실행 –WMI 기능 – 스크립팅 – 서버 옵션 구성
27
클래스 구조도 SQL 관리 객체 모델 Server Database Tables Table Columns Column … Schemas StoredProced ures Views … … Databases 유틸리티 클래스 –Backup, Restore, Scripter, Transfer
28
SQL 관리 객체 참조.NET 클라이언트 애플리케이션 생성 1 1 SQL SMO 어셈블리 참조 2 2 Imports 또는 using 문 사용 3 3 Imports Microsoft.SqlServer.Management.Smo Imports Microsoft.SqlServer.Management.Common Imports Microsoft.SqlServer.Management.Smo Imports Microsoft.SqlServer.Management.Common
29
SMO 를 사용해서 객체 생성 객체 변수 생성 및 초기화 1 1 적합한 properties 셋 2 2 Create method 호출로 server 업데이트 3 3 Dim AWDBase As Database = Svr.Databases("AdventureWorks") Dim DiscountsTable As New Table(AWDBase, "Sales.Discounts") Dim DiscountID As New Column(DiscountsTable, _ "DiscountID", DataType.Int) Dim DiscountName As New Column(DiscountsTable, _ "DiscountName", DataType.NVarChar(40)) DiscountID.Identity = True DiscountsTable.Columns.Add(DiscountID) DiscountsTable.Columns.Add(DiscountName) DiscountsTable.Create() Dim AWDBase As Database = Svr.Databases("AdventureWorks") Dim DiscountsTable As New Table(AWDBase, "Sales.Discounts") Dim DiscountID As New Column(DiscountsTable, _ "DiscountID", DataType.Int) Dim DiscountName As New Column(DiscountsTable, _ "DiscountName", DataType.NVarChar(40)) DiscountID.Identity = True DiscountsTable.Columns.Add(DiscountID) DiscountsTable.Columns.Add(DiscountName) DiscountsTable.Create()
30
추천서적 : Microsoft Press IT 전문가를 위한 고급 정보 최신 기술서적에 대한 정보는 여기서 참조하세요. www.microsoft.com/learning/books/
31
이 서적은 국내 대형서점에서 판매되며, 온라인 서점에서도 판매 됩니다. 추천서적 : IT 전문가를 위한 참고서적
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.