Математика

Физика

Химия

Биология

Техника и    технологии

Pro SQL Server 2005 Assemblies 2006 by Robin Dewson str259
Pro SQL Server 2005 Assemblies 2006 by Robin Dewson str259
2006 by Robin Dewson and Julian Skinner




Contents at a Glance
About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi
About the Technical Reviewers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv
Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
CHAPTER 1 Introducing Assemblies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
CHAPTER 2 Writing a Simple SQL Assembly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
CHAPTER 3 The SQL Server .NET Programming Model . . . . . . . . . . . . . . . . . . . . . 33
CHAPTER 4 CLR Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
CHAPTER 5 User-Defined Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
CHAPTER 6 User-Defined Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
CHAPTER 7 User-Defined Aggregates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
CHAPTER 8 CLR Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
CHAPTER 9 Error Handling and Debugging Strategies . . . . . . . . . . . . . . . . . . . . . 161
CHAPTER 10 Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
CHAPTER 11 Integrating Assemblies with Other Technologies . . . . . . . . . . . . . . . 231
INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
iii

Contents
About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi
About the Technical Reviewers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv
Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
CHAPTER 1 Introducing Assemblies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Data Manipulation Prior to SQL Server 2005 . . . . . . . . . . . . . . . . . . . . . . . . . 1
SQL Server Assemblies Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Common Language Runtime Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Compiling and Executing Assembly Code . . . . . . . . . . . . . . . . . . . . . . . 3
Code Access Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Threading Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Memory Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Application Domains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Using Assemblies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Application Tier vs. Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
T-SQL Code or .NET Assembly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Migrating Extended Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . 8
ADO.NET and SQL Data Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Building Objects from Assemblies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
CLR Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
User-Defined Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
User-Defined Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
User-Defined Aggregates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
DDL Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
v
CHAPTER 2 Writing a Simple SQL Assembly . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
SQL Assembly Creation Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Writing .NET Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Coding the Simple Stored Procedure . . . . . . . . . . . . . . . . . . . . . . . . . 15
Compiling .NET Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Registering the Assembly with SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . 22
Creating the Stored Procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
SQL Server Projects in Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
CHAPTER 3 The SQL Server .NET Programming Model . . . . . . . . . . . . . . . . 33
The .NET Data Access Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Accessing SQL Server Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Establishing the Context of a SQL Assembly . . . . . . . . . . . . . . . . . . . 34
Creating the Context Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Making Requests Against SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . 36
Representing Row Metadata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Working with Single Rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Communicating with the Caller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
CLR Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
CHAPTER 4 CLR Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Why Use a CLR Stored Procedure? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Migrating Complex T-SQL Procedures . . . . . . . . . . . . . . . . . . . . . . . . 54
Converting Extended Stored Procedures . . . . . . . . . . . . . . . . . . . . . . 55
Creating a Stored Procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Creating XML Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
The T-SQL Stored Procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Writing the Assembly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Working with Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Storing and Retrieving Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Using Nonstandard Assemblies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Testing the Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Executing Operating System Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
vi CONTENTS
CHAPTER 5 User-Defined Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Creating CLR UDFs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Restrictions on UDF Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
The SqlFunction Attribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Scalar-Valued UDFs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Scalar-Valued UDF Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Table-Valued UDFs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Table-Valued UDF Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Listing the Contents of a Folder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
CHAPTER 6 User-Defined Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Traditional vs. CLR UDTs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Creating CLR-Based UDTs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Required Implementations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Optional Method Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Understanding the UDT Life Cycle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Building and Using Example UDTs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Creating a Duration UDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Creating an E-mail Address UDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
CHAPTER 7 User-Defined Aggregates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
UDA Benefits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
UDA Limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Building a UDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Building a Simple UDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Using UDTs with a UDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Creating the .NET Assembly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Serialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Building a Serialized UDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
CONTENTS vii
CHAPTER 8 CLR Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
When to Use CLR Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
CLR DDL Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Creating CLR DDL Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
EventData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Dropping DDL Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Using CLR-Based DDL Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
CLR DML Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Creating DML Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Using CLR DML Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
CHAPTER 9 Error Handling and Debugging Strategies . . . . . . . . . . . . . . . 161
Debugging SQL Assemblies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Debugging with Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Debugging from the Command Line . . . . . . . . . . . . . . . . . . . . . . . . . 166
Using Preprocessor Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
The Conditional Attribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
The Debug and Trace Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Debugging Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
.NET Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Using SqlException . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Throwing Your Own Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Recording Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
E-mailing Error Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Writing to an Event Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
CHAPTER 10 Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
.NET Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Role-Based Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Code Access Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Partially Trusted Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
SQL Server Assembly Permission Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
The Safe Permission Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
The External Access Permission Set . . . . . . . . . . . . . . . . . . . . . . . . . 227
The Unsafe Permission Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Installing Nonsafe Permission Sets . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
viii CONTENTS
CHAPTER 11 Integrating Assemblies with Other Technologies . . . . . . . 231
Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Storing Data from the Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Writing the .NET Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Generating the Custom Types Used by the Web Service . . . . . . . . 236
Compiling the Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Deploying the Assemblies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Testing the Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Service Broker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
The .NET Service Broker Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Example Service Broker Application . . . . . . . . . . . . . . . . . . . . . . . . . 241
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259

Цена: 200руб.

Назад

Заказ

На главную страницу