针对开发人员的Microsoft SQL Server元数据
Microsoft SQL Server 2016最近在關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)中處于領(lǐng)先地位。 高性能,安全性,分析和云兼容性的結(jié)合使其成為領(lǐng)先的RDBMS 。 SQL Server 2017甚至支持R和Python編程語言,這進(jìn)一步提高了它在學(xué)術(shù)機(jī)構(gòu)中的數(shù)據(jù)科學(xué)家和數(shù)據(jù)專業(yè)人員中的吸引力。
這是一個(gè)激動(dòng)人心的時(shí)刻的原因有很多是外本文的范圍,SQL Server開發(fā),但要簡明概括他們:SQL Server已不僅成為頭號(hào)RDBMS,這也成為一個(gè)多 RDBMS。
牢記這些令人印象深刻的SQL Server新版本,您可能會(huì)想知道如何從預(yù)期對(duì)整體生產(chǎn)力產(chǎn)生最大影響的功能中獲得最大價(jià)值,尤其是在您缺乏經(jīng)驗(yàn)的情況下。 另一方面,如果您不參加每個(gè)網(wǎng)絡(luò)研討會(huì),也不在瀏覽每篇有關(guān)新功能的文章,那么不必?fù)?dān)心太多。 許多公司仍在使用SQL Server 2008 R2,尤其是在金融和醫(yī)療保健等受到嚴(yán)格監(jiān)管的行業(yè)中。
我會(huì)警告任何人,在不首先精通(如果不精通)基本技能之前,不要專注于SQL Server的任何新功能。
本文解釋了為什么元數(shù)據(jù)很有價(jià)值,什么是元數(shù)據(jù),然后介紹了使用引用元數(shù)據(jù)的Transact-SQL(T-SQL)代碼解決的兩個(gè)實(shí)際問題。 從查詢目錄視圖到動(dòng)態(tài)使用元數(shù)據(jù),您應(yīng)該不了解將減少您熟悉數(shù)據(jù)和獨(dú)立解決問題的時(shí)間和精力,從而使您的SQL Server開發(fā)技能更有價(jià)值的知識(shí)。
無論您使用的是哪個(gè)行業(yè),公司或什至當(dāng)前版本的SQL Server,您都可以學(xué)習(xí)這三個(gè)通用技能,這些技能可以高度移植,甚至可以跨越相對(duì)較大的軟件版本跳躍(例如,從SQL Server 2008 R2到2014)。 。
開發(fā)人員的三項(xiàng)基本SQL Server技能
SQL是您必須具備的首要技能,也是最顯而易見的技能。學(xué)習(xí)這種腳本語言的主要原因之一(除了它很有趣之外)還在于它的可傳遞性,即使在其他RDBMS之間也是如此。 當(dāng)然,我說的是美國國家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)的標(biāo)準(zhǔn)SQL(SQL)語法,不一定是T-SQL,這是Microsoft的SQL方言。 就個(gè)人而言,我還發(fā)現(xiàn)學(xué)習(xí)SQL / T-SQL語法的新元素比適應(yīng)圖形用戶界面上的新功能要容易。 出于本文的目的,我將基于以下假設(shè)來研究T-SQL:假定閱讀本文的人都是SQL Server開發(fā)人員的某種變體。
PowerShell是第二項(xiàng)技能。 PowerShell是另一種腳本語言,允許用戶自動(dòng)執(zhí)行各種有用的任務(wù),這些任務(wù)通常涉及運(yùn)行SQL Server Reporting Services報(bào)表,安排作業(yè)以及基本上完成許多數(shù)據(jù)庫管理員(DBA)的工作。 但是,使PowerShell更具吸引力的是它替代了使用.NET對(duì)象和方法的Windows DOS批處理語言(即,在命令提示符下使用的批處理語言)。 其價(jià)值的另一個(gè)原因是,與T-SQL不同,PowerShell可以自動(dòng)化跨越Windows和SQL Server環(huán)境的任務(wù)。
除了這兩種豐富的腳本語言之外,還有第三種技能可以使任何精通SQL Server的用戶受益,這就是元數(shù)據(jù)的使用。 從技術(shù)上講,理解SQL Server元數(shù)據(jù)(就本文而言,除非明確指定,否則對(duì)“元數(shù)據(jù)”的所有引用都將意味著“ SQL Server”)是學(xué)習(xí)的主題,也是鍛煉和應(yīng)用技能(即記憶關(guān)系和學(xué)習(xí)的機(jī)會(huì)) T-SQL)-本身并不是一項(xiàng)技能。 因此,每當(dāng)我提到“元數(shù)據(jù)的使用”時(shí),我的意思是“開發(fā)人員在T-SQL中應(yīng)用元數(shù)據(jù)知識(shí)的程度。”
但是,我認(rèn)為,元數(shù)據(jù)也是開發(fā)人員社區(qū)中最被忽視和低估的主題之一(而學(xué)習(xí)T-SQL顯然不是)。 許多入門的SQL Server或T-SQL書籍甚至都不會(huì)在以后的章節(jié)中討論它,即使有的話,甚至甚至很少。
熟悉SQL Server元數(shù)據(jù)是一項(xiàng)比大多數(shù)講師似乎更有價(jià)值的技能,特別是對(duì)于初學(xué)者而言,因?yàn)檫@是在SQL語言,數(shù)據(jù)庫設(shè)計(jì)以及物理和邏輯處理中將知識(shí)應(yīng)用于理論概念的一種實(shí)用方法。
即使對(duì)于經(jīng)驗(yàn)豐富的開發(fā)人員和DBA,SQL Server元數(shù)據(jù)也可能非常有價(jià)值,因?yàn)樗膶?shí)用性會(huì)隨著您在數(shù)據(jù)庫設(shè)計(jì)和編程的其他領(lǐng)域的創(chuàng)造力和能力而擴(kuò)展。 在整篇文章中,我將提供一些T-SQL腳本的示例,這些示例會(huì)增加復(fù)雜性,并演示如何在嘗試解決問題時(shí)熟悉元數(shù)據(jù)會(huì)變得無價(jià)。
但是,在深入研究示例之前,我應(yīng)該提出幾個(gè)重要的一般性觀點(diǎn)。 微軟的網(wǎng)站,通常稱為“在線圖書”(BOL),是我可以推薦的關(guān)于此主題的唯一最大資源。 實(shí)際上,您應(yīng)該查看此頁面以熟悉各種類型的元數(shù)據(jù),以及此頁面上的有關(guān)如何訪問元數(shù)據(jù)(即使用目錄視圖)的信息。
基本元數(shù)據(jù)查詢
查詢對(duì)象目錄視圖的簡單性和靈活性使即使是對(duì)SQL知識(shí)最少的用戶也可以很好地瀏覽數(shù)據(jù)庫中的對(duì)象和關(guān)系。 請(qǐng)?jiān)试S我通過一個(gè)簡單的示例演示為什么元數(shù)據(jù)對(duì)開發(fā)人員有用。
對(duì)于那些感興趣的人,請(qǐng)注意,我正在使用SQL Server 2016 Express Edition和AdventureWorks2014示例數(shù)據(jù)庫(兩者都是完全免費(fèi)的)。
假設(shè)您是虛構(gòu)公司Adventure Works Cycles的新員工。 在查看了幾張表后,您會(huì)發(fā)現(xiàn)名為“ BusinessEntityId”的列出現(xiàn)了很多。 讓查詢?cè)跀?shù)據(jù)庫中顯示具有該名稱的每一列不是很好嗎? 了解有關(guān)SQL Server元數(shù)據(jù)的基礎(chǔ)知識(shí)使之變得容易。
由于您知道[sys]。[all_objects],[sys]。[schemas]和[sys]。[all_columns],因此可以編寫一個(gè)簡單的查詢來實(shí)現(xiàn)BusinessEntityId的單個(gè)視圖。
use AdventureWorks2014 go select s.name as 'SchemaName',o.name as 'TableName',c.name as 'ColumnName' from sys.schemas as sinner join sys.all_objects as oon s.schema_id = o.schema_idinner join sys.all_columns as con c.object_id = o.object_id where c.name like 'BusinessEntityId' and o.type = 'U' order by SchemaName,TableName,ColumnName;這是結(jié)果集:
元數(shù)據(jù)不僅僅用于編寫基本的臨時(shí)查詢。 考慮進(jìn)行難以置信的復(fù)雜查詢的機(jī)會(huì),以回答極其困難或耗時(shí)的問題。 例如,給定數(shù)據(jù)庫中存在多少個(gè)重復(fù)索引? 它們是什么類型的索引?
不管您當(dāng)前的T-SQL技能水平如何,尤其是通過目錄視圖和動(dòng)態(tài)管理視圖(DMV)熟悉元數(shù)據(jù)都非常有價(jià)值。 這是一種有趣且易于訪問的機(jī)制,可以磨練您對(duì)T-SQL語言和公司主數(shù)據(jù)的了解,并隨著您在數(shù)據(jù)庫編程中不斷增強(qiáng)的能力而擴(kuò)展。
現(xiàn)在,按照其余查詢中的注釋進(jìn)行說明,這些注釋說明了使用元數(shù)據(jù)(結(jié)合一些業(yè)務(wù)知識(shí))探索主數(shù)據(jù)如何可以幫助您獨(dú)立回答問題。
use AdventureWorks2014 goselect s.name as 'SchemaName',o.name as 'TableName',c.name as 'ColumnName' from sys.schemas as sinner join sys.all_objects as oon s.schema_id = o.schema_idinner join sys.all_columns as con c.object_id = o.object_id where c.name like 'BusinessEntityId' and o.type = 'U' order by SchemaName,TableName,ColumnName;--Now join two tables using BusinessEntityId select * from HumanResources.Employee as einner join Person.Person as pon e.BusinessEntityID = p.BusinessEntityID order by p.BusinessEntityID;--hmm, it looks like PersonType "EM" stands for "Employee," but what does "SP" mean? --let's see if there are any other PersonType values select distinct PersonType from HumanResources.Employee as einner join Person.Person as pon e.BusinessEntityID = p.BusinessEntityID order by p.BusinessEntityID;--apparently, there are none --run the previous query again and look for patterns --perhaps it has something to do with JobTitle? select distinct p.PersonType,e.JobTitle from HumanResources.Employee as einner join Person.Person as pon e.BusinessEntityID = p.BusinessEntityID order by p.BusinessEntityID;--looks like it could have something to do with all sales-related jobs
如果您了解有關(guān)SQL Server元數(shù)據(jù)的方法,則可以了解很多關(guān)于公司數(shù)據(jù)的信息。
元數(shù)據(jù)的高級(jí)應(yīng)用
但是元數(shù)據(jù)的更高級(jí)應(yīng)用又如何呢? 如果您是在公司工作多年的經(jīng)驗(yàn)豐富的開發(fā)人員,該怎么辦? 為什么要學(xué)習(xí)SQL Server元數(shù)據(jù)? 好吧,一個(gè)更復(fù)雜的例子可能會(huì)讓您信服。
在Grant Fritchey在PASS本地用戶組活動(dòng)中的演講之一中,他描述了有關(guān)如何提高SQL Server性能的10條技巧。 其中之一是尋找嵌套視圖并重寫它們(理想情況下是通過連接到表)。 所謂“嵌套”,是指創(chuàng)建視圖時(shí)引用其定義中的其他視圖。 給定視圖定義中嵌套的級(jí)別越多,性能下降的幅度越大。
顯而易見的解決方案是不編寫嵌套視圖,但這也不是避免其假設(shè)存在的借口,因?yàn)檫@樣做會(huì)限制性能調(diào)整的熟練程度,并依賴于將來不會(huì)成為問題的假設(shè)。 而且,如果您正在調(diào)查數(shù)據(jù)庫性能問題并且不確定嵌套視圖是否困擾數(shù)據(jù)庫,那么值得您花時(shí)間至少看看一下此問題是否是必須解決的問題。 。
但是,您如何去做呢? 除了手動(dòng)右鍵單擊對(duì)象資源管理器中的每個(gè)視圖并查看定義之外,為什么不創(chuàng)建一個(gè)利用動(dòng)態(tài)SQL為您提供答案的元數(shù)據(jù)存儲(chǔ)過程?
我寫了兩個(gè)存儲(chǔ)過程,它們將在本文后面引用,以幫助您開始解決此問題。 碰巧有一個(gè)名為“ sys.dm_sql_referenced_entities”的系統(tǒng)函數(shù),它接受兩個(gè)輸入?yún)?shù):合格的視圖名稱(即“ schema.view”或“ [schema]。[view]”)和一個(gè)“引用類”。
就本文而言,只知道我們僅對(duì)數(shù)據(jù)庫對(duì)象感興趣,這意味著我們需要在第二個(gè)參數(shù)中使用字符串“ object”。 如果您想知道,如果使用其他引用類,則可以查看觸發(fā)器的引用。 有關(guān)更多信息,請(qǐng)參見此鏈接 。
既然我已經(jīng)提到了“動(dòng)態(tài)sql”,那么我應(yīng)該解決兩類可能涉及的問題:安全性和性能。
動(dòng)態(tài)SQL成本:安全性和性能
動(dòng)態(tài)SQL本質(zhì)上是“編寫SQL的SQL”。 盡管它在存儲(chǔ)過程中非常有用,但會(huì)帶來一些成本。 但是,在詳細(xì)說明這些成本之前,我必須指出,與嵌套視圖可能對(duì)數(shù)據(jù)庫產(chǎn)生的長期影響相比,它們可以忽略不計(jì)。
我很清楚,SQL注入是一種嚴(yán)重的安全風(fēng)險(xiǎn),當(dāng)開發(fā)人員編寫動(dòng)態(tài)SQL時(shí),這種風(fēng)險(xiǎn)就有可能發(fā)生。 對(duì)我來說幸運(yùn)的是,“父”存儲(chǔ)過程不接受用戶輸入,也不打算在任何面向客戶的應(yīng)用程序中使用。 更具體地說,動(dòng)態(tài)SQL不會(huì)接受來自應(yīng)用程序前端的用戶輸入來獲取其參數(shù)的值。
另一方面,如果您關(guān)心的是動(dòng)態(tài)SQL的性能,那么我為您提供兩個(gè)答復(fù):
首先,此“嵌套視圖”練習(xí)的目的是通過解決潛在的嚴(yán)重問題來提高數(shù)據(jù)庫的整體性能,而這種問題很少發(fā)生(也就是說,除非您有一群開發(fā)人員繼續(xù)定期嵌套視圖,在這種情況下,您會(huì)遇到更大的問題)。
由于問題(理論上)很少發(fā)生,因此您應(yīng)該只希望不頻繁運(yùn)行代碼,這意味著代碼性能不佳只會(huì)在您多次運(yùn)行時(shí)才會(huì)引起關(guān)注。 換句話說,如果您專注于這些過程的性能卻以犧牲整個(gè)數(shù)據(jù)庫的性能為代價(jià),則將完全失去問題的背景,因此,不要對(duì)代碼的性能考慮得太嚴(yán)格(但是如果可以,請(qǐng)隨時(shí)進(jìn)行更多調(diào)整)。
其次,您可能還擔(dān)心由于動(dòng)態(tài)SQL的非關(guān)系??性質(zhì),性能會(huì)受到影響。 我完全同意這樣一種觀點(diǎn),即任何編寫SQL的人都應(yīng)在可能的情況下盡力做到相關(guān)性(即,以符合集合論原理的方式進(jìn)行編寫)。 不幸的是,沒有比該方法更符合關(guān)系模型的解決該問題的替代方法了。 如果您不同意,或者找到任何使我的代碼更具關(guān)系性的方法來改進(jìn)我的代碼,請(qǐng)立即與我聯(lián)系。 我還應(yīng)該提到,我已經(jīng)寫了整篇文章 。
為了快速總結(jié)這些批評(píng):與嵌套視圖可能對(duì)不斷增長的數(shù)據(jù)庫產(chǎn)生的長期和累積的,性能下降的影響相比,安全風(fēng)險(xiǎn)和性能問題可忽略不計(jì)。 該代碼本身可能并未針對(duì)可伸縮性和性能進(jìn)行優(yōu)化,但是如果使用得當(dāng),它將有助于您確保數(shù)據(jù)庫處于最佳狀態(tài)。
使您的元數(shù)據(jù)動(dòng)態(tài)化
那么,動(dòng)態(tài)SQL是否值得承擔(dān)這些風(fēng)險(xiǎn)? 我能給您的最佳答案是,這取決于您要解決的問題的價(jià)值。 動(dòng)態(tài)SQL是SQL開發(fā)人員工具帶中的另一種工具,它大大增加了解決問題的方式。 自動(dòng)執(zhí)行此嵌套視圖清除程序搜尋的第一步是使用sys.dm_sql_referenced_entities(為簡潔起見,我將使用“被引用實(shí)體”)編寫動(dòng)態(tài)SQL語句,以返回所有被引用視圖的名稱和引用頻率:
[dbo]。[CountObjectReferences]
use [AdventureWorks2014] gocreate procedure [dbo].[CountObjectReferences] (@QualifiedView as varchar(255),@RefCount as int output ) as /******************************************************************************************************************* Author: Alex Fleming Create Date: 11-05-2017 This stored procedure accepts a string that contains a qualified view or table and returns the number of references. Examples of valid parameters: 'Sales.vStoreWithContacts' or '[Sales].[vStoreWithContacts]' *******************************************************************************************************************/ set nocount on; begindeclare @DynamicSQL varchar(3000) = ('select count(*)from sys.dm_sql_referenced_entities(' + '''' + @QualifiedView + '''' + ',''object'') as RefEntinner join sys.all_views as AllViewson RefEnt.referenced_id = AllViews.object_idwhere RefEnt.referenced_class = 1and RefEnt.referenced_minor_name is null;');exec (@DynamicSQL);end;/********************************Test********************************************* Note: AdventureWorks2014 does not contain any nested views out-of-the-box. Consequently, I have created several for testing. Here's the definition of two (one of them is nested by two levels):create view [HumanResources].[DuplicateEmployeeView] as ( select * from HumanResources.vEmployee ------standard view in AdventureWorks2014------ );create view [HumanResources].[DuplicateEmployeeView3] as ( select * from HumanResources.DuplicateEmployeeView );declare @RefCount int; exec dbo.CountObjectReferences @QualifiedView = 'HumanResources.DuplicateEmployeeView3', @RefCount = @RefCount output; *********************************************************************************/[dbo]。[FindNestedViews_v3]
use AdventureWorks2014gocreate procedure dbo.FindNestedViews_v3 (@ViewRefCount as int output) as/*******************************************************************************************************************Author: Alex FlemingCreate Date: 11-05-2017This stored procedure finds all of the views in the current database, stores them in a temp table, then passes them as parameters into the dbo.GetViewReferences stored procedure and stores the results in a new temp table, which isthen queried for all views containing one or more views in their definitions.*******************************************************************************************************************/set nocount on;beginif object_id ('[tempdb]..[#SchemaViewTemp]') is not nulldrop table #SchemaViewTemp;create table #SchemaViewTemp( SVID int identity(1,1) NOT NULL primary key,SchemaViewString varchar(2000) NULL,RefCount int null); insert into #SchemaViewTemp (SchemaViewString)select s.name + '.' + v.name as 'SchemaViewString'from sys.all_views as vinner join sys.schemas as son v.schema_id = s.schema_idwhere v.object_id > 0order by SchemaViewString;if object_id ('[tempdb]..[#ViewReferences]') is not nulldrop table #ViewReferences;--this table stores the output of the insert/exec statement--(can't use the same table because there is no way of updating based on an exec statement)create table #ViewReferences( RefID int identity(1,1) not null primary key,RefCount int null); declare @UpdateStmt varchar(500);declare @cnt as int = 0;declare @ViewString as nvarchar(255);declare NestedViewReader cursor forselect SchemaViewStringfrom #SchemaViewTemp;open NestedViewReader;fetch next from NestedViewReaderinto @ViewStringwhile @@FETCH_STATUS = 0begininsert into #ViewReferences (RefCount)exec @ViewRefCount = dbo.CountObjectReferences@QualifiedView = @ViewString, @RefCount = @ViewRefCount output;set @UpdateStmt = ('update #SchemaViewTemp set RefCount = ' + cast((select RefCount from #ViewReferences where RefID = @cnt + 1) as varchar(3)) +' where SVID = 1 + ' + cast(@cnt as varchar(2)) + ';');print @UpdateStmt;--for troubleshootingexec (@UpdateStmt);set @cnt = @cnt + 1;fetch next from NestedViewReaderinto @ViewStringendclose NestedViewReader;deallocate NestedViewReader;drop table #ViewReferences;select *from #SchemaViewTemp where RefCount > 0order by RefCount desc;end;go/********************************Test***********************************declare @ViewRefCount as int;exec dbo.FindNestedViews_v3 @ViewRefCount = @ViewRefCount output;************************************************************************/在動(dòng)態(tài)SQL和游標(biāo)之間,T-SQL的某些功能只是該解決方案不可避免的部分。 據(jù)我所知,使該想法起作用的唯一方法是使用動(dòng)態(tài)SQL執(zhí)行引用的實(shí)體系統(tǒng)功能。
此外,多次運(yùn)行動(dòng)態(tài)SQL的唯一方法是使用游標(biāo)(除非您想嘗試使用擴(kuò)展的存儲(chǔ)過程,但這不在本文的討論范圍之內(nèi))。 除了動(dòng)態(tài)SQL和游標(biāo)之外,您還有一些重要的設(shè)計(jì)決策。
一旦您有一個(gè)執(zhí)行在數(shù)據(jù)庫,模式和視圖名稱中傳遞的動(dòng)態(tài)SQL語句的存儲(chǔ)過程,您可能希望放慢速度并考慮設(shè)計(jì),特別是通過回答設(shè)計(jì)問題:“我是否要中斷?將此存儲(chǔ)到另一個(gè)存儲(chǔ)過程中并調(diào)用它,還是將所有邏輯封裝在一個(gè)巨型存儲(chǔ)過程中?”
我將動(dòng)態(tài)SQL包含在一個(gè)單獨(dú)的存儲(chǔ)過程中,而不是將其作為一個(gè)龐大的存儲(chǔ)過程的第一部分,這一事實(shí)是我的故意設(shè)計(jì)決定。 當(dāng)時(shí),我認(rèn)為閱讀和維護(hù)起來會(huì)更容易。 此外,我想確保動(dòng)態(tài)SQL的執(zhí)行計(jì)劃是一致的(存儲(chǔ)過程的優(yōu)點(diǎn)之一是防止優(yōu)化器偶爾生成不同的執(zhí)行計(jì)劃)。 我還發(fā)現(xiàn)編寫和測試更加容易。
確定如何存儲(chǔ)合格的視圖,將它們傳遞給[dbo]。[CountObjectReferences]存儲(chǔ)過程,存儲(chǔ)游標(biāo)的結(jié)果,然后顯示最終輸出,這是此問題中比較困難的部分之一。 我們可以使用表變量,臨時(shí)表,用戶定義的表或視圖。
如果您在此存儲(chǔ)過程中使用嵌套視圖,那將有多諷刺? 從技術(shù)上講,只有當(dāng)您在其中編寫存儲(chǔ)過程的數(shù)據(jù)庫中沒有除過程中的嵌套視圖之外的嵌套視圖,這才具有諷刺意味。 現(xiàn)在很諷刺!
我之所以選擇臨時(shí)表,是因?yàn)槲覍?duì)表變量不太熟悉。 我不想在此過程中維護(hù)用戶定義的表,也沒有安全方面的顧慮阻止我直接訪問數(shù)據(jù)(因此排除了視圖)。 稍后添加索引以及輕松地在本地和全局之間更改臨時(shí)表的范圍的能力也是吸引我的最初決定的吸引人的特征。
從一開始我就沒有澄清過我是否想要一個(gè)更詳細(xì)的結(jié)果集(它為用戶提供盡可能多的相關(guān)元數(shù)據(jù))還是包含最少的數(shù)據(jù)量以換取更高的性能,可維護(hù)性和簡便性。
在考慮了原始問題并認(rèn)為我希望能夠臨時(shí)運(yùn)行這些存儲(chǔ)過程之后,后者成為我的偏愛。我只需要一個(gè)簡單的結(jié)果集即可找到嵌套視圖。 基本上,您希望返回盡可能少的信息來回答您的問題。 在我們的例子中,這意味著返回所有包含其他視圖的視圖名稱,理想情況下,返回原始視圖和表之間存在多少級(jí)嵌套視圖。
在繼續(xù)之前,我必須指出,我知道使用游標(biāo)會(huì)限制這種方法的可擴(kuò)展性。 另一方面,在數(shù)據(jù)庫中嵌套視圖也不是完全可擴(kuò)展的數(shù)據(jù)庫設(shè)計(jì)方法,因此也請(qǐng)記住這一點(diǎn)。
如果我不了解[sys]。[views]或引用的實(shí)體功能,這些存儲(chǔ)過程將是不可能的。 實(shí)際上,我最初是在[sys]。[schemas]和[sys]。[all_columns]上加入了[sys]。[all_objects],它們的性能比本文引用的版本差。 指出元數(shù)據(jù)特權(quán)和動(dòng)態(tài)SQL背后的安全性問題也很重要。
由于安全策略根據(jù)組織的規(guī)模和行業(yè)的不同而不同,因此,每當(dāng)從事涉及SQL Server開發(fā)的工作時(shí),都應(yīng)使用這些因素使您的期望與要使用的DBA保持一致。 有關(guān)SQL Server元數(shù)據(jù)安全性的更多信息,請(qǐng)參閱Kalen Delaney的本文 。 實(shí)際上,我還建議您從Delaney中閱讀有關(guān)SQL Server元數(shù)據(jù)的更多信息。
其次,元數(shù)據(jù)訪問需要您的DBA的批準(zhǔn)。 雖然允許任何用戶訪問系統(tǒng)元數(shù)據(jù)都存在很小的安全風(fēng)險(xiǎn),但這實(shí)際上取決于您的DBA或公司對(duì)開發(fā)人員的信任程度。 除非您在受到嚴(yán)格監(jiān)管的行業(yè)工作,否則這對(duì)您來說不太可能成為問題。
當(dāng)使用術(shù)語元數(shù)據(jù)時(shí),我特別專注于系統(tǒng)元數(shù)據(jù)。 我還應(yīng)該指出DMV的用處,因?yàn)樗鼈冊(cè)贒BA中得到了廣泛的使用和依賴,并建議任何開發(fā)人員都應(yīng)該熟悉上述所有信息。
我發(fā)現(xiàn)最具挑戰(zhàn)性的是快速找到正確的DMV或系統(tǒng)元數(shù)據(jù)-當(dāng)我從上一段中得出自己的建議時(shí),這個(gè)問題肯定會(huì)減少。 關(guān)于這一點(diǎn),我鼓勵(lì)遇到相同問題的任何人使用我的第一個(gè)示例,然后根據(jù)您要查找的內(nèi)容對(duì)其進(jìn)行修改(即,對(duì)其進(jìn)行修改以根據(jù)關(guān)鍵字搜索來查找感興趣的DMV或系統(tǒng)視圖)。
通過額外的實(shí)踐,在沒有第三方軟件任何幫助的情況下,通過最大限度地提高您在SQL Server中解決問題的能力,元數(shù)據(jù)和DMV對(duì)您來說將變得無比寶貴。 更好的是,您大部分依賴SQL Server元數(shù)據(jù)的代碼仍將在Microsoft Azure中運(yùn)行,從而使元數(shù)據(jù)的應(yīng)用成為一種更具可移植性的技能。
考慮到技術(shù)興衰的混亂,可轉(zhuǎn)讓技能越來越難以識(shí)別和依賴,這使開發(fā)人員的生活(有時(shí))變得不必要地困難。 因此,SQL Server元數(shù)據(jù)的價(jià)值證明了Microsoft對(duì)用戶授權(quán)的奉獻(xiàn)精神,這無疑表明了他們與開發(fā)人員一起為您創(chuàng)建產(chǎn)品的跡象。
翻譯自: https://www.javacodegeeks.com/2018/02/microsoft-sql-server-metadata-developers.html
總結(jié)
以上是生活随笔為你收集整理的针对开发人员的Microsoft SQL Server元数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓平板电脑桌面整理(安卓电脑桌面app
- 下一篇: 在JDK 9中将InputStream传