【问题标题】:Azure SQL database duplicate the database schemaAzure SQL 数据库复制数据库架构
【发布时间】:2018-08-28 16:18:35
【问题描述】:

我有一个 Azure SQL 数据库,其中包含两个表 ProductOrder,它们保存在 dbo 架构中。我想编写一个 C# 程序,该程序将添加新架构并复制 dbo 中存在的相同表定义。

现有:

dbo.Product
dbo.Order

运行C#程序为client1创建一个新的schema,然后两个表将被添加到数据库中,表列表变为:

dbo.Product
dbo.Order
client1.Product
client1.Order

能否请您告诉我如何使用 c# 做到这一点?

【问题讨论】:

  • 我没有看到任何问题。
  • 我看到一个数据库对每个客户都有一个单独的模式,这是一场噩梦。作为 DBA,我请求您不要这样做。将数据放在一个带有 ClientID 列的表中(针对每个对象)。
  • 感谢 Dave 的建议,我将在下一个版本中更新。

标签: c# .net sql-server database azure-sql-database


【解决方案1】:

您可以创建一个接收两个输入参数的存储过程:

  1. 要复制的架构名称
  2. 新架构的名称

然后您可以从您的 c# 程序中调用此过程。

在过程中可以构建动态语句查询SQLServer的系统表INFORMATION_SCHEMA.TABLES

这个想法是:

  • 创建新架构
  • 将源表从旧模式克隆到新模式
  • 然后从新架构中的表中删除所有行

请注意,如果您有外键,则必须对其进行管理。

下面是一个示例:

create procedure p_clone_schema(
  @source_schema nvarchar(50),   
  @new_schema    nvarchar(50)   
)as
begin
    --check if destination schema already exists
    if not exists (select * from INFORMATION_SCHEMA.SCHEMATA where schema_name = @new_schema)
    begin
        --create new schema
        declare @sql nvarchar(max) = 'CREATE SCHEMA ' + QUOTENAME(@new_schema) 
        exec(@sql)
        set @sql = ''

        --build statement to copy tables in the new shema and then truncate them
        select @sql = CONCAT
                    (
                    @sql ,  'select * into ' , QUOTENAME(@new_schema) , '.' , QUOTENAME(TABLE_NAME) 
                    , ' from ' , QUOTENAME(TABLE_SCHEMA) , '.' , QUOTENAME(TABLE_NAME) 
                    , ' truncate table ' , QUOTENAME(@new_schema) , '.' , QUOTENAME(TABLE_NAME)
                    )
        from INFORMATION_SCHEMA.TABLES 
        where TABLE_SCHEMA = @source_schema 
            and TABLE_TYPE = 'BASE TABLE'

        exec(@sql)
    end
end

【讨论】:

    猜你喜欢
    • 2020-05-29
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多