创建数据库脚本,其中表已跨环境预填充数据

Create database scripts where tables have prepopulated data across environment

我有一个名为“[UserTypes]”的 table,其中主要 ID 是 [uniqueidentifier]。我在另一个名为“[Users]”的 table 中有一个参考。 Users table 有 UserTypeId 作为外键。

CREATE TABLE [UserTypes] (
    [Id] [uniqueidentifier] DEFAULT NEWID() PRIMARY KEY,
    [UserName] [varchar](100) NOT NULL,
    [UserCD] [varchar](40) NOT NULL
GO

INSERT INTO [dbo].[UserTypes]
           ([UserName], [UserCD])
     VALUES
           ('Administrator','ADMI'), 
           ('NonPrimary','NONP'),
GO

-- ID got generated in [UserTypes] is '80D1EEE7-0BCC-48A7-A741-29A1D8B6E580' for 'ADMI'

CREATE TABLE [Users] (
    [Id] [uniqueidentifier] DEFAULT NEWID() PRIMARY KEY,
    [UserTypeId] [uniqueidentifier] NOT NULL,
    [UserName] [varchar](100) NOT NULL, 
    CONSTRAINT Users_UserTypeId_UserType_Id FOREIGN KEY (UserTypeId)
    REFERENCES UserTypes(Id))
GO

INSERT INTO [dbo].[Users]
           ([UserTypeId], [UserName])
     VALUES
           ('80D1EEE7-0BCC-48A7-A741-29A1D8B6E580','Kushal Seth')
GO

'80D1EEE7-0BCC-48A7-A741-29A1D8B6E580' 是来自 Table 的 'ADMI' 的 userTypeId。

我的问题是,假设我需要在一个新的数据库中运行这个脚本,那么我的'ADMI'的ID在'UserTypes' table。并且脚本将在插入 'Users' table.

时抛出错误

我有一个选择是声明变量和 select 来自 UserType Table 的 ID 并分配给这个变量,然后在 [Users] [=32] 的插入查询中使用它=].

这是唯一的方法吗?或者有没有更好的方法来设计这样的 tables。任何设计建议将不胜感激。

Suppose, I need to run this script in a new DB, then my ID for 'ADMI' will be different in 'UserTypes' table.

因此从 UserTypes 中删除 Guid PK,并使 'UserCD' 成为主键。

CREATE TABLE [UserTypes] 
(
    [UserCD] [varchar](40) NOT NULL PRIMARY KEY,
    [UserName] [varchar](100) NOT NULL
)

GO

INSERT INTO [dbo].[UserTypes]
           ([UserName], [UserCD])
     VALUES
           ('Administrator','ADMI'), 
           ('NonPrimary','NONP')

哪个更好。

如果您有分布式数据服务器,即使它们没有永久连接也必须保持唯一性,Guid 非常有用。

但是你可以做下面的,因为你知道uusercd是ADMI,你可以抓到ID

CREATE TABLE [UserTypes] (
    [Id] [uniqueidentifier] DEFAULT NEWID() PRIMARY KEY,
    [UserName] [varchar](100) NOT NULL,
    [UserCD] [varchar](40) NOT NULL)
INSERT INTO [dbo].[UserTypes]
           ([UserName], [UserCD])
     VALUES
           ('Administrator','ADMI'), 
           ('NonPrimary','NONP')
GO
-- ID got generated in [UserTypes] is '80D1EEE7-0BCC-48A7-A741-29A1D8B6E580' for 'ADMI'

CREATE TABLE [Users] (
    [Id] [uniqueidentifier] DEFAULT NEWID() PRIMARY KEY,
    [UserTypeId] [uniqueidentifier] NOT NULL,
    [UserName] [varchar](100) NOT NULL, 
    CONSTRAINT Users_UserTypeId_UserType_Id FOREIGN KEY (UserTypeId)
    REFERENCES UserTypes(Id))
INSERT INTO [dbo].[Users]
           ([UserTypeId], [UserName])
     VALUES
           ((SELECT [Id] FROM [UserTypes] WHERE [UserCD] = 'ADMI'),'Kushal Seth')
SELECT * FROM Users
GO
Id                                   | UserTypeId                           | UserName   
:----------------------------------- | :----------------------------------- | :----------
53f2a6e0-af71-4dab-8a99-821510681a37 | 6acfc89f-f4e2-4ac1-9989-b3a9c062cf0a | Kushal Seth

db<>fiddle here