新手學SQL Server 2012「自主資料庫(Contained Database)」(2)

by Derrick 19. 六月 2012 12:01

前言

在前一篇文章中,介紹了在伺服器層級上啟用自主資料庫驗證、建立自主資料庫、在自主資料庫上建立有密碼的SQL使用者以及使用具有密碼的自主資料庫之使用者來登入系統等主題。

在本期文章內,我們將繼續討論在「自主資料庫」上撰寫Transact-SQL陳述式、定序與自主資料庫之間關係討論、備份自主資料庫、還原自主資料庫等主題。

實作練習二:在「自主資料庫」上撰寫Transact-SQL陳述式


任務一:查詢編輯器與自主資料庫


步驟01. 在SSMS工具,點選上方工具選單的「檔案」\「新增」,選擇「Database Engine查詢」。設定連線到先前建立的「自主資料庫」。可以參考先前實作練習一:建立「自主資料庫」--任務四:使用具有密碼的自主資料庫之使用者來登入系統,步驟01~03。

步驟02. 若要檢視或是變更資料庫層級的屬性,可以使用Transact-SQL陳述式,請參考以下的範例程式碼,以及下圖所示:

EXEC sp_helpdb 'ContainedDB01'
GO
--
SELECT * FROM sys.databases
GO

範例程式碼5:登入到自主資料庫內,查詢資料庫相關屬性

16_僅能看到自主資料庫與master、tempdb資料庫 [1]

圖16:僅能檢視到自主資料庫、master與tempdb系統資料庫

在圖16中,可以觀察到:無法看到其他資料庫的相關資訊,僅能查詢到「自主資料庫」本身,以及系統資料庫:master、tempdb。

經過測試:

  • 登入到「自主資料庫」上,在「查詢編輯器」內的Intellisense功能也無法使用。
  • 在其他的使用者資料庫上,若事先有啟動資料庫使用者:guest。身處在「自主資料庫」內,是無法直接使用檢視:sys.databases來瀏覽到其他使用者資料庫的屬性資料。但仍可以使用USE指令碼來登入到此資料庫,或是,使用多部分名稱的方式來存取其此資料庫內的物件(前提,仍是需要有權限)。

步驟03. 以下提供幾個變更「自主資料庫」的相關屬性之Transact-SQL陳述式,請參考以下的範例程式碼,以及下圖所示:

-- 01_變更資料庫的相容性層為:90,以及變更資料庫屬性為:唯讀,僅能讀取資料。
ALTER DATABASE CURRENT
    SET COMPATIBILITY_LEVEL=90, READ_ONLY;
GO
-- 02_查詢先前所變更的資料庫屬性
SELECT name N'資料庫',containment_desc N'內含項目狀態', is_read_only N'資料庫是唯讀', compatibility_level N'相容性層級'
FROM sys.databases
GO
-- 03_變更資料庫屬性為:讀寫,能夠執行讀寫作業
ALTER DATABASE CURRENT
    SET READ_WRITE;
GO
-- 04_變更資料庫的相容性層為:110
ALTER DATABASE CURRENT
    SET COMPATIBILITY_LEVEL=110;
GO
-- 05_查詢先前所變更的資料庫屬性
SELECT name N'資料庫',containment_desc N'內含項目狀態', is_read_only N'資料庫是唯讀', compatibility_level N'相容性層級'
FROM sys.databases
GO

範例程式碼6:變更自主資料庫的相關屬性

17_變更自主資料庫的相關屬性 [1]

圖17:變更自主資料庫的相關屬性

在範例程式碼6中,在ALTER DATABASE陳述式後面,無需輸入「自主資料庫」的名稱,而是使用關鍵字:CURRENT,用來指定改變目前正在使用中的資料庫。

在03部分,若是資料庫已經是被設定為:唯讀,則需要先解除其唯讀屬性後,才能繼續執行其他資料庫屬性的變更作業。若要變更「資料庫相容性」,並不會影響到「自主資料庫」。

但若是已經使用「有密碼的SQL使用者」方式來登入到「自主資料庫」內,嘗試變更「自主資料庫」回復為一般資料庫,或是想要更改資料庫的名稱,則可能會遭遇到以下的錯誤訊息,請參考以下的範例程式碼,以及下圖所示:

-- 01_變更自主資料庫為一般資料庫
ALTER DATABASE CURRENT
    SET CONTAINMENT=NONE;
GO
/*
訊息 33233,層級 16,狀態 1,行 1
您只能在自主資料庫中建立有密碼的使用者。
訊息 5069,層級 16,狀態 1,行 1
*/
-- 02_變更自主資料庫的名稱
ALTER DATABASE CURRENT
    MODIFY NAME =[ContainedDB02];
GO
/*
ALTER DATABASE 陳述式失敗。
訊息 5011,層級 14,狀態 2,行 2
使用者沒有改變資料庫 'ContainedDB01' 的權限、該資料庫不存在,或資料庫不是處於允許存取檢查的狀態。
*/

範例程式碼7:變更自主資料庫為一般資料庫或更改其資料庫名稱都失敗

18_變更自主資料庫為一般資料庫或更改其資料庫名稱都失敗 [1]

圖18:變更自主資料庫為一般資料庫或更改其資料庫名稱都失敗

在圖18中,可以觀察到:已經使用「有密碼的SQL使用者」方式來登入到「自主資料庫」內,是無法變更回一般資料庫或是修改資料庫名稱。若需要變更這些屬性,請改以連線到執行個體層級後,就可以變更這些資料庫層級的屬性。

任務二:在自主資料庫內撰寫Transact-SQL陳述式


步驟01. 基本上,在「自主資料庫」上設計與撰寫Transact-SQL陳述式時,都應該以設計存取此資料庫的資源為主。

若有需要存取到其他資料庫內的資源,都會導致無法執行,請參考以下的範例程式碼,以及下圖所示:

-- 01_建立使用者預存程序:up_cd1
-- 跨越到資料庫:Northwind來存取資料表:Orders
CREATE PROCEDURE up_cd1
AS
    SELECT * FROM Northwind.dbo.Orders
GO
-- 02_建立使用者預存程序:up_cd2
-- 巢狀式的使用者預存程序:呼叫執行使用者預存程序:up_cd1
CREATE PROCEDURE up_cd2
AS
    EXEC up_cd1
GO
-- 03_執行使用者預存程序:up_cd1
EXEC up_cd1
GO
/*
訊息 916,層級 14,狀態 1,程序 up_cd1,行 3
伺服器主體 "S-1-9-3-77694123-1156758497-3090963348-3818626044." 在目前的安全性內容下無法存取資料庫 "Northwind"。
*/
-- 04_執行巢狀式的使用者預存程序:up_cd2
EXEC up_cd2
GO
/*
訊息 916,層級 14,狀態 1,程序 up_cd1,行 3
伺服器主體 "S-1-9-3-77694123-1156758497-3090963348-3818626044." 在目前的安全性內容下無法存取資料庫 "Northwind"。
*/
-- 05_查詢橫跨資料庫:Northwind來存取資料表:Orders
SELECT * FROM Northwind.dbo.Orders
GO
/*
訊息 916,層級 14,狀態 1,行 1
伺服器主體 "S-1-9-3-77694123-1156758497-3090963348-3818626044." 在目前的安全性內容下無法存取資料庫 "Northwind"。
*/
-- 06_刻意查詢不存在的資料表
SELECT * FROM Northwind.dbo.xxx
GO
/*
訊息 208,層級 16,狀態 1,行 1
無效的物件名稱 'Northwind.dbo.xxx'。
*/

範例程式碼8:建立使用者預存程序以及查詢資料表

19_無法查詢其他資料庫的資料表 [1]

圖19:無法查詢其他資料庫的資料表

在範例程式碼8中,在01~04中,我們建立了兩個使用者預存程序:up_cd1與up_cd2,一個跨越到資料庫:Northwind來查詢資料表:Orders,另一個設計為巢狀式的使用者預存程序:呼叫執行使用者預存程序:up_cd1。分別執行這兩個使用者預存程序,都是會失敗且無法執行。

在05~06中,刻意跨越資料庫但卻去查詢不存在的資料表,可以看到回傳的錯誤訊息是:無效的物件名稱,這表示系統是真的有去執行剖析此物件是否存在。

若是要使用到系統資料庫內的特定物件,可能會無法存取,請參考以下的範例程式碼以及下圖所示:

-- 01_執行一般擴充預存程序:xp_cmdshell
EXEC xp_cmdshell 'dir *.*'
GO
/*
錯誤訊息1:
訊息 229,層級 14,狀態 5,程序 xp_cmdshell,行 1
結構描述 'sys',資料庫 'mssqlsystemresource',物件 'xp_cmdshell' 沒有 EXECUTE 權限。
*/
/*
錯誤訊息2:
訊息 15281,層級 16,狀態 1,程序 xp_cmdshell,行 1
SQL Server 已封鎖元件 'xp_cmdshell' 的 程序 'sys.xp_cmdshell' 之存取,因為此元件已經由此伺服器的安全性組態關閉。
系統管理員可以使用 sp_configure 來啟用 'xp_cmdshell' 的使用。
如需有關啟用 'xp_cmdshell' 的詳細資訊,請在《SQL Server 線上叢書》中搜尋 'xp_cmdshell'。
*/

範例程式碼9:執行一般擴充預存程序:xp_cmdshell,執行失敗

20_執行一般擴充預存程序:xp_cmdshell [1]

圖20:無法一般擴充預存程序:xp_cmdshell

在範例程式碼9中,若是使用「有密碼的SQL使用者」方式來登入到「自主資料庫」內,執行一般擴充預存程序:xp_cmdshell,會遭遇到「錯誤訊息1」。而「錯誤訊息2」則是尚未啟用介面區組態的設定之錯誤訊息。這是因為此xp_cmdshell需要CONTROL SERVER權限來執行。

SQL Server提供了一個動態管理檢視:sys.dm_db_uncontained_entities,可以用來顯示資料庫內有哪些物件是屬於非自主的,也就是為跨越「自主資料庫」中的資料庫界限之物件。但要注意的是:如果模組多次跨越資料庫界限,只會回報其第一次已發現的跨越物件,請參考以下的範例程式碼以及下圖所示:

SELECT OBJECT_NAME(major_id) N'物件名稱', *
FROM sys.dm_db_uncontained_entities

範例程式碼10:動態管理檢視:sys.dm_db_uncontained_entities

21_3_查詢是否有跨越「自主資料庫」的物件

圖21:查詢是否有跨越「自主資料庫」的物件

在圖21中,可以觀察第一筆記錄,系統是有偵測到:使用者預存程序:up_cd1,但巢狀式使用者預存程序:up_cd2就沒有被偵測到。第二筆記錄,系統是偵測到:ROUTE(路由),這是Service Broker所使用的路由表物件,這不影響其他資料庫物件的運作。

這些被動態管理檢視:sys.dm_db_uncontained_entities所偵測到物件,都是在「自主資料庫」內無法使用的物件。

任務三:定序與自主資料庫


「定序」是會影響文字資料的排序次序和相等語意,包括區分大小寫、區分腔調字和使用的基底語言。「定序」不只會套用至儲存在使用者資料表中的資料,還會套用至執行個體上所處理的所有文字,這包括:中繼資料、暫存物件、變數名稱等。所以,在開發「自主資料庫」與「非自主資料庫」上,「定序」的設計,這也是需要留意的事情。

在SQL Server上,「定序」在不同的層級上,有著不同的類型與意義。請參考以下的分類:

  • 在非自主資料庫模型中,有三種不同的定序類型:「執行個體定序(Instance collation)」、「資料庫定序(Database collation)」以及「tempdb 定序(tempdb collation)」。
  • 「自主資料庫」則是使用兩種定序:資料庫定序以及新的「目錄定序(catalog collation)」。

使用的「自主資料庫」目的在於讓資料庫能夠獨立存在,不受到執行個體層級的依存影響,所以,必須切斷執行個體和 tempdb 定序的相依性。因此,在「自主資料庫」上導入了「目錄定序」的概念。此「目錄定序」是用於系統的中繼資料以及暫存中繼資料等物件上。

目前在「自主資料庫」上,「目錄定序」是固定組態為:Latin1_General_100_CI_AS_WS_KS_SC,以下為各個縮寫字的意義:Latin1-General-100, case-insensitive, accent-sensitive, kanatype-sensitive, width-sensitive, supplementary characters,不區分大小寫、區分腔調字、區分假名、區分全半形與使用補充字元。也就是說,對於任何一個「自主資料庫」而言,其「目錄定序」都是一樣,而且是無法修改的。

舉個例子來說,在「自主資料庫」內,建立的物件名稱就必須要遵循「目錄定序」的組態,簡單講,其名稱是不區分大小寫的。請參考以下的範例程式碼,與下圖所示:

USE ContainedDB01
GO
-- 01_在「自主資料庫」內,建立名稱相同,但是大小寫不同的暫存資料表
CREATE TABLE #t1
(sid int)
GO
CREATE TABLE #T1
(sid int)
GO
/*
訊息 2714,層級 16,狀態 6,行 1
資料庫中已經有一個名為 '#T1' 的物件。
*/
-- 01_在「自主資料庫」內,建立名稱相同,但是大小寫不同的變數
DECLARE @v1 int=1
DECLARE @V1 int=1
/*
訊息 134,層級 15,狀態 1,行 2
變數名稱 '@V1' 已經宣告。變數名稱在一個查詢批次或預存程序內必須是唯一的。
*/

範例程式碼11:自主資料庫內的中繼資料,使用「目錄定序」

在範例程式碼11中,由於在「自主資料庫」內的中繼資料以及暫存中繼資料,都是使用「目錄定序」。所以若是建立了相同名稱,但是其大小寫不同的暫存資料表或是變數等,這些都是違反「目錄定序」的規定,無法建立這些物件。

反之,假若tempdb系統資料庫的「定序」,例如是:Chinese_Taiwan_Stroke_BIN,而且,此範例程式碼11不是在「自主資料庫」執行,就可以正常運作。

22_自主資料庫內的中繼資料,使用「目錄定序」 [1]

圖22:自主資料庫內的中繼資料,使用「目錄定序」,是不區分大小寫

雖然,「資料庫定序」仍是有保留下來,但是只當做使用者資料的預設「定序」來使用。依據預設值,「資料庫定序」會是與model系統資料庫一樣,但是使用者可透過CREATE或是ALTER DATABASE陳述式加以變更,就如同修改「非自主資料庫」一樣的作法。

此外,在使用COLLATE子句上,新增加了關鍵字:CATALOG_DEFAULT。在「自主資料庫」與「非自主資料庫」上,這個關鍵字是用來表示中繼資料目前所使用的「定序」。也就是說,在「非自主資料庫」中,關鍵字:CATALOG_DEFAULT將會是傳回目前資料庫的「定序」。但是在「自主資料庫」上,「資料庫定序」和「目錄定序」,這兩種卻有可能是不一樣的。

請參考以下的表格,來說明在「自主資料庫」與「非自主資料庫」內的各項物件,其所使用的「定序」行為:

項目

非自主資料庫

自主資料庫

使用者資料(預設值)

DATABASE_DEFAULT

DATABASE_DEFAULT

暫存資料(預設值)

TempDB 定序

DATABASE_DEFAULT

中繼資料

DATABASE_DEFAULT / CATALOG_DEFAULT

CATALOG_DEFAULT

暫存中繼資料

tempdb定序

CATALOG_DEFAULT

變數

執行個體定序

CATALOG_DEFAULT

Goto標籤

執行個體定序

CATALOG_DEFAULT

資料指標名稱

執行個體定序

CATALOG_DEFAULT

表1:查詢是否有跨越「自主資料庫」的物件

步驟01. 執行SSMS管理工具,請先以伺服器角色:sysadmin成員登入到執行個體,執行以下的範例程式碼,變更資料庫層級的定序,請參考下圖所示:

-- 01_修改自主資料庫:ContainedDB01的定序為:Chinese_Taiwan_Bopomofo_CI_AS
USE [master]
GO
ALTER DATABASE [ContainedDB01]
    COLLATE Chinese_Taiwan_Bopomofo_BIN
GO

-- 02_查詢各個資料庫的「預設定序(defCault collation)」
SELECT name N'資料庫', collation_name N'預設定序'
FROM sys.databases
GO

範例程式碼12:變更資料庫層級的定序

23_查詢各個資料庫的定序 [1]

圖23:查詢各個資料庫的定序


在圖23中,可以觀察到「自主資料庫」所使用的「定序」是:Chinese_Taiwan_Bopomofo_CI_AS,明確與tempdb系統資料庫、Northwind資料庫是不同的。

步驟02. 以下的範例程式碼,將討論:「非自主資料庫」、tempdb系統資料庫以及暫存資料表之間的關係,並請參考下圖所示:

 

-- 01_在資料庫:Northwind,建立暫存資料表:#Customers01,沒有指定其定序
USE Northwind
GO
--
CREATE TABLE #Customers01
( CustomerID nchar(5), ContactName nvarchar(30), Phone nvarchar(24) )
GO
-- 02_使用暫存資料表來執行資料表聯結,產生錯誤,因為Tempdb系統資料庫與使用者資料庫,兩者所使用的定序是不同
SELECT *
FROM Northwind.dbo.Orders O INNER JOIN #Customers01 C
ON O.CustomerID =C.CustomerID
GO
/* 錯誤訊息
訊息 468,層級 16,狀態 9,行 3
無法解析 equal to 作業中 "Chinese_Taiwan_Stroke_BIN" 與 "Chinese_Taiwan_Stroke_CI_AS" 之間的定序衝突。
 
Msg 468, Level 16, State 9, Line 3
Cannot resolve the collation conflict between ""Chinese_Taiwan_Stroke_BIN"" and "Chinese_Taiwan_Stroke_CI_AS" in the equal to operation.
*/
-- 03_刪除暫存資料表:#Customers01
DROP TABLE #Customers01
GO

範例程式碼13:在「非自主資料庫」上,建立暫存資料表,執行資料表聯結

24_非自主資料庫與tempdb系統資料庫的定序不同,導致資料表聯結失敗 [1]

圖24:非自主資料庫與tempdb系統資料庫的定序不同,建立暫存資料表,導致資料表聯結失敗

在範例程式碼13中,因為資料庫:Northwind與tempdb系統資料庫的定序是不同的,而所建立的暫存資料表,是依據tempdb系統資料庫的「定序」,所以在執行資料表聯結時,將會因為「定序」不同,導致失敗。若要解決上述的問題,可能的處理方式,請以下的範例程式碼:

USE Northwind
GO
--(1) 修改暫存資料表的「定序」,使用 COLLATE database_default
CREATE TABLE #Customers01
( CustomerID nchar(5) COLLATE database_default
, ContactName nvarchar(30), Phone nvarchar(24) )
GO
--(2) 修改暫存資料表的「定序」,使用 COLLATE Chinese_Taiwan_Stroke_CI_AS
CREATE TABLE #Customers01
( CustomerID nchar(5) COLLATE Chinese_Taiwan_Stroke_CI_AS
, ContactName nvarchar(30), Phone nvarchar(24) )
GO
--(3) 使用 COLLATE DATABASE_DEFAULT:使 COLLATE 子句來使用目前資料庫的定序。
SELECT *
FROM Northwind.dbo.Orders O INNER JOIN #Customers01 C
ON O.CustomerID =C.CustomerID COLLATE DATABASE_DEFAULT
GO
--(4) 使用 COLLATE 子句,轉換為定序為:Chinese_Taiwan_Stroke_CI_AS
SELECT *
FROM Northwind.dbo.Orders O INNER JOIN #Customers01 C
ON O.CustomerID =C.CustomerID COLLATE Chinese_Taiwan_Stroke_CI_AS
GO

範例程式碼14:可能的處理方式:非自主資料庫與tempdb系統資料庫的定序不同時

在範例程式碼14中,多半是建議使用以關鍵字:COLLATE DATABASE_DEFAULT,來使用目前資料庫的「定序」之作法。

步驟03. 以下的範例程式碼,將討論:「自主資料庫」以及暫存資料表之間的關係:

-- 01_在「自主資料庫」內,建立範例資料表:Orders,使用「定序」:Chinese_Taiwan_Stroke_BIN,與自主資料庫的資料庫定序一樣。
USE ContainedDB01
GO
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Orders]') AND type in (N'U'))
DROP TABLE [dbo].[Orders]
GO
CREATE TABLE [dbo].[Orders]
(
    [OrderID] [int] IDENTITY(1,1) NOT NULL,
    [CustomerID] [nchar](5) COLLATE Chinese_Taiwan_Stroke_BIN NULL
)
GO
-- 02_在「自主資料庫」上所建立的「暫存資料表」,使用「資料庫定序」:#Customers01
CREATE TABLE #Customers01
( CustomerID nchar(5), ContactName nvarchar(30), Phone nvarchar(24) )
GO
-- 03_在「自主資料庫」上所建立的「暫存資料表」,卻刻意設定資料行的「定序」為:SQL_Latin1_General_CP1_CI_AS:#Customers02
CREATE TABLE #Customers02
( CustomerID nchar(5) COLLATE SQL_Latin1_General_CP1_CI_AS, ContactName nvarchar(30), Phone nvarchar(24) )
GO
-- 04_在「自主資料庫」內,暫存資料表使用的是「資料庫定序」,所以可正確執行資料表聯結
SELECT *
FROM Orders O INNER JOIN #Customers01 C
ON O.CustomerID =C.CustomerID
GO
-- 05_資料行的「定序」與「資料庫定序」是不一樣的,執行資料表聯結失敗
SELECT *
FROM Orders O INNER JOIN #Customers02 C
ON O.CustomerID =C.CustomerID
GO
/* 錯誤訊息:
訊息 468,層級 16,狀態 9,行 1
無法解析 equal to 作業中 "SQL_Latin1_General_CP1_CI_AS" 與 "Chinese_Taiwan_Stroke_BIN" 之間的定序衝突。
*/
-- 06_加入使用關鍵字:COLLATE DATABASE_DEFAULT
SELECT *
FROM Orders O INNER JOIN #Customers02 C
ON O.CustomerID =C.CustomerID  COLLATE DATABASE_DEFAULT
GO

範例程式碼15:自主資料庫與暫存資料表,執行資料表聯結

在範例程式碼15中,我們建立了兩個暫存資料表:#Customers01與#Customers02。在04中,在「自主資料庫」內,建立的暫存資料表之「暫存資料」是使用預設的「資料庫定序」,所以可以正確的執行資料表聯結作業。

但是在05中,在建立暫存資料表時,卻刻意設定資料行的「定序」為:SQL_Latin1_General_CP1_CI_AS,這會導致資料行的「定序」與「資料庫定序」是不一樣的,因此,資料表聯結會執行失敗。延續05,所以在06中,加入了使用關鍵字:COLLATE DATABASE_DEFAULT,使用目前的「資料庫定序」,就可以解決這類的問題。



實作練習三:搬移「自主資料庫」

在過去,若是要搬移資料庫到另外一個「執行個體」上,需要面對不少的挑戰,其中之一就是「執行個體」層級與資料庫之間的耦合關係,例如:「執行個體」層級的屬性設定,登入帳戶的建立等。對於資料庫管理師或是應用程式設計師而言,在將資料庫搬移到新的「執行個體」後,都必須要確保前述的這些設定都是一致的,而且還要建立相同的登入帳戶。若是要將「自主資料庫」搬移到另外一個「執行個體」上,將可以縮減這些管理作業的負擔。

準備工作:


1.    準備兩套執行個體,例如:SQL2012與SQL2012\I2。
2.    建立資料夾:C:\myAdmin\Device、C:\myAdmin\I2。

任務一:備份自主資料庫


步驟01. 使用SSMS管理工具,備份先前所建立的「自主資料庫」:ContainedDB01。或是執行以下的範例程式碼來執行備份資料庫的作業:

USE master
GO
BACKUP DATABASE [ContainedDB01]
    TO  DISK = N'C:\myAdmin\Device\ContainedDB01.bak'
WITH INIT,  NAME = N'ContainedDB01-完整 資料庫 備份'
GO

範例程式碼16:備份自主資料庫

任務二:在執行個體上啟用自主資料庫驗證


步驟01. 請參考在「實作練習一:建立「自主資料庫」中的任務一:在伺服器層級上啟用自主資料庫驗證」來啟用自主資料庫驗證。

任務三:還原自主資料庫


步驟01. 使用SSMS管理工具,連線登入到「執行個體」:SQL2012\I2,執行還原資料庫作業,或是執行以下的範例程式碼來執行還原資料庫的作業:

USE [master]
RESTORE DATABASE [ContainedDB01]
    FROM  DISK = N'C:\myAdmin\Device\ContainedDB01.bak'
    WITH  FILE = 1, REPLACE,
    MOVE N'ContainedDB01' TO N'C:\myAdmin\I2\ContainedDB01.mdf', 
    MOVE N'ContainedDB01_log' TO N'C:\myAdmin\I2\ContainedDB01_log.ldf'
GO

範例程式碼17:還原自主資料庫

若是事先未在「執行個體」上啟用「自主資料庫驗證」,在還原資料庫時,將遭遇到以下的錯誤訊息,請參考下圖所示:

 

訊息 12824,層級 16,狀態 1,行 2
必須將 sp_configure 值「自主資料庫驗證」設為 1,才能還原自主資料庫。您必須使用 RECONFIGURE 設定 value_in_use。
訊息 3013,層級 16,狀態 1,行 2
RESTORE DATABASE 正在異常結束。

25_還原資料庫失敗 [1]

圖25:尚未啟用「自主資料庫驗證」,導致還原失敗

任務四:登入到自主資料庫


步驟01. 請參考在實作練習一:建立「自主資料庫」中的任務四:使用具有密碼的自主資料庫之使用者來登入系統,確認可以登入此「自主資料庫」。

結語


在本期文章中,介紹了在「自主資料庫」上撰寫Transact-SQL陳述式、定序與自主資料庫之間關係討論、備份自主資料庫、還原自主資料庫等主題。

Tags:

SQL Server資料庫 | 陳俊宇Derrick Chen

新增評論




  Country flag
biuquote
  • 評論
  • 線上預覽
Loading






NET Magazine國際中文電子雜誌

NET Magazine國際中文電子版雜誌,由恆逸資訊創立於2000,自發刊日起迄今已發行超過500篇.NET相關技術文章,擁有超過40000名註冊讀者群。NET Magazine國際中文電子版雜誌希望藉於電子雜誌與NET Developer達到共同學習與技術新知分享,歡迎每一位對.NET 技術有興趣的朋友們多多支持本雜誌,讓作者群們可以有持續性的動力繼續爬文。<請加入免費訂閱>

月分類Month List