【问题标题】:How to remove all constraints on a table with SMO objects (SQL Server)?如何删除具有 SMO 对象(SQL Server)的表上的所有约束?
【发布时间】:2019-12-08 16:03:14
【问题描述】:

我想知道是否可以删除带有SMO 对象(SQL Server 和 C#)的表上的所有约束?

事实上,我想知道下面的SQL查询等价于SMO对象:

ALTER TABLE TableName NOCHECK CONSTRAINT ALL

现在,我正在尝试在索引集合中查找约束状态,但找不到约束详细信息。

这是我的“非工作”代码:

Server server = new Server(new ServerConnection(sqlConnectionSmo));
foreach (Database db in server.Databases)
{
    foreach (Table table in db.Tables)
    {
        // Objective: 'ALTER TABLE YourTableName NOCHECK CONSTRAINT ALL'

        // SMO index vs constraint ?
        foreach (Index index in table.Indexes)
        {
            if (index.IndexKeyType = **Constraint??**)
            {
                index.Disable;
            }
        }
    }
}

知道这是否可能吗?

【问题讨论】:

  • 我认为您需要 checks 属性。然后您可以遍历constraints。不过我在这里没有很多经验。

标签: sql sql-server ssms smo check-constraints


【解决方案1】:

不要与 SMO 争吵。在它不再容易的地方,切换到 TSQL。

类似:

Server server = new Server(new ServerConnection(sqlConnectionSmo));
foreach (Database db in server.Databases)
{
    foreach (Table table in db.Tables)
    {
        string sql = $"ALTER TABLE [$(table.Schema)].[$(table.Name)] NOCHECK CONSTRAINT ALL";
        server.ConnectionContext.ExecuteNonQuery(sql);

    }
}

【讨论】:

  • 你的回答很有道理。我只是想知道 SMO 是否有一个(简单的)方法来做到这一点。
【解决方案2】:

如果接下来的 3 个语句组合在一起,输出将告诉您我的表 test 的主键是如何构造的:

select CONSTRAINT_NAME 
from INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE
where TABLE_NAME ='test'


select COLUMN_NAME, CONSTRAINT_NAME 
from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
where TABLE_NAME ='test'


select * 
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where CONSTRAINT_NAME = 'PK__test__3BD01996C0D6F5D2'

输出是:

CONSTRAINT_NAME
--------------------------------------------------------------------------------------------------------------------------------
PK__test__3BD01996C0D6F5D2

(1 row affected)

COLUMN_NAME                                                                                                                      CONSTRAINT_NAME
-------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------
i                                                                                                                                PK__test__3BD01996C0D6F5D2

(1 row affected)

CONSTRAINT_CATALOG                                                                                                               CONSTRAINT_SCHEMA                                                                                                                CONSTRAINT_NAME                                                                                                                  TABLE_CATALOG                                                                                                                    TABLE_SCHEMA                                                                                                                     TABLE_NAME                                                                                                                       CONSTRAINT_TYPE IS_DEFERRABLE INITIALLY_DEFERRED
-------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- --------------- ------------- ------------------
TEST                                                                                                                             dbo                                                                                                                              PK__test__3BD01996C0D6F5D2                                                                                                       TEST                                                                                                                             dbo                                                                                                                              test                                                                                                                             PRIMARY KEY     NO            NO

(1 row affected)

您的问题的答案:约束信息在 MSSQL 中是可查询的,因此可以创建一个语句来远程此信息。

【讨论】:

  • 但是,就像@HoneyBadger 所说:I don't have … here though.?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
相关资源
最近更新 更多