Sql-Server

在更改量非常少的大型數據庫上創建具有列名別名或硬更改列名的視圖?

  • September 13, 2017

背景:

我必須使用 SQL Server Express 2012 伺服器上的大型企業地理數據庫,其中包含大約 170 個表,其中許多表有 10 多列。一些列名是重複的,例如FEAT_IDGEOM,這意味著很多表具有相同名稱的列名。

我公司訪問這些大數據庫的應用程序不支持列名長度> 31。所有170個表中只有兩個擁有一個列名不符合要求的列(因此總共有兩個列名)。我必須縮短這兩個列名。我想這可以通過引入別名來完成。因此,對大型數據庫來說,這是一個非常小的變化。下面是第一個有問題的表。此表中有問題的列名是 FT_ADDRESS_AREA_BOUNDARY_ELEMENT,因為它的長度是 32

USE [foo]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE TABLE [foo].[baron](
[FEAT_ID] [uniqueidentifier] NOT NULL,
[FT_ROAD_ELEMENT] [bit] NOT NULL,
[FT_FERRY_ELEMENT] [bit] NOT NULL,
[FT_ADDRESS_AREA_BOUNDARY_ELEMENT] [bit] NOT NULL,
[FT_RAILWAY_ELEMENT] [bit] NOT NULL,
[COUNTRY_LEFT] [nvarchar](3) NULL,
[COUNTRY_RIGHT] [nvarchar](3) NULL,
[CENTIMETERS] [numeric](9, 0) NOT NULL,
[POSITIONAL_ACCURACY] [numeric](1, 0) NULL,
[ADA_COMPLIANT] [bit] NOT NULL,
[GEOM] [geometry] NOT NULL,
CONSTRAINT [PK_baron] PRIMARY KEY CLUSTERED 
(
[FEAT_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO 

下面是第二個有問題的表,其列名 MAIN_OF_DETAILED_POSTAL_POINT_ID 過長:

USE [foo]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [foo].[baroness](
   [FEAT_ID] [uniqueidentifier] NOT NULL,
   [FEAT_TYPE] [numeric](5, 0) NOT NULL,
   [NAME] [nvarchar](254) NULL,
   [LANG_CODE] [nvarchar](3) NULL,
   [COUNTRY] [nvarchar](3) NULL,
   [POSTAL_CODE] [nvarchar](254) NULL,
   [NOTATION] [numeric](2, 0) NULL,
   [ISO_SCRIPT] [nvarchar](4) NULL,
   [MAIN_OF_DETAILED_POSTAL_POINT_ID] [uniqueidentifier] NULL,
   [POSTAL_DELIVERY_TYPE] [nvarchar](1) NULL,
   [POSTAL_POINT_TYPE] [numeric](1, 0) NULL,
   [NC_MAIN] [nvarchar](254) NULL,
   [NC_MAIN_OFFSET] [numeric](1, 0) NULL,
   [NC_SUB] [nvarchar](254) NULL,
   [NC_SUB_OFFSET] [numeric](3, 0) NULL,
   [GEOM] [geometry] NULL,
CONSTRAINT [PK_baroness] PRIMARY KEY CLUSTERED 
(
   [FEAT_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

ALTER TABLE [foo].[baroness]  WITH CHECK ADD  CONSTRAINT [FK_Postal_Point_MAIN_OF_DETAILED_POSTAL_POINT_ID_2_Postal_Point] FOREIGN  KEY([MAIN_OF_DETAILED_POSTAL_POINT_ID])
REFERENCES [foo].[baroness] ([FEAT_ID])
GO

ALTER TABLE [foo].[baroness] CHECK CONSTRAINT [FK_Postal_Point_MAIN_OF_DETAILED_POSTAL_POINT_ID_2_Postal_Point]
GO

問題:

是否值得創建一個視圖(或多個?)或者我應該只是“硬更改”這兩列並適當地跟踪它?我對視圖完全沒有經驗。當我嘗試使用 Microsoft SQL Server Management Studio 創建適當的視圖時,我收到一條錯誤消息,指出列名應該是唯一的。創建視圖時是否必須為整個數據庫中的每個重複列名創建別名?我是否應該創建一個僅包含兩個已更改表和一個與數據庫其餘部分的視圖並將它們合併?我還可以想像,如果我創建一個必須一次選擇整個數據庫的視圖,性能會受到影響。

以下是基於在許多不同應用程序使用大量數據庫的環境中工作的兩個建議。

選項 1: 創建一個名稱相似但反映您想要進行的更改的視圖。在您的情況下,它只是一個重命名的欄位。您可能必須在視圖上創建觸發器,以便執行 DML 的應用程序可以像使用原始表一樣使用它。

公開視圖名稱並鼓勵應用程序開發人員更改他們的程式碼以使用視圖而不是表格。您希望唯一需要的更改是表的名稱以及通過視圖傳播的任何更改(欄位的新名稱)。他們可以或多或少地“隨意”進行更改,因為原始表仍然像以前一樣工作。當然,你會給他們一個最後期限來完成這項工作。

當所有應用程序更改都已完成(並驗證)後,您可以真正認為自己完成了。我鼓勵一個只向應用程序公開視圖而不是實體表的系統。這允許更多的自由來對錶格進行必要的更改並更改視圖,以便應用程序看起來一切都一樣。

但是,如果您願意,重命名表中的欄位,當然,經過廣泛測試後,通知應用程序開發人員將“表”名稱更改回原始名稱。

測試並完成。如果您願意,可以刪除視圖或保留它們。

選項 2: 另一種方法是重命名表並使用原始表名創建視圖。然後需要立即更改所有應用程序以使用新欄位名稱。使系統重新聯機後進行徹底測試。

接下來,根據需要更改表並進行測試。然後反轉該過程——重命名(或刪除)視圖並將更改後的表重命名為原始名稱。測試並(希望)完成。

引用自:https://dba.stackexchange.com/questions/185690