Browse Source

Fixes #13577: Implemented `yii\db\mssql\QueryBuilder::resetSequence()`

tags/2.0.12
Bob Olde Hampsink 8 years ago committed by Alexander Makarov
parent
commit
56c65f6079
  1. 1
      framework/CHANGELOG.md
  2. 30
      framework/db/mssql/QueryBuilder.php
  3. 13
      tests/framework/db/mssql/QueryBuilderTest.php

1
framework/CHANGELOG.md

@ -12,6 +12,7 @@ Yii Framework 2 Change Log
- Bug #11230: Include `defaultRoles` in `yii\rbac\DbManager->getRolesByUser()` results (developeruz)
- Bug #13343: Fixed `yii\i18n\Formatter::asTime()` to process time-only values without time zone conversion (bizley)
- Bug #11404: `yii\base\Model::loadMultiple()` returns true even if `yii\base\Model::load()` returns false (zvook)
- Enh #13577: Implemented `yii\db\mssql\QueryBuilder::resetSequence()` (boboldehampsink)
- Bug #13513: Fixed RBAC migration to work correctly on Oracle DBMS (silverfire)
- Enh #13550: Refactored unset call order in `yii\di\ServiceLocator::set()` (Lanrik)
- Bug #13582: PK column in `yii\db\pgsql\resetSequence()` was not quoted properly (boboldehampsink)

30
framework/db/mssql/QueryBuilder.php

@ -166,6 +166,36 @@ class QueryBuilder extends \yii\db\QueryBuilder
}
/**
* Creates a SQL statement for resetting the sequence value of a table's primary key.
* The sequence will be reset such that the primary key of the next new row inserted
* will have the specified value or 1.
* @param string $tableName the name of the table whose primary key sequence will be reset
* @param mixed $value the value for the primary key of the next new row inserted. If this is not set,
* the next new row's primary key will have a value 1.
* @return string the SQL statement for resetting sequence
* @throws InvalidParamException if the table does not exist or there is no sequence associated with the table.
*/
public function resetSequence($tableName, $value = null)
{
$table = $this->db->getTableSchema($tableName);
if ($table !== null && $table->sequenceName !== null) {
$tableName = $this->db->quoteTableName($tableName);
if ($value === null) {
$key = $this->db->quoteColumnName(reset($table->primaryKey));
$value = "(SELECT COALESCE(MAX({$key}),0) FROM {$tableName})+1";
} else {
$value = (int) $value;
}
return "DBCC CHECKIDENT ('{$tableName}', RESEED, {$value})";
} elseif ($table === null) {
throw new InvalidParamException("Table not found: $tableName");
} else {
throw new InvalidParamException("There is not sequence associated with table '$tableName'.");
}
}
/**
* Builds a SQL statement for enabling or disabling integrity check.
* @param bool $check whether to turn on or off the integrity check.
* @param string $schema the schema of the tables. Defaults to empty string, meaning the current or default schema.

13
tests/framework/db/mssql/QueryBuilderTest.php

@ -100,4 +100,17 @@ class QueryBuilderTest extends \yiiunit\framework\db\QueryBuilderTest
return $data;
}
public function testResetSequence()
{
$qb = $this->getQueryBuilder();
$expected = "DBCC CHECKIDENT ('[item]', RESEED, (SELECT COALESCE(MAX([id]),0) FROM [item])+1)";
$sql = $qb->resetSequence('item');
$this->assertEquals($expected, $sql);
$expected = "DBCC CHECKIDENT ('[item], RESEED, 4)";
$sql = $qb->resetSequence('item', 4);
$this->assertEquals($expected, $sql);
}
}

Loading…
Cancel
Save