日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
數(shù)據(jù)庫(kù)表的基本信息,你真的都了解嗎?

用SQL Doc生成數(shù)據(jù)庫(kù)字典文檔的時(shí)候,突然發(fā)現(xiàn)有字段描敘(Description)這項(xiàng)內(nèi)容,以前一直沒(méi)有注意過(guò),故特意研究了一下,結(jié)果越挖越深,就寫(xiě)了這篇文章。

成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)嘉祥,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792

以前在做數(shù)據(jù)庫(kù)腳本開(kāi)發(fā)時(shí),新建表時(shí),對(duì)各個(gè)字段的描敘要么是記錄在文檔里面,要么自己建一個(gè)表,來(lái)保存這些內(nèi)容,以便日后開(kāi)發(fā)、維護(hù)的方便。其實(shí)這些信息完全可以放在數(shù)據(jù)庫(kù)自己的系統(tǒng)視圖里面。

對(duì)字段的說(shuō)明、描述一般都放在系統(tǒng)視圖sys.extended_properties中,例如(表dbo.Employee的字段Department的說(shuō)明

 
 
 
 
  1. SELECT * FROM dbo.Employee
  2. SELECT * FROM sys.extended_properties 

其中 當(dāng)class =1時(shí),major_id它的值是dbo.Employee的id,minor_id是Department的id(詳細(xì)信息參見(jiàn)MSDN),如下圖所示

 
 
 
 
  1. SELECT OBJECT_ID(N'dbo.Employee')
  2. SELECT  column_id FROM    sys.columns
  3. WHERE   object_id = OBJECT_ID('dbo.Employee')
  4.         AND name = 'Department'

其實(shí)在MSSMS 管理器中,選中要添加字段說(shuō)明的表,單擊右鍵——》修改(08是設(shè)計(jì)),如下圖所示,增加后,保存。就會(huì)在sys.extended_properties里添加相應(yīng)的記錄。

當(dāng)然你也可以用腳本命令添加數(shù)據(jù)庫(kù)表的字段說(shuō)明

 
 
 
 
  1. EXEC sp_addextendedproperty N'MS_Description', N'雇員名稱(chēng)', 'SCHEMA', N'dbo', 'TABLE', N'Employee', 'COLUMN', N'EmployeeName'

如果已經(jīng)存在剛才記錄,你再執(zhí)行上面這段腳本,就會(huì)提示:

消息 15233,級(jí)別 16,狀態(tài) 1,過(guò)程 sp_addextendedproperty,第 38 行
無(wú)法添加屬性。'dbo.Employee.EmployeeName' 已存在屬性 'MS_Description'。

下面看看工具生成的文檔,工具生成這些信息肯定是數(shù)據(jù)庫(kù)里存有對(duì)象的這些信息,下面我們來(lái)看看這些信息都是從何而來(lái)吧

 這里先列舉一些保存表信息的系統(tǒng)表、視圖吧,可能有些遺漏了,實(shí)在太多了,要仔細(xì)把這些全部列舉出來(lái)還得花費(fèi)一番功夫

   
 
 
 
  1. SELECT * FROM sys.columns
  2. --為每個(gè)表和視圖中的每列返回一行,并為數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程的每個(gè)參數(shù)返回一行。
  3. SELECT * FROM syscolumns
  4. --每個(gè)表對(duì)象的信息
  5. SELECT * FROM sys.tables
  6. SELECT * FROM sysobjects
  7. --在數(shù)據(jù)庫(kù)中創(chuàng)建的每個(gè)用戶定義的架構(gòu)范圍內(nèi)的對(duì)象的信息
  8. SELECT * FROM sys.objects
  9. --數(shù)據(jù)庫(kù)實(shí)例中的每個(gè)數(shù)據(jù)庫(kù)的信息
  10. SELECT * FROM sys.databases
  11. --系統(tǒng)數(shù)據(jù)類(lèi)型
  12. SELECT * FROM sys.types
  13. --含數(shù)據(jù)庫(kù)中每個(gè)視圖、規(guī)則、默認(rèn)值、觸發(fā)器、CHECK 約束、DEFAULT 約束和存儲(chǔ)過(guò)程的項(xiàng)
  14. SELECT * FROM dbo.syscomments
  15. --保存表的自增列信息
  16. SELECT * FROM sys.identity_columns

下面來(lái)看看屬性那欄的信息保存在那些表里面。如果表是數(shù)據(jù)庫(kù)的默認(rèn)排序規(guī)則,就可以用下面腳本。

     
 
 
 
  1. SELECT  create_date  AS Created ,
  2.         modify_date  AS Last Modified,
  3.         ( SELECT    collation_name
  4.           FROM      sys.databases
  5.           WHERE     name = 'MyAssistant'
  6.         ) AS collation_name
  7. FROM    SYS.tables
  8. WHERE   NAME = 'Employee'

如果用某個(gè)列的排序規(guī)則可用下面的腳本

       
 
 
 
  1. SELECT  create_date  AS Created,
  2.         modify_date  AS Last Modified,
  3.         ( SELECT DISTINCT
  4.                     collation
  5.           FROM      syscolumns
  6.           WHERE     id = OBJECT_ID(N'dbo.Employee')
  7.                     AND collation IS NOT NULL
  8.                     AND name ='EmployeeName'
  9.         ) AS collation_name
  10. FROM    sys.tables
  11. WHERE   NAME = 'Employee'

查看數(shù)據(jù)庫(kù)的排序規(guī)則可以從 sys.databases查看,而表的某個(gè)列的排序規(guī)則信息保存在syscolumns里面。上圖的Heap, Row Count信息我還不知是從哪里來(lái)的。

接下來(lái)看看Cloumns信息吧

         
 
 
 
  1. SELECT 
  2.     C.Name AS FieldName,
  3.     T.Name AS DataType,
  4.     CASE WHEN C.Max_Length = -1 THEN 'Max' ELSE CAST(C.Max_Length AS VARCHAR) END AS Max_Length,
  5.     CASE WHEN C.is_nullable = 0 THEN '×'  ELSE '√' END AS Is_Nullable,
  6.     C.is_identity,
  7.     ISNULL(M.text, '')  AS  DefaultValue,
  8.     ISNULL(P.value, '') AS FieldComment
  9.     
  10. FROM sys.columns  C
  11. INNER JOIN  sys.types T ON C.system_type_id = T.user_type_id
  12. LEFT JOIN dbo.syscomments M ON M.id = C.default_object_id
  13. LEFT  JOIN sys.extended_properties P ON P.major_id = C.object_id AND C.column_id = P.minor_id 
  14. WHERE C.[object_id] = OBJECT_ID('dbo.Employee')
  15. ORDER BY C.Column_Id ASC

如圖所示,得到結(jié)果與文檔還是有些區(qū)別,我通過(guò)該腳本實(shí)現(xiàn)與文檔一致的時(shí)候,怎么也找不到nvarchar(30)的30,這個(gè)值的出處,后來(lái)才發(fā)現(xiàn)它其實(shí)就是nvarchar的max_length 的一半。

修改腳本如下所示

           
 
 
 
  1. SELECT 
  2.     C.Name AS FieldName,
  3.     CASE WHEN T.Name ='nvarchar' THEN 
  4.               T.name +'(' + CAST(C.max_length/2 AS VARCHAR) +')' 
  5.          ELSE T.name END AS DataType,
  6.     CASE WHEN C.Max_Length = -1 THEN 'Max' ELSE CAST(C.Max_Length AS VARCHAR) END AS Max_Length,
  7.     CASE WHEN C.is_nullable = 0 THEN '×'  ELSE '√' END AS Is_Nullable,
  8.     ISNULL(CAST(I.seed_value AS VARCHAR) + '-' + CAST(I.increment_value AS VARCHAR), '') AS is_identity,
  9.     ISNULL(M.text, '')  AS  DefaultValue,
  10.     ISNULL(P.value, '') AS FieldComment
  11.     
  12. FROM sys.columns  C
  13. INNER JOIN  sys.types T ON C.system_type_id = T.user_type_id
  14. LEFT  JOIN  dbo.syscomments M ON M.id = C.default_object_id
  15. LEFT  JOIN  sys.extended_properties P ON P.major_id = C.object_id AND C.column_id = P.minor_id 
  16. LEFT  JOIN  sys.identity_columns I ON I.column_id= C.column_id AND C.object_id = I.object_id
  17. WHERE C.[object_id] = OBJECT_ID('dbo.Employee')
  18. ORDER BY C.Column_Id ASC

接下來(lái)看看Perssion信息來(lái)自何處。 首先我們來(lái)看看賦與、收回權(quán)限的腳本(我是在sa賬號(hào)下運(yùn)行的)

           
 
 
 
  1. DENY  SELECT ON [dbo].[Employee] TO [Kerry]
  2. GO
  3. GO
  4. DENY DELETE ON [dbo].[Employee] TO [Kerry]
  5. GO
  6. REVOKE DELETE ON [dbo].[Employee] TO [Kerry]
  7. GO
  8. REVOKE SELECT ON [dbo].[Employee] TO [Kerry]
  9. GO 

那么這些權(quán)限信息保存在那個(gè)系統(tǒng)表或系統(tǒng)視圖中,我查了很多資料,還是沒(méi)有查到,呵呵,希望有知道的告訴一聲。但是可以同過(guò)系統(tǒng)函數(shù)和系統(tǒng)存儲(chǔ)過(guò)程得到一些相關(guān)的權(quán)限設(shè)置信息。

1:系統(tǒng)存儲(chǔ)過(guò)程 sp_table_privileges, 它返回指定的一個(gè)或多個(gè)表的表權(quán)限(如 INSERT、DELETE、UPDATE、SELECT、REFERENCES)的列表,表具體參見(jiàn)(MSDN)。

2:系統(tǒng)函數(shù) fn_my_permissions 返回有效授予主體對(duì)安全對(duì)象的權(quán)限的列表,表具體參見(jiàn)(MSDN)

EXEC sp_table_privileges @table_name = 'Employee';

EXEC sp_table_privileges @table_name ='Employee' , @table_owner ='dbo'

           
 
 
 
  1. SELECT * 
  2. FROM fn_my_permissions('dbo.Employee', 'OBJECT') 
  3. ORDER BY subentity_name, permission_name ; 
           
 
 
 
  1. --查看用戶Kerry的有效權(quán)限
  2. SELECT * FROM fn_my_permissions('Kerry', 'USER');

再來(lái)看看SQL Srcipt,好像沒(méi)有那個(gè)系統(tǒng)表、系統(tǒng)視圖保存創(chuàng)建表的腳本(如果有的話,算我孤陋寡聞了),也不能通過(guò)SP_HELPTEXT來(lái)得到(存儲(chǔ)過(guò)程可以),在

網(wǎng)上搜索了下大概有SMO 方式和存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn)的,SMO方式我還沒(méi)來(lái)得及驗(yàn)證,存儲(chǔ)過(guò)程倒是找到一個(gè)(本來(lái)打算自己嘗試下的。呵呵,那這篇文章得耗上好長(zhǎng)時(shí)間了,等寫(xiě)完了,自己再寫(xiě)個(gè)試試),下面的存儲(chǔ)過(guò)程是我在http://edu.codepub.com/2009/0603/5408.php這里搜索到,也不知道原創(chuàng)作者是誰(shuí)。

             
 
 
 
  1. If object_id('up_CreateTable') Is Not Null
  2.     Drop Proc up_CreateTable
  3. Go
  4. /* 生成建表腳本(V2.0)  OK_008 2009-5-18 */
  5. Create Proc up_CreateTable
  6. (
  7.     @objectList nvarchar(max)=null
  8. )
  9. --With ENCRYPTION
  10. As
  11. /*  參數(shù)說(shuō)明:
  12.     @objectList 對(duì)象列表,對(duì)象之間使用","隔開(kāi)
  13.     
  14.     改存儲(chǔ)過(guò)程生成的建表腳本,包含Column,Constraint,Index
  15. */
  16. Set Nocount On
  17.     Declare @sql nvarchar(max),
  18.             @objectid int,
  19.             @id int,
  20.             @Rowcount int,
  21.             @ObjectName sysname,
  22.             @Enter nvarchar(2),
  23.             @Tab nvarchar(2)
  24.     Select     @Enter=Char(13)+Char(10),
  25.             @Tab=Char(9)    
  26.     Declare @Tmp Table(name sysname)
  27.     
  28.     If @objectList>''
  29.     Begin
  30.         Set @sql='Select N'''+Replace(@objectList,',',''' Union All Select N''')+''''
  31.         Insert Into @Tmp (name) Exec(@sql)
  32.         Set @sql=null
  33.         Select @sql=Isnull(@sql+',','')+name 
  34.             From @Tmp As a
  35.             Where Not Exists(Select 1 From sys.objects Where type='U' And name=a.name)
  36.         If @sql>''
  37.         Begin
  38.             Set @sql='發(fā)現(xiàn)無(wú)效的表名: '+@sql
  39.             Raiserror 50001 @sql
  40.             Return(1)
  41.         End
  42.     End
  43.     If object_id('tempdb..#Objects') Is Not Null
  44.         Drop Table #Objects
  45.     
  46.     If object_id('tempdb..#Columns') Is Not Null
  47.         Drop Table #Columns    
  48.     
  49.     Create Table #Objects(id int Identity(1,1) Primary Key,object_id int,name sysname)
  50.      
  51.     ;With t As 
  52.     (
  53.     Select Object_id,Convert(int,0) As LevelNo,name As object_name
  54.             From sys.objects a 
  55.             Where Type='U' And is_ms_shipped=0 And Not Exists(Select 1 From sys.foreign_keys Where referenced_object_id=a.object_id)
  56.     Union All
  57.     Select a.referenced_object_id As Object_id,b.LevelNo+1 As LevelNo,c.name As object_name
  58.         From sys.foreign_keys a 
  59.             Inner Join t b On b.object_id=a.parent_object_id
  60.             Inner Join sys.objects c On c.object_id=a.referenced_object_id And c.is_ms_shipped=0
  61.     )
  62.     Insert Into #Objects(object_id,name)
  63.         Select a.object_id,object_name
  64.             From t a
  65.             Where    Not Exists(Select 1 From t Where object_id=a.object_id And LevelNo>a.LevelNo) And
  66.                     Not Exists(Select 1 From sys.extended_properties Where major_id=a.object_id And minor_id=0 And class=1 And Name=N'microsoft_database_tools_support')
  67.                     And (Exists(Select 1 From @Tmp Where name=a.object_name) Or Not Exists(Select 1 From @Tmp))
  68.             Group By object_id,object_name,LevelNo
  69.             Order By LevelNo Desc
  70.     Set @Rowcount=@@Rowcount
  71.     If @Rowcount=0
  72.     Begin
  73.         Raiserror 50001 N'沒(méi)有可以生產(chǎn)腳本的表!'
  74.         Return(1)
  75.     End
  76.     --Column
  77.     Select    a.object_id,
  78.             a.column_id As Seq,
  79.             Cast(1 As tinyint) As DefinitionType,
  80.             Quotename(a.name)+Char(32)+ c.name +
  81.             Case 
  82.                 When a.user_type_id In (231,239) Then '('+Case a.max_length When -1 Then 'Max' Else Rtrim(a.max_length/2) End +')'
  83.                 When a.user_type_id In (62,165,167,173,175) Then '('+Case a.max_length When -1 Then 'Max' Else Rtrim(a.max_length) End+')'
  84.                 When a.user_type_id In (106,108) Then '('+Rtrim(a.[precision])+','+Rtrim(a.scale)+')' 
  85.                 Else ''
  86.             End
  87.             + Char(32)+
  88.             Case a.is_rowguidcol When 1 Then 'Rowguidcol ' Else '' End +
  89.             Case a.is_identity When 1 Then 'Identity('+Cast(d.seed_value As nvarchar(10))+','+Cast(d.increment_value As nvarchar(10))+') ' Else '' End+ 
  90.             Case a.is_nullable When 1 Then 'Null ' Else 'Not Null ' End+
  91.             Isnull('Constraint '+Quotename(e.name)+' Default('+e.definition+')','') As definition
  92.             Into #Columns
  93.         From sys.columns As a
  94.             Inner Join #Objects As b On b.object_id=a.object_id
  95.             Inner Join sys.types As c On c.user_type_id=a.user_type_id
  96.             Left Outer Join sys.identity_columns As d On d.object_id=a.object_id And d.column_id=a.column_id And a.is_identity=1
  97.             Left Outer Join sys.Default_constraints As e On e.object_id=a.default_object_id And e.parent_column_id=a.column_id
  98.         Create Nonclustered Index IX_#Columns_object_id On #Columns(object_id Asc)
  99.         --Constraint
  100.         Insert Into #Columns
  101.     
  102.         Select    a.parent_object_id As object_id,
  103.                 Row_number() Over(Partition By a.parent_object_id Order By Case a.type When 'PK' Then 1 When 'C' Then 2 Else 3 End)As Seq,
  104.                 2 As DefinitionType,
  105.                 'Alter Table '+Quotename(object_name(a.parent_object_id)) +' Add Constraint '+Quotename(a.name)+
  106.                 Case a.type 
  107.                     When 'PK' Then ' Primary Key '+Case When Exists(Select 1 From sys.indexes Where object_id=a.parent_object_id And is_primary_key=1 And type=1) Then N'Clustered ' Else N'Nonclustered ' End+
  108.                                                 '('+Stuff((Select ','+Quotename(c1.Name)+Case a1.is_descending_key When 1 Then ' Desc' Else ' Asc' End
  109.                                                         From sys.index_columns As a1
  110.                                                             Inner Join sys.indexes As b1 On b1.object_id=a1.object_id And b1.index_id=a1.index_id And b1.is_primary_key=1
  111.                                                             Inner Join sys.columns As c1 On c1.object_id=a1.object_id And c1.column_id=a1.column_id
  112.                                                         Where aa1.object_id=a.parent_object_id 
  113.                                                         For Xml Path('')
  114.                                                     ),1,1,'')+
  115.                                                 ')'
  116.                     When 'F' Then ' Foreign Key ('+Stuff((Select ','+Quotename(b1.Name)
  117.                                                         From sys.foreign_key_columns As a1
  118.                                                             Inner Join sys.columns As b1 On b1.object_id=a1.parent_object_id And b1.column_id=a1.parent_column_id
  119.                                                         Where aa1.constraint_object_id=a.object_id 
  120.                                                         Order By a1.constraint_column_id
  121.                                                         For Xml Path('')
  122.                                                     ),1,1,'')+
  123.                                                 ') References '+(Select Quotename(object_name(referenced_object_id)) From  sys.foreign_keys Where object_id=a.object_id)+
  124.                                                 ' ('
  125.                                                     +Stuff((Select ','+Quotename(b1.Name)
  126.                                                         From sys.foreign_key_columns As a1
  127.                                                             Inner Join sys.columns As b1 On b1.object_id=a1.referenced_object_id And b1.column_id=a1.referenced_column_id
  128.                                                         Where aa1.constraint_object_id=a.object_id 
  129.                                                         Order By a1.constraint_column_id
  130.                                                         For Xml Path('')
  131.                                                     ),1,1,'')+
  132.                                                 ')'
  133.                     When 'UQ' Then ' Unique'+(Select Case a1.type When 1 Then ' Clustered' Else ' Nonclustered' End
  134.                                                     From sys.indexes As a1
  135.                                                     Where aa1.object_id=a.parent_object_id 
  136.                                                                 And Exists(Select 1 From sys.key_constraints Where object_id=a.object_id And parent_object_id=a1.object_id And unique_index_id=a1.index_id)
  137.                                                )+                        
  138.                                                 '('+Stuff((Select ','+Quotename(c1.Name)+Case a1.is_descending_key When 1 Then ' Desc' Else ' Asc' End
  139.                                                         From sys.index_columns As a1
  140.                                                             Inner Join sys.indexes As b1 On b1.object_id=a1.object_id And b1.index_id=a1.index_id And b1.is_unique_constraint=1
  141.                                                             Inner Join sys.columns As c1 On c1.object_id=a1.object_id And c1.column_id=a1.column_id
  142.                                                         Where aa1.object_id=a.parent_object_id 
  143.                                                                 And Exists(Select 1 From sys.key_constraints Where object_id=a.object_id And parent_object_id=a1.object_id And unique_index_id=a1.index_id)
  144.                                                         For Xml Path('')
  145.                                                     ),1,1,'')+
  146.                                                 ')'
  147.                     When 'C' Then ' Check' +(Select definition From sys.check_constraints Where object_id=a.object_id)
  148.                     Else ''
  149.                 End As definition
  150.             From sys.objects As a
  151.             Where a.type In('PK','F','C','UQ')
  152.                     And Exists(Select 1  From #Objects Where object_id=a.parent_object_id)
  153.         --Index
  154.         Insert Into #Columns
  155.         Select    a.object_id ,
  156.                 a.index_id As Seq,
  157.                 3 As DefinitionType,
  158.                 'Create '+Case a.is_unique When 1 Then 'Unique ' Else '' End+
  159.                 Case a.type When 1 Then 'Clustered ' Else 'Nonclustered ' End+
  160.                 'Index '+Quotename(a.name)+' On '+Quotename(b.name)+
  161.                                         ' ('+Stuff((Select ','+Quotename(b1.Name)+Case a1.is_descending_key When 1 Then ' Desc' Else ' Asc' End
  162.                                                         From sys.index_columns As a1
  163.                                                             Inner Join sys.columns As b1 On b1.object_id=a1.object_id And b1.column_id=a1.column_id
  164.                                                         Where aa1.object_id=a.object_id And a.index_id=a1.index_id And a1.is_included_column=0
  165.                                                         For Xml Path('')
  166.                                                     ),1,1,'')+
  167.                                         ')'+
  168.                                         Isnull(' Include('+Stuff((Select ','+Quotename(b1.Name)
  169.                                                         From sys.index_columns As a1
  170.                                        &nb
    文章題目:數(shù)據(jù)庫(kù)表的基本信息,你真的都了解嗎?
    網(wǎng)頁(yè)URL:http://www.dlmjj.cn/article/ccecssj.html