<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【譯】如何使用索引視圖和一個只有2行的表限制業(yè)務(wù)規(guī)則

          假設(shè)一個業(yè)務(wù)規(guī)則規(guī)定某些情況不允許存在.并且不允許使用外鍵進行限制,此時Instead of 觸發(fā)器可以作為備選答案,但是通常這類觸發(fā)器在以后帶來的麻煩會多于其帶來的便利。還有一種解決方式是使用包含唯一索引的索引視圖與只有一個兩行的dummy table進行連接。

           假設(shè)你有如下兩個表,地區(qū)和辦事處

       

      Region表

         

      RegionId RegionName IsActive EffectiveDate ExpirationDate
      1 East 1 1/1/2009 NULL
      2 West 1 1/1/2009 NULL
      3 North 1 1/1/2009 NULL
      4 South 1 1/1/2009 NULL
      5 Antarctica 1 1/1/2009 NULL

       

      Office表

      RegionId RegionId OfficeName IsActive EffectiveDate ExpirationDate
      1 1 New York 1 1/1/2009 NULL
      2 2 Los Angeles 1 1/1/2009 NULL
      3 3 Minneapolis 1 1/1/2009 NULL
      4 4 Atlanta 1 1/1/2009 NULL
      5 5 Byrd Station 1 1/1/2009 NULL

       

      你如何保證活動的(IsActive=1)的Office只屬于活動的Region?

          上面提到的表需要某種參照完整性.RegionId是Office表的外鍵,Check約束保證了在ExpirationDate不為Null的情況下,永遠不會是1.但是我們?nèi)绾畏乐笽sActive的的Office屬于IsActive=0的Region呢?我們可以重新設(shè)計表或是使用Instead of觸發(fā)器,但更方便的做法是使用一個含有唯一索引的索引視圖與一個兩行的啞表進行連接。

       

      DuplicateRows table

          DuplicateRows表包含兩行,如下

      DuplicateRowIndex DuplicateRowValue
      1 Duplicate Row
      2 Duplicate Row

       

          對于這個表的唯一要求是這個表至少含有兩行,其結(jié)構(gòu)和內(nèi)容并不重要。這個表甚至也可以是只有一列的表并且每行的值不一樣。而我這里用這種方式命名是因為“Duplicate Row”這個名字看起來不容易產(chǎn)生混淆,并且這樣的命名也不會使得其它DBA刪除這個表。

       

      InvalidRegionIsInactiveButOfficeIsActiveView視圖

          業(yè)務(wù)規(guī)則是如果區(qū)域(Region)是不活動的,不能存在活動的辦事處(Office)與其關(guān)聯(lián)。換句話說,不能在屬于某個區(qū)域的辦事處還是active的情況下關(guān)閉這個區(qū)域,除非設(shè)置IsActive為0或是將這個辦事處分到其它區(qū)域(Region),下面的View顯示了顯示了Region的IsActive為0并且屬于它的offce的IsActive為1的例子。這違背了預(yù)設(shè)的業(yè)務(wù)規(guī)則.與dbo.DuplicateRows進行Cross Join是為了實現(xiàn)如果Where子句滿足條件,最少返回兩行。

      CREATE View dbo.InvalidRegionIsInactiveButOfficeIsActiveView With SchemaBinding
      
      As
      
      SELECT     dbo.Region.RegionId
      FROM       dbo.Region
      INNER JOIN dbo.Office
      ON         dbo.Region.RegionId = dbo.Office.RegionId
      CROSS JOIN dbo.DuplicateRows
      WHERE      dbo.Region.IsActive = Convert(bit, 0)
      AND        dbo.Office.IsActive = Convert(bit, 1)

          最后的畫龍點睛之筆是創(chuàng)建唯一索引,唯一索引是為了防止重復(fù)行,但是這個視圖與一個兩行的表進行Cross Join,這使得如果要返回結(jié)果,則返回一個兩行的結(jié)果.但這又違背了唯一索引,所以這種情況永遠不可能發(fā)生。

      CREATE UNIQUE CLUSTERED INDEX IX_RegionInvalidOfficeIsActiveView_RegionId ON dbo.InvalidRegionIsInactiveButOfficeIsActiveView
       (RegionId ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]


          最后的結(jié)果是不會違背業(yè)務(wù)規(guī)則。

       

      測試:關(guān)閉Antarctica區(qū)域

          總部的那幫家伙決定關(guān)閉Antarctica區(qū)域。下面語句在不顧與之關(guān)聯(lián)的Office的狀態(tài)的情況下設(shè)置Region的IsActive為0。

      UPDATE dbo.Region
       SET dbo.Region.IsActive  = Convert(bit, 0),
           dbo.Region.ExpirationDate = GetDate()
       WHERE dbo.Region.RegionName  = N'Antarctica'

          當(dāng)執(zhí)行后,發(fā)生如下錯誤:

      Msg 2601, Level 14, State 1, Line 1
      Cannot insert duplicate key row in object 'dbo.InvalidRegionIsInactiveButOfficeIsActiveView' with unique index 'IX_RegionInvalidOfficeIsActiveView_RegionId'. The duplicate key value is (5).


          在關(guān)閉Antarctica區(qū)域之前,Byrd Station辦事處必須設(shè)置成不活動的或者是分配給其它區(qū)域,因為我并不想解雇這個辦事處的任何人,所以我將這個辦事處分為了其它區(qū)域。

      UPDATE dbo.Office
       SET dbo.Office.RegionId = (SELECT dbo.Region.Regionid 
                                   FROM dbo.Region 
                                   WHERE dbo.Region.RegionName = N'South'
                                  )
       FROM dbo.Office
       WHERE dbo.Office.RegionId =(SELECT dbo.Region.Regionid
                                    FROM dbo.Region
                                    WHERE dbo.Region.RegionName = N'Antarctica'
                                   )

          一旦沒有任何活動的辦事處與Antarctica區(qū)域相關(guān)聯(lián),我就可以通過Update語句來關(guān)閉Antarctica區(qū)域了。

       

      如何在你的數(shù)據(jù)庫中實現(xiàn)這個技巧

          下面幾部幫助你在數(shù)據(jù)庫中實現(xiàn)這個技巧:

          1.創(chuàng)建dbo.DuplicateRows table表并插入兩條數(shù)據(jù)

          2.寫一個違反了業(yè)務(wù)規(guī)則并且還能返回結(jié)果的查詢

          3.在這個查詢中與dbo.DuplicateRows進行Cross Join

          4.創(chuàng)建一個包含SchemaBinding參數(shù)和上面查詢語句的視圖

          5.在視圖上創(chuàng)建唯一索引

       

      總結(jié)

          使用索引視圖和一個兩行的表進行連接或許并不是實現(xiàn)業(yè)務(wù)規(guī)則最有效的手段,但是使用了這種方法可以避免使用復(fù)雜的Instead of觸發(fā)器。假如微軟提供了“Before觸發(fā)器”使得違反業(yè)務(wù)規(guī)則的查詢在執(zhí)行之前就被取消的話,就不需要我這種手段了。上面的技巧可以看作是一個無奈的人實現(xiàn)的山寨版”before 觸發(fā)器”。

       

          原文鏈接:http://www.sqlservercentral.com/articles/Business+Rules/91924/

          Translated by:CareySon

      posted @ 2012-08-21 09:18  CareySon  閱讀(3471)  評論(8)    收藏  舉報
      主站蜘蛛池模板: 成全高清在线播放电视剧| 亚洲V天堂V手机在线 | 野外少妇被弄到喷水在线观看| 国产精品午夜福利小视频| 啊┅┅快┅┅用力啊岳网站| 国内熟妇与亚洲洲熟妇妇| 水蜜桃视频在线观看免费18| 成人一区二区不卡国产| 国产毛片三区二区一区| 337p日本欧洲亚洲大胆色噜噜| 国产成人av三级在线观看| 同德县| 亚洲天堂一区二区三区三州| 滦南县| 老太脱裤子让老头玩xxxxx| 爆乳女仆高潮在线观看| 亚洲免费的福利片| 青青青青久久精品国产| 国产欧美国日产高清| 亚洲岛国av一区二区| 日韩人妻无码精品久久| av在线播放观看国产| 中文国产日韩欧美二视频| 国产真实乱对白精彩久久老熟妇女| 国产在线国偷精品免费看| 男女做爰真人视频直播| 视频一区二区三区四区五区| 国产亚洲色视频在线| 免费无码又爽又刺激高潮虎虎视频| 精品人妻伦九区久久69| 国产免费又黄又爽又色毛| 国产精品久久久久鬼色| 熟女精品视频一区二区三区| 午夜福利看片在线观看| 国产一区二区日韩在线| 大胆欧美熟妇xxbbwwbw高潮了| 国产一区二区三区的视频| 久久午夜无码鲁丝片午夜精品| 无人去码一码二码三码区| 67194熟妇在线观看线路| 色狠狠色噜噜AV一区|