SQL Server 2005引入CLR之後,開發者們熱情地接受了它。

CLR作爲一個強有力的工具,開發者可在數據庫中利用它調用其它面嚮對象語言編寫而成的功能。

從DBA的視角來看,CLR的引入淡化了編譯型代碼與數據庫代碼的區別。它引發了在部署、管理CLR代碼以及安全性上,開發者和DBA的角色問題。

在某種程度上,它也淡化了在多層架構的系統中。業務邏輯層和數據访問層的區間。

對許多組織而言。實現CLR须要決策有關開發過程和它們涉及到的角色。假设你準備執行CLR,你须要足夠多的非技術細節信息來印證這些決定。

最後。我將指出怎样實現CLR,討論CLR代碼的利弊。以及CLR技術給SQL Server管理和安全方面帶來的影響。我也將描写叙述哪些情況適合用CLR,而哪些情況可能不適合。

創建與部署CLR

CLR是一個程序模型,它允許開發者用面嚮對象語言來寫編寫代碼,然後像T-SQL存儲過程、函數或觸發器一樣去使用它。一般創建過程例如以下:

1、創建VSproject,代碼能够用C#/VB.Net編寫;

2、代碼被編譯後,直接從VS部署到目標數據庫。編譯後會產生一個DLL文件,DLL是一個包括編譯後代碼的可運行的文件。部署後,將會在sys.assemblies視圖和其它相關視圖中插入對應程序集信息。

3、通過對程序集運用EXTERNAL NAME選項。一個或多個T-SQL對象將在數據爲中被創建。這些對象對稱爲原型,一個原型能被定義爲存儲過程,函數。用戶自定義聚集函數或用戶自定義類型。

原型中不包括代碼。它仅仅是一個簡單的可被其它數據庫代碼調用的入口。被調用時。DLL中編譯後的代碼將會運行。

通常,當你從VS編譯和部署時,上述全部步驟都會被執行,但你也能够手動分開執行每一步。

現代的面嚮對象語言有一些對T-SQL來說是非常困難甚至無法實現的功能。CLR則提供了一種在數據庫中運用這些語言豐富特性的方式。對於計算或迭代性的操作。CLR通常提供比T-SQL更優的性能。CLR代碼和SQL Server在同一個內存上下文中運行,所以它運行得非常有效率。

CLR代碼是被託管的代碼,這意味着它在『CLR運行時』中運行時,能够確保不會出現代碼運行時使服務器不穩定的情況。盡管這是好事,但不论什么形式的虛擬化都會有一定程序的開銷,CLR假设運用不當還是會影響性能的。盡管編譯後的代碼在SQL內存空間中會運行得非常有效率。但T-SQL仍然是繁重工作的最好選擇。假设要访問和返回大批量的數據,CLR並不是一個好的選擇。

總之中的一个句話,T-SQL處理集合類操作更加有效率,而CLR對迭代、過程、計算類操作更加在行。當然也會有例外的時候。

管理CLR

有時DBA與CLR打的第一個交道就是有人提議在服務器上啟用CLR。雖然啟用CLR仅仅是在服務的選項中啟用CLR配置項這麼簡單。但在啟動它之前你须要考慮非常多問題。

將腳本部署到數據庫是DBA的傳統職責,DBA同時也要保證腳本正常工作并且不影響性能或引發服務器上的其它問題。

然而,CLR代碼通常是從VS開發環境中直接部署到數據庫中的,而DBA一般不使用VS,這似乎意味著開發人員比DBA更適合去部署CLR代碼。

開發人員能够編寫編譯過後的代碼在SQL Server中像SQL代碼一樣運行。DBA或許會對此感覺不爽,但DBA仍然能够控制誰能够加載CLR程序集,在什麼安全級別下運行CLR功能。

CLR安全性

默認的。仅仅有sysadmin、db_ower、ddl_admin角色的用戶有權限去運行程序集相關的DDL語句。這個權限能够賦給其它角色和用戶。另外,例如以下三種權限集能够讓你設置程序集本身的三種安全級別:

SAFE。此安全級別仅仅允許访問本地數據和內部計算。

對系統資源,比方文件、網絡、環境變量或者註册表的访問是禁止的。不论什么有創建程序集權限的用戶都能够創建一個SAFE級別的程序集。假设CREATE ASSEMBLY語句沒有顯示指定安全級別,SAFE將是默認的級別。

EXTERNAL ACCESS

此安全級別允許程序集访問外部資源。擁有EXTERNAL ACCESS權限的用戶才干够創建此安全級別的信息集。

UNSAFE

在將程序集設為UNSAFE時請三思,此級別的程序集在SQL Server內外都擁有不受約束的访問權限。在UNSAFE程序集裏的代碼也可能是不受管理的代碼,意味著它有讓服務器不穩定的可能。

僅sysadmins用戶組的用戶能够登陸UNSAFE的程序集。

默認的,CLR代碼都是在SQL SERVER服務帳號的安全上下文運行。假设你要访問SQL Server之外的資源,這就會有問題,最好的做法是不超過服務帳號的權限。可是CLR代碼能够通過模擬其它Windows帳號來運行。

UNSAFE和EXTERNAL ACCESS安全級別的程序集有這種能力。能够創建這種程序集的人必須是深受公司信任的。

理解CLR元數據

在一個啟用了CLR選項的環境中。DBA應該對例如以下5個包括了元數據信息的系統視圖非常熟悉:

sys.assembiles. 此視圖每行記錄對應一個程序集。

它包括了程序集的一些屬性。比方名稱、安全級別和創建日期。

sys.assembly_files. 對數據庫中每一個程序集。這個視圖都包括了一行信息說明其源文件、DLL文件。

sys.assembly_modules. 一個程序集可能包括多個類。比方存儲過程和函數。程序集裏的類可能包括多個實現不同功能的代碼模塊。這個視圖將各自獨立的代碼模塊ID與引用它們的數據庫對象ID關聯在一起了。例如以下查詢能够查出每個CLR數據庫對象引用的程序集的類和方法:

SELECT OBJECT_NAME(m.object_id) AS db_object
,a.name AS assembly
,m.assembly_class
,m.assembly_method
FROM sys.assembly_modules m
INNER JOIN sys.assemblies a ON a.assembly_id = m.assembly_id

sys.assembly_references.程序集之間的相互引用依賴關係。

sys.module_assembly_usages將程序集的ID與引用它們的數據庫對象ID,關係起來了。

SELECT OBJECT_NAME(object_id) AS db_object
,a.name AS assembly
FROM sys.module_assembly_usages u
INNER JOIN sys.assemblies a ON a.assembly_id = u.assembly_id

移除CLR程序集

VS能够非常方便創建和部署CLR程序集到SQL Server中,但並沒有同樣方便的工具去卸載它們。你必須有順序地手動將它們移動。

在移除某程序集之前能够通過查看依賴項先移動那些引用此程序集的T-Sql對象。能够Sp_Depends或在對象資源管理器中右鍵查看。

更好的改變

純T-SQL的數據庫編程時代正在發生變化。CLR正是這一跡象的样例。盡管有人會有點排斥。但正是變化讓DBA生涯變得有趣。CLR真正突破了T-SQL在某些方面的限制。

兩種模式的混合編程能力是一個強大的工具,DBA和開發者都應該掌握它們。

原文鏈接

附经常使用查詢

-- Assembly Query
SELECT * FROM sys.assembly_modules;
SELECT * FROM sys.assemblies;
SELECT * FROM sys.assembly_files; -- CLR Object In Database
SELECT * FROM sys.objects WHERE type_desc LIKE 'CLR%'; -- 哪些系统对象引用了CLR程序集
SELECT OBJECT_NAME(object_id) AS [Object_Name],b.Name AS Assembly_Name
FROM sys.module_assembly_usages a
INNER JOIN sys.assemblies b ON a.assembly_id = b.assembly_id;

DBA眼中的CLR的更多相关文章

  1. redis无损数据迁移

    在dba眼中,redis仅仅是一个缓存,不适合作为存储来使用,不管是redis-sentinel集群还是cluster集群,在redis主节点发生意外宕机时没有机制来保证主从节点数据的一致性.但是,很 ...

  2. 程序员眼中的 SQL Server-执行计划教会我如何创建索引?

    先说点废话 以前有 DBA 在身边的时候,从来不曾考虑过数据库性能的问题,但是,当一个应用程序从头到脚都由自己完成,而且数据库面对的是接近百万的数据,看着一个页面加载速度像乌龟一样,自己心里真是有种挫 ...

  3. 一名小小的SQL Server DBA想谈一下SQL Server的能力

    一名小小的SQL Server DBA想谈一下SQL Server的能力 百度上暂时还没有搜索到相关的个人写的比较有价值的文章,至少在中文网络的世界里面没有 但是在微软的网站有这样一篇文章:<比 ...

  4. 人人都是 DBA(IX)服务器信息收集脚本汇编

    什么?有个 SQL 执行了 8 秒! 哪里出了问题?臣妾不知道啊,得找 DBA 啊. DBA 人呢?离职了!!擦!!! 程序员在无处寻求帮助时,就得想办法自救,努力让自己变成 "伪 DBA& ...

  5. 人人都是 DBA(IV)SQL Server 内存管理

    SQL Server 的内存管理是一个庞大的主题,涉及特别多的概念和技术,例如常见的 Plan Cache.Buffer Pool.Memory Clerks 等.本文仅是管中窥豹,描述常见的内存管理 ...

  6. SQL Server DBA工作内容详解

    在Microsoft SQL Server 2008系统中,数据库管理员(Database Administration,简称为DBA)是最重要的角色.DBA的工作目标就是确保Microsoft SQ ...

  7. DBA工具——DMV——通过sys.dm_exec_procedure_stats查看存储过程执行信息

    原文:DBA工具--DMV--通过sys.dm_exec_procedure_stats查看存储过程执行信息 对于DBA来说,经常要手机存储过程的某些信息: 执行了多少次 执行的执行计划如何 执行的平 ...

  8. 数据库高手(DBA专家 ,SSIS,replacation ,tourble shooting)

    http://www.cnblogs.com/qanholas/category/266780.html 随笔分类 - mssql SQL Server 2008 Datetime Cast 成 Da ...

  9. CLR 这些年有啥变化吗?

    引言 首先想给初学者推荐下<CLR via C#>这本好书,做.Net开发的开发者应该都读一下.为避免广告之嫌,所以这里只提供豆瓣书评的链接. CLR 作为.Net 程序跨平台运行的载体, ...

随机推荐

  1. HDU3853 LOOPS 期望DP 简单

    http://acm.hdu.edu.cn/showproblem.php?pid=3853 有一点坑的地方是如果一个地方停在原地的概率为1,那么该地的期望为0,就相当于这个地方也是一个出口...   ...

  2. 读书笔记_Effective_C++_条款二十八:避免返回handlers指向对象内部成分

    举个例子: class Student { private: int ID; string name; public: string& GetName() { return name; } } ...

  3. Shell基础学习(七) 输入输出重定向

    命令 说明 command>file 将输出重定向到file command<file 将输入重定向到file command >> file 将输出追加到file n > ...

  4. GIT 提交步骤

    1.提交 git add .

  5. sybase数据库技术 :游标可更新与for read only/for update

    在定义游标时不指定for update 或 for read only,ASE会检查以了解游标是否可更新: 如果游标查询语句中包含order by子句,则ASE会将游标定义为只读:其它情况下定义为可更 ...

  6. URL资源跨域访问 跨域使用session信息

    SilverLight 出于对安全性的考虑默认情况下对URL的访问进行了严格的限制,只允许访问同一子域下的URL资源. 下表列出了Silverlight 2.0 中 URL 访问规则:   WebCl ...

  7. Testcase的编写

    ‘ID’用于记录某一功能: ‘标题’用于表示某一Case:(一个功能有多个Case) ‘优先级’标记Case的重要等级,运行顺序 ‘测试步骤’记录测试流程 1.Given:条件 2.And:进行某些前 ...

  8. Internationalization composition diagram

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdHJvdWJsZXNob290ZXI=/font/5a6L5L2T/fontsize/400/fill/I0 ...

  9. Are you sure your NDK_MODULE_PATH variable is properly defined?(2)

    Are you sure your NDK_MODULE_PATH variable is properly defined? STEP1:   MIND: 明确NDK_MODULE_PATH概念ht ...

  10. 《UNIX环境高级编程》笔记--errno是否是线程安全的?

    当UNIX函数出错时,常常返回一个负数,而且整形变量errno通常被设置为含有附加信息的一个值,例如,open函数如成功,返回 一个非负文件描述符,如果出错就返回-1,在open出错时,有大约15种不 ...