Выключите ограничения временно (MS SQL)

Одна идея изменить ширину до - это определить шаблон столбца, как показано ниже, который будет принудительно устанавливать ширину первого элемента только тогда, когда другой будет следовать grid-auto-columns. По сути, мы определяем явную сетку с 1 столбцом, тогда браузер будет добавлять дополнительные столбцы по мере необходимости для создания неявной сетки:

:root {
  --gap: 25px;
}

body {
  width: 100vw;
  overflow-x: hidden;
  margin: 0
}

#c {
  width: 100%;
  height: 50px;
  overflow-x: auto;
  display: grid;
  grid-gap: 20px;
  grid-template-columns:1px;
  grid-auto-flow: column;
  grid-auto-columns: calc(calc(100% - calc(var(--gap) * 2)) / 1.5);
  border: solid red 1px;
}

/* second approach */
#c::before {
  content: '';
}

#c::after {
  content: '';
  width: 1px; /* works out to about 25px or var(--gap) */
}

.i {
  /*width: 100%; not needed*/
  height: 25px;
  /*display: inline-block; not needed*/
}

.i:nth-child(odd) {
  background: skyblue;
}

.i:nth-child(even) {
  background: pink;
}
<div id='c'>
  <div class='i'>1</div>
  <div class='i'>2</div>
  <div class='i'>3</div>
  <div class='i'>4</div>
  <div class='i'>5</div>
  <div class='i'>6</div>
  <div class='i'>7</div>
  <div class='i'>8</div>
  <div class='i'>9</div>
  <div class='i'>10</div>
  <div class='i'>11</div>
  <div class='i'>12</div>
  <div class='i'>13</div>
  <div class='i'>14</div>
  <div class='i'>15</div>
  <div class='i'>16</div>
  <div class='i'>17</div>
  <div class='i'>18</div>
  <div class='i'>19</div>
  <div class='i'>20</div>
  <div class='i'>21</div>
  <div class='i'>22</div>
  <div class='i'>23</div>
  <div class='i'>24</div>
</div>
[116 ]
202
задан Mark Chackerian 8 April 2016 в 10:35
поделиться

4 ответа

Вы можете отключить ограничения FK и CHECK только в SQL 2005+ . См. ALTER TABLE

ALTER TABLE foo NOCHECK CONSTRAINT ALL

или

ALTER TABLE foo NOCHECK CONSTRAINT CK_foo_column

Первичные ключи и уникальные ограничения не могут быть отключены, но это должно быть хорошо, если я вас правильно понял.

212
ответ дан Brian Gideon 23 November 2019 в 04:59
поделиться

И, если вы хотите проверить, что вы не порвали свои отношения и не представили сирот, как только вы вооружив ваши чеки, т. е.

ALTER TABLE foo CHECK CONSTRAINT ALL

или

ALTER TABLE foo CHECK CONSTRAINT FK_something

, вы сможете вернуться и выполнить обновление для любых проверенных столбцов, например, так:

UPDATE myUpdatedTable SET someCol = someCol, fkCol = fkCol, etc = etc

И любые ошибки в этой точке будут вызваны несоблюдением ограничений.

57
ответ дан Brian Gideon 23 November 2019 в 04:59
поделиться

You can actually disable all database constraints in a single SQL command and the re-enable them calling another single command. See:

I am currently working with SQL Server 2005 but I am almost sure that this approach worked with SQL 2000 as well

16
ответ дан 23 November 2019 в 04:59
поделиться

Отключение и включение всех внешних ключей

CREATE PROCEDURE pr_Disable_Triggers_v2
    @disable BIT = 1
AS
    DECLARE @sql VARCHAR(500)
        ,   @tableName VARCHAR(128)
        ,   @tableSchema VARCHAR(128)

    -- List of all tables
    DECLARE triggerCursor CURSOR FOR
        SELECT  t.TABLE_NAME AS TableName
            ,   t.TABLE_SCHEMA AS TableSchema
        FROM    INFORMATION_SCHEMA.TABLES t
        ORDER BY t.TABLE_NAME, t.TABLE_SCHEMA

    OPEN    triggerCursor
    FETCH NEXT FROM triggerCursor INTO @tableName, @tableSchema
    WHILE ( @@FETCH_STATUS = 0 )
    BEGIN

        SET @sql = 'ALTER TABLE ' + @tableSchema + '.[' + @tableName + '] '
        IF @disable = 1
            SET @sql = @sql + ' DISABLE TRIGGER ALL'
        ELSE
            SET @sql = @sql + ' ENABLE TRIGGER ALL'

        PRINT 'Executing Statement - ' + @sql
        EXECUTE ( @sql )

        FETCH NEXT FROM triggerCursor INTO @tableName, @tableSchema

    END

    CLOSE triggerCursor
    DEALLOCATE triggerCursor

Сначала курсор foreignKeyCursor объявляется как оператор SELECT который собирает список внешних ключей и их имена таблиц. Далее курсор открывается и выполняется начальный оператор FETCH. Эта Оператор FETCH считывает данные первой строки в локальный переменные @foreignKeyName и @tableName. При переходе через курсор, вы можете проверить @@ FETCH_STATUS на значение 0, которое указывает, что выборка прошла успешно. Это означает, что цикл будет продолжать двигаться вперед, чтобы он мог получить каждый последующий внешний ключ из набора строк. @@ FETCH_STATUS доступен для всех курсоров на подключение. Итак, если вы просматриваете несколько курсоров, это важно проверить значение @@ FETCH_STATUS в заявлении сразу после оператора FETCH. @@ FETCH_STATUS будет отражать статус самой последней операции FETCH в соединении. Допустимые значения для @@ FETCH_STATUS:

0 = FETCH успешно
-1 = FETCH не удалось
-2 = выбранная строка отсутствует

Внутри цикла код строит команду ALTER TABLE по-другому в зависимости от того, есть ли намерение отключить или включить иностранный ограничение ключа (с использованием ключевого слова CHECK или NOCHECK). Заявление затем распечатывается в виде сообщения, чтобы можно было наблюдать за его ходом, а затем заявление выполнено. Наконец, когда все строки были повторены через, хранимая процедура закрывается и освобождает курсор.

см. Отключение ограничений и триггеров из журнала MSDN

2
ответ дан 23 November 2019 в 04:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: