是否可以自动为SQL Server和LINQ to SQL中的所有表名添加前缀?

Max*_*sky 5 c# linq sql-server asp.net-mvc linq-to-sql

我正在开发一些所有需要数据库功能的ASP.NET MVC项目.不幸的是,我的托管服务提供商只给我两个SQL Server数据库,所以我想把多个项目的表放在一个数据库中.

但是,我的一些表名称相似,所以我可能遇到一些问题.因此,我试图找到一种方法来更改所有表的名称,以便它们反映它们所属的应用程序.

目前,我在项目A中有以下表格:

  • Table1
  • Table2

在项目B中,我有这些表格:

  • Table1
  • Table2

我想将表合并到一个数据库中:

  • ATable1
  • ATable2
  • BTable1
  • BTable2

我的问题

  1. 如何自动为SQL Server数据库中的所有表的名称添加前缀
  2. 是否可以让LINQ to SQL自动 Table1从我的代码映射ATable1BTable1(取决于它是什么应用程序)?

Chr*_*ter 10

将表放在单独的模式中,例如

create schema ProjectA;
create schema ProjectB;
create table ProjectA.Table1 (...);
create table ProjectA.Table2 (...);
create table ProjectB.Table1 (...);
create table ProjectB.Table2 (...);
Run Code Online (Sandbox Code Playgroud)

我自己没有对此进行测试,但如果LINQ to SQL(以及任何其他ORM)没有存储并正确使用模式名称,我会感到非常惊讶.

如果手动编写自己的SQL命令,请注意必须在所有对象上引用模式名称,除非它是当前数据库用户的默认模式.如果(a)您只分配了一个SQL Server登录名,并且(b)您有大量现有SQL,则可能会导致问题.

将现有表移动到新模式中,例如将表dbo转换为ProjectA:

alter schema ProjectA transfer dbo.Table1;
alter schema ProjectA transfer dbo.Table2;
Run Code Online (Sandbox Code Playgroud)

要进行自动重命名,您可以编写一个简单的循环:

declare objectsCursor cursor local fast_forward for
    select o.name as objectname, s.name as schemaname
    from sys.objects as o
    inner join sys.schemas as s on o.schema_id = s.schema_id
    -- Alter these filters depending on what you want to convert
    where s.name = 'dbo'
    and o.type = 'U'
declare @objectname sysname, @schemaname sysname, @sql nvarchar(max)
open objectsCursor
fetch next from objectsCursor into @objectname, @schemaname
while @@fetch_status = 0 begin
    select @sql = N'alter schema ProjectA transfer ' + quotename(@schemaname) + '.' + quotename(@objectname)
    execute (@sql)
    fetch next from objectsCursor into @objectname, @schemaname
end
close objectsCursor
Run Code Online (Sandbox Code Playgroud)