我的目標是創建一個存盤程序來生成新的 GUID NEWSEQUENTIALID,然后可以在將資料插入同一資料庫中的不同表時使用它。例如,它就像這個StackOverflow 答案中描述的存盤程序。
因此,我的問題是:在創建這樣的存盤程序并使用它生成的用于插入不同表的 GUID 時是否有任何負面、缺點或問題?
例如,生成這樣的 GUID 會是非原子的并導致重復的 GUID 值嗎?或者,例如,生成的 GUID 是否NEWSEQUENTIALID()保證僅對于生成它的表是唯一的,因此不適合在另一個表中重用?
換句話說,即使這樣的實作可能是一個雜項,生成這樣的 GUID 是否“安全”?
我能夠找到的唯一潛在問題在之前鏈接的 NEWSEQUENTIALID檔案中進行了描述:
-
如果擔心隱私,請不要使用此功能。可以猜測下一個生成的 GUID 的值,因此可以訪問與該 GUID 關聯的資料。
-
UuidCreateSequential 函式具有硬體依賴性。在 SQL Server 上,當資料庫(例如包含的資料庫)移動到其他計算機時,可以形成順序值的集群。使用 Always On 和 SQL 資料庫時,如果資料庫故障轉移到另一臺計算機,則可能會形成順序值集群。
從UuidCreateSequential檔案中:
-
在這種情況下,生成的 UUID 是一個有效的識別符號,并且保證在計算機上生成的所有 UUID 中是唯一的。但是,可能存在另一臺沒有以太網/令牌環地址的計算機生成相同的 UUID。因此,您永遠不應使用此 UUID 來識別并非嚴格本地計算機的物件。具有以太網/令牌環地址的計算機生成保證全球唯一的 UUID。
就我的目的而言,#1 中描述的隱私問題可以忽略不計。我認為關注點#2 和#3 也可以忽略不計,因為將插入 GUID 的表位于將生成 GUID 的同一資料庫中。
uj5u.com熱心網友回復:
那應該沒問題。但是您可以像這樣簡化生成程序:
CREATE OR ALTER PROCEDURE GenerateNewSequentalId @id as uniqueidentifier OUTPUT
AS
BEGIN
set nocount on;
declare @returnid table (id uniqueidentifier);
declare @test table(id uniqueidentifier default newsequentialid());
INSERT INTO @test
output inserted.id into @returnid
default values;
select @id = r.id from @returnid r;
END
GO
/* Test the Procedure */
declare @myid uniqueidentifier
exec GenerateNewSequentalId @myid output
select @myid
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/476639.html
