Spec-Zone.ru › Yii 1.1

CMssqlSchema

Пакет system.db.schema.mssql
Наследование class CMssqlSchema » CDbSchema » CComponent
Исходный код framework/db/schema/mssql/CMssqlSchema.php
CMssqlSchema — класс для получения метаданных из базы данных MS SQL Server.

Общественные свойства

Свойство Тип Описание Определено
columnTypes массив абстрактные типы столбцов, сопоставленные с физическими типами столбцов. CMssqlSchema
commandBuilder CDbCommandBuilder генератор SQL-команд для этого соединения. CDbSchema
dbConnection CDbConnection соединение с базой данных. CDbSchema
tableNames массив Возвращает все имена таблиц в базе данных. CDbSchema
tables массив Возвращает метаданные для всех таблиц в базе данных. CDbSchema

Общедоступные методы

Метод Описание Определено в
__call() Вызывает именованный метод, который не является методом класса. CComponent
__construct() Конструктор. CDbSchema
__get() Возвращает значение свойства, список обработчиков событий или поведение по его имени. CComponent
__isset() Проверяет, является ли значение свойства нулевым. CComponent
__set() Устанавливает значение свойства компонента. CComponent
__unset() Устанавливает свойство компонента в null. CComponent
addColumn() Создает SQL-запрос для добавления нового столбца БД. CDbSchema
addForeignKey() Создает SQL-запрос для добавления внешнего ключа к существующей таблице. CDbSchema
addPrimaryKey() Создает SQL-запрос для добавления первичного ключа к существующей таблице. CDbSchema
alterColumn() Создает SQL-запрос для изменения определения столбца. CMssqlSchema
asa() Возвращает объект поведения по имени. CComponent
attachBehavior() Присоединяет поведение к этому компоненту. CComponent
attachBehaviors() Присоединяет список поведений к компоненту. CComponent
attachEventHandler() Присоединяет обработчик событий к событию. CComponent
canGetProperty() Определяет, можно ли прочитать свойство. CComponent
canSetProperty() Определяет, можно ли установить свойство. CComponent
checkIntegrity() Включает или выключает проверку целостности. CMssqlSchema
compareTableNames() Сравнивает два имени таблиц. CMssqlSchema
createIndex() Создает SQL-запрос для создания нового индекса. CDbSchema
createTable() Создает SQL-запрос для создания новой таблицы БД. CDbSchema
detachBehavior() Отсоединяет поведение от компонента. CComponent
detachBehaviors() Отсоединяет все поведения от компонента. CComponent
detachEventHandler() Отсоединяет существующий обработчик событий. CComponent
disableBehavior() Отключает прикрепленное поведение. CComponent
disableBehaviors() Отключает все прикрепленные поведения к этому компоненту. CComponent
dropColumn() Создает SQL-запрос для удаления столбца БД. CDbSchema
dropForeignKey() Создает SQL-запрос для удаления ограничения внешнего ключа. CDbSchema
dropIndex() Создает SQL-запрос для удаления индекса. CDbSchema
dropPrimaryKey() Создает SQL-запрос для удаления ограничения первичного ключа из существующей таблицы. CDbSchema
dropTable() Создает SQL-запрос для удаления таблицы БД. CDbSchema
enableBehavior() Включает прикрепленное поведение. CComponent
enableBehaviors() Включает все прикрепленные поведения к этому компоненту. CComponent
evaluateExpression() Вычисляет PHP-выражение или обратный вызов в контексте этого компонента. CComponent
getColumnType() Преобразует абстрактный тип столбца в физический тип столбца. CDbSchema
getCommandBuilder() Возвращает конструктор команд SQL для этого соединения. CDbSchema
getDbConnection() Возвращает соединение с базой данных. Соединение активно. CDbSchema
getEventHandlers() Возвращает список присоединенных обработчиков событий для события. CComponent
getTable() Получает метаданные для указанной таблицы. CDbSchema
getTableNames() Возвращает все имена таблиц в базе данных. CDbSchema
getTables() Возвращает метаданные для всех таблиц в базе данных. CDbSchema
hasEvent() Определяет, определено ли событие. CComponent
hasEventHandler() Проверяет, есть ли присоединенные обработчики для указанного события. CComponent
hasProperty() Определяет, определено ли свойство. CComponent
quoteColumnName() Приводит имя столбца в кавычки для использования в запросе. CDbSchema
quoteSimpleColumnName() Приводит имя столбца в кавычки для использования в запросе. CMssqlSchema
quoteSimpleTableName() Приводит имя таблицы в кавычки для использования в запросе. CMssqlSchema
quoteTableName() Приводит имя таблицы в кавычки для использования в запросе. CDbSchema
raiseEvent() Вызывает событие. CComponent
refresh() Обновляет схему. CDbSchema
renameColumn() Создает SQL-запрос для переименования столбца. CMssqlSchema
renameTable() Создает SQL-запрос для переименования таблицы БД. CMssqlSchema
resetSequence() Сбрасывает значение последовательности первичного ключа таблицы. CMssqlSchema
truncateTable() Создает SQL-запрос для усечения таблицы БД. CDbSchema

Защищенные методы

Метод Описание Определено в
createColumn() Создаёт столбец таблицы. CMssqlSchema
createCommandBuilder() Создаёт конструктор команд для базы данных. CMssqlSchema
findColumns() Сбор метаданных столбцов таблицы. CMssqlSchema
findForeignKeys() Получает ключи и имена таблиц ограничений внешних зависимостей. CMssqlSchema
findPrimaryKey() Получает сведения о столбце(ах) первичного ключа для заданной таблицы. CMssqlSchema
findTableNames() Возвращает все имена таблиц в базе данных. CMssqlSchema
loadTable() Загружает метаданные для указанной таблицы. CMssqlSchema
resolveTableNames() Генерирует различные виды имён таблиц. CMssqlSchema

Подробности свойств

columnTypes свойство (доступно начиная с v1.1.6)

public array $columnTypes;

абстрактные типы столбцов, сопоставленные с физическими типами столбцов.

Подробности методов

alterColumn() метод (доступно начиная с v1.1.6)

public string alterColumn(string $table, string $column, string $type)
$table строка имя таблицы, столбец которой необходимо изменить. Имя таблицы будет корректно обрамлено кавычками методом.
$column строка имя столбца, который необходимо изменить. Имя будет корректно обрамлено кавычками методом.
$type строка новый тип столбца. Метод getColumnType будет вызван для преобразования абстрактного типа столбца (если таковой имеется) в физический. Всё, что не распознаётся как абстрактный тип, сохранится в генерируемом SQL. Например, «строка» преобразуется в «varchar(255)», а «строка не null» — в «varchar(255) not null».
{return} строка SQL-запрос для изменения определения столбца.
Исходный код: framework/db/schema/mssql/CMssqlSchema.php#433 (показать)
public function alterColumn($table, $column, $type)
{
    
$type=$this->getColumnType($type);
    
$sql='ALTER TABLE ' . $this->quoteTableName($table) . ' ALTER COLUMN '
        
. $this->quoteColumnName($column) . ' '
        
. $this->getColumnType($type);
    return 
$sql;
}

Строит SQL-запрос для изменения определения столбца.

checkIntegrity() метод (доступно начиная с v1.1.6)

public void checkIntegrity(boolean $check=true, string $schema='')
$check логическое значение включает или выключает проверку целостности.
$schema строка схема таблиц. По умолчанию пустая строка, что означает текущую или по умолчанию схему.
Исходный код: framework/db/schema/mssql/CMssqlSchema.php#116 (показать)
public function checkIntegrity($check=true,$schema='')
{
    
$enable=$check ? 'CHECK' : 'NOCHECK';
    if(!isset(
$this->_normalTables[$schema]))
        
$this->_normalTables[$schema]=$this->findTableNames($schema,false);
    
$db=$this->getDbConnection();
    foreach(
$this->_normalTables[$schema] as $tableName)
    {
        
$tableName=$this->quoteTableName($tableName);
        
$db->createCommand("ALTER TABLE $tableName$enable CONSTRAINT ALL")->execute();
    }
}

Включает или отключает проверку целостности.

compareTableNames() метод

public boolean compareTableNames(string $name1, string $name2)
$name1 строка имя таблицы 1
$name2 строка имя таблицы 2
{return} логическое значение указывает, ссылаются ли два имени таблиц на одну и ту же таблицу.
Исходный код: framework/db/schema/mssql/CMssqlSchema.php#76 (показать)
public function compareTableNames($name1,$name2)
{
    
$name1=str_replace(array('[',']'),'',$name1);
    
$name2=str_replace(array('[',']'),'',$name2);
    return 
parent::compareTableNames(strtolower($name1),strtolower($name2));
}

Сравнивает два имени таблиц. Имена таблиц могут быть как с кавычками, так и без них. Этот метод учтёт оба случая.

createColumn() метод

protected CDbColumnSchema createColumn(array $column)
$column массив метаданные столбца
{return} CDbColumnSchema нормализованные метаданные столбца
Исходный код: framework/db/schema/mssql/CMssqlSchema.php#331 (показать)
protected function createColumn($column)
{
    
$c=new CMssqlColumnSchema;
    
$c->name=$column['COLUMN_NAME'];
    
$c->rawName=$this->quoteColumnName($c->name);
    
$c->allowNull=$column['IS_NULLABLE']=='YES';
    if (
$column['NUMERIC_PRECISION_RADIX']!==null)
    {
        
// We have a numeric datatype
        
$c->size=$c->precision=$column['NUMERIC_PRECISION']!==null?(int)$column['NUMERIC_PRECISION']:null;
        
$c->scale=$column['NUMERIC_SCALE']!==null?(int)$column['NUMERIC_SCALE']:null;
    }
    elseif (
$column['DATA_TYPE']=='image' || $column['DATA_TYPE']=='text')
        
$c->size=$c->precision=null;
    else
        
$c->size=$c->precision=($column['CHARACTER_MAXIMUM_LENGTH']!== null)?(int)$column['CHARACTER_MAXIMUM_LENGTH']:null;
    
$c->autoIncrement=$column['IsIdentity']==1;
    
$c->comment=$column['Comment']===null ? '' : $column['Comment'];

    
$c->init($column['DATA_TYPE'],$column['COLUMN_DEFAULT']);
    return 
$c;
}

Создаёт столбец таблицы.

createCommandBuilder() метод

protected CDbCommandBuilder createCommandBuilder()
{return} CDbCommandBuilder экземпляр конструктора команд
Исходный код: framework/db/schema/mssql/CMssqlSchema.php#393 (показать)
protected function createCommandBuilder()
{
    return new 
CMssqlCommandBuilder($this);
}

Создаёт конструктор команд для базы данных. Этот метод переопределяет родительскую реализацию, чтобы создать конструктор команд, специфичный для MSSQL.

findColumns() метод

protected boolean findColumns(CMssqlTableSchema $table)
$table CMssqlTableSchema метаданные таблицы
{return} логическое значение существует ли таблица в базе данных
Исходный код: framework/db/schema/mssql/CMssqlSchema.php#281 (показать)
protected function findColumns($table)
{
    
$columnsTable="INFORMATION_SCHEMA.COLUMNS";
    
$where=array();
    
$where[]="t1.TABLE_NAME='".$table->name."'";
    if (isset(
$table->catalogName))
    {
        
$where[]="t1.TABLE_CATALOG='".$table->catalogName."'";
        
$columnsTable = $table->catalogName.'.'.$columnsTable;
    }
    if (isset(
$table->schemaName))
        
$where[]="t1.TABLE_SCHEMA='".$table->schemaName."'";

    
$sql="SELECT t1.*, columnproperty(object_id(t1.table_schema+'.'+t1.table_name), t1.column_name, 'IsIdentity') AS IsIdentity, ".
         
"CONVERT(VARCHAR, t2.value) AS Comment FROM ".$this->quoteTableName($columnsTable)." AS t1 ".
         
"LEFT OUTER JOIN sys.extended_properties AS t2 ON t1.ORDINAL_POSITION = t2.minor_id AND ".
         
"object_name(t2.major_id) = t1.TABLE_NAME AND t2.class=1 AND t2.class_desc='OBJECT_OR_COLUMN' AND t2.name='MS_Description' ".
         
"WHERE ".join(' AND ',$where);
    try
    {
        
$columns=$this->getDbConnection()->createCommand($sql)->queryAll();
        if(empty(
$columns))
            return 
false;
    }
    catch(
Exception $e)
    {
        return 
false;
    }

    foreach(
$columns as $column)
    {
        
$c=$this->createColumn($column);
        if (
is_array($table->primaryKey))
            
$c->isPrimaryKey=in_array($c->name, $table->primaryKey);
        else
            
$c->isPrimaryKey=strcasecmp($c->name,$table->primaryKey)===0;

        
$c->isForeignKey=isset($table->foreignKeys[$c->name]);
        
$table->columns[$c->name]=$c;
        if (
$c->autoIncrement && $table->sequenceName===null)
            
$table->sequenceName=$table->name;
    }
    return 
true;
}

Сбор метаданных столбцов таблицы.

findForeignKeys() метод

protected array findForeignKeys(CMssqlTableSchema $table)
$table CMssqlTableSchema таблица
{return} массив имя таблицы внешней зависимости и ключи.
Исходный код: framework/db/schema/mssql/CMssqlSchema.php#228 (показать)
protected function findForeignKeys($table)
{
    
$rc='INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS';
    
$kcu='INFORMATION_SCHEMA.KEY_COLUMN_USAGE';
    if (isset(
$table->catalogName))
    {
        
$kcu=$table->catalogName.'.'.$kcu;
        
$rc=$table->catalogName.'.'.$rc;
    }

    
//From http://msdn2.microsoft.com/en-us/library/aa175805(SQL.80).aspx
    
$sql = <<<EOD
    SELECT
         KCU1.CONSTRAINT_NAME AS 'FK_CONSTRAINT_NAME'
       , KCU1.TABLE_NAME AS 'FK_TABLE_NAME'
       , KCU1.COLUMN_NAME AS 'FK_COLUMN_NAME'
       , KCU1.ORDINAL_POSITION AS 'FK_ORDINAL_POSITION'
       , KCU2.CONSTRAINT_NAME AS 'UQ_CONSTRAINT_NAME'
       , KCU2.TABLE_NAME AS 'UQ_TABLE_NAME'
       , KCU2.COLUMN_NAME AS 'UQ_COLUMN_NAME'
       , KCU2.ORDINAL_POSITION AS 'UQ_ORDINAL_POSITION'
    FROM 
{$this->quoteTableName($rc)} RC
    JOIN 
{$this->quoteTableName($kcu)} KCU1
    ON KCU1.CONSTRAINT_CATALOG = RC.CONSTRAINT_CATALOG
       AND KCU1.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA
       AND KCU1.CONSTRAINT_NAME = RC.CONSTRAINT_NAME
    JOIN 
{$this->quoteTableName($kcu)} KCU2
    ON KCU2.CONSTRAINT_CATALOG =
    RC.UNIQUE_CONSTRAINT_CATALOG
       AND KCU2.CONSTRAINT_SCHEMA =
    RC.UNIQUE_CONSTRAINT_SCHEMA
       AND KCU2.CONSTRAINT_NAME =
    RC.UNIQUE_CONSTRAINT_NAME
       AND KCU2.ORDINAL_POSITION = KCU1.ORDINAL_POSITION
    WHERE KCU1.TABLE_NAME = :table
EOD;
    
$command = $this->getDbConnection()->createCommand($sql);
    
$command->bindValue(':table', $table->name);
    
$fkeys=array();
    foreach(
$command->queryAll() as $info)
    {
        
$fkeys[$info['FK_COLUMN_NAME']]=array($info['UQ_TABLE_NAME'],$info['UQ_COLUMN_NAME'],);

    }
    return 
$fkeys;
}

Получает ключи и имя таблицы ограничений внешних зависимостей.

findPrimaryKey() метод

protected mixed findPrimaryKey(CMssqlTableSchema $table)
$table CMssqlTableSchema таблица
{return} смешанный тип первичные ключи (null, если нет, строка, если только 1 столбец, или массив, если составной первичный ключ)
Исходный код: framework/db/schema/mssql/CMssqlSchema.php#187 (показать)
protected function findPrimaryKey($table)
{
    
$kcu='INFORMATION_SCHEMA.KEY_COLUMN_USAGE';
    
$tc='INFORMATION_SCHEMA.TABLE_CONSTRAINTS';
    if (isset(
$table->catalogName))
    {
        
$kcu=$table->catalogName.'.'.$kcu;
        
$tc=$table->catalogName.'.'.$tc;
    }

    
$sql = <<<EOD
    SELECT k.column_name field_name
    FROM 
{$this->quoteTableName($kcu)} k
    LEFT JOIN 
{$this->quoteTableName($tc)} c
    ON k.table_name = c.table_name
        AND k.constraint_name = c.constraint_name
    WHERE c.constraint_type ='PRIMARY KEY'
        AND k.table_name = :table
        AND k.table_schema = :schema
EOD;
    
$command = $this->getDbConnection()->createCommand($sql);
    
$command->bindValue(':table', $table->name);
    
$command->bindValue(':schema', $table->schemaName);
    
$primary=$command->queryColumn();
    switch (
count($primary))
    {
        case 
0: // No primary key on table
            
$primary=null;
            break;
        case 
1: // Only 1 primary key
            
$primary=$primary[0];
            break;
    }
    return 
$primary;
}

Получает сведения о столбце(ах) первичного ключа для данной таблицы.

findTableNames() метод

protected array findTableNames(string $schema='', boolean $includeViews=true)
$schema строка схема таблиц. По умолчанию пустая строка, что означает текущую или по умолчанию схему. Если не пустая, возвращаемые имена таблиц будут иметь префикс имени схемы.
$includeViews логическое значение включать ли представления в результат. По умолчанию true.
{return} массив все имена таблиц в базе данных.
Исходный код: framework/db/schema/mssql/CMssqlSchema.php#361 (показать)
protected function findTableNames($schema='',$includeViews=true)
{
    if(
$schema==='')
        
$schema=self::DEFAULT_SCHEMA;
    if(
$includeViews)
        
$condition="TABLE_TYPE in ('BASE TABLE','VIEW')";
    else
        
$condition="TABLE_TYPE='BASE TABLE'";
    
$sql=<<<EOD
SELECT TABLE_NAME FROM [INFORMATION_SCHEMA].[TABLES]
WHERE TABLE_SCHEMA=:schema AND 
$condition
EOD;
    
$command=$this->getDbConnection()->createCommand($sql);
    
$command->bindParam(":schema", $schema);
    
$rows=$command->queryAll();
    
$names=array();
    foreach (
$rows as $row)
    {
        if (
$schema == self::DEFAULT_SCHEMA)
            
$names[]=$row['TABLE_NAME'];
        else
            
$names[]=$schema.'.'.$row['TABLE_NAME'];
    }

    return 
$names;
}

Возвращает все имена таблиц в базе данных.

loadTable() метод

protected CMssqlTableSchema loadTable(string $name)
$name строка имя таблицы
{return} CMssqlTableSchema зависимые от драйвера метаданные таблицы. Null, если таблица не существует.
Исходный код: framework/db/schema/mssql/CMssqlSchema.php#134 (показать)
protected function loadTable($name)
{
    
$table=new CMssqlTableSchema;
    
$this->resolveTableNames($table,$name);
    
//if (!in_array($table->name, $this->tableNames)) return null;
    
$table->primaryKey=$this->findPrimaryKey($table);
    
$table->foreignKeys=$this->findForeignKeys($table);
    if(
$this->findColumns($table))
    {
        return 
$table;
    }
    else
        return 
null;
}

Загружает метаданные для указанной таблицы.

quoteSimpleColumnName() метод (доступен с версии v1.1.6)

public string quoteSimpleColumnName(string $name)
$name строка имя столбца
{return} строка правильно обрамленное имя столбца
Исходный код: framework/db/schema/mssql/CMssqlSchema.php#63 (показать)
public function quoteSimpleColumnName($name)
{
    return 
'['.$name.']';
}

Обрамляет имя столбца для использования в запросе. Простое имя столбца не содержит префикса.

quoteSimpleTableName() метод (доступен с версии v1.1.6)

public string quoteSimpleTableName(string $name)
$name строка имя таблицы
{return} строка правильно обрамленное имя таблицы
Исходный код: framework/db/schema/mssql/CMssqlSchema.php#51 (показать)
public function quoteSimpleTableName($name)
{
    return 
'['.$name.']';
}

Обрамляет имя таблицы для использования в запросе. Простое имя таблицы не содержит префикса схемы.

renameColumn() метод (доступен с версии v1.1.6)

public string renameColumn(string $table, string $name, string $newName)
$table строка таблица, столбец которой нужно переименовать. Имя будет корректно обрамлено методом.
$name строка старое имя столбца. Имя будет корректно обрамлено методом.
$newName строка новое имя столбца. Имя будет корректно обрамлено методом.
{return} строка SQL-запрос для переименования столбца БД.
Исходный код: framework/db/schema/mssql/CMssqlSchema.php#418 (показать)
public function renameColumn($table, $name, $newName)
{
    return 
"sp_rename '$table.$name', '$newName', 'COLUMN'";
}

Создает SQL-запрос для переименования столбца.

renameTable() метод (доступен с версии v1.1.6)

public string renameTable(string $table, string $newName)
$table строка таблица, которую нужно переименовать. Имя будет корректно обрамлено методом.
$newName строка новое имя таблицы. Имя будет корректно обрамлено методом.
{return} строка SQL-запрос для переименования таблицы БД.
Исходный код: framework/db/schema/mssql/CMssqlSchema.php#405 (показать)
public function renameTable($table, $newName)
{
    return 
"sp_rename '$table', '$newName'";
}

Создает SQL-запрос для переименования таблицы БД.

resetSequence() метод (доступен с версии v1.1.6)

public void resetSequence(CDbTableSchema $table, integer|null $value=NULL)
$table CDbTableSchema схема таблицы, последовательность первичного ключа которой будет сброшена
$value целое число|null значение для первичного ключа следующей новой вставляемой строки. Если это не установлено, первичный ключ следующей новой строки будет иметь максимальное значение первичного ключа плюс один (т.е. обрезка последовательности).
Исходный код: framework/db/schema/mssql/CMssqlSchema.php#93 (показать)
public function resetSequence($table,$value=null)
{
    if(
$table->sequenceName===null)
        return;
    if(
$value!==null)
        
$value=(int)($value)-1;
    else
        
$value=(int)$this->getDbConnection()
            ->
createCommand("SELECT MAX([{$table->primaryKey}]) FROM {$table->rawName}")
            ->
queryScalar();
    
$name=strtr($table->rawName,array('['=>'',']'=>''));
    
$this->getDbConnection()
        ->
createCommand("DBCC CHECKIDENT ('$name',RESEED,$value)")
        ->
execute();
}

Сбрасывает значение последовательности первичного ключа таблицы. Последовательность будет сброшена таким образом, что первичный ключ следующей новой вставляемой строки будет иметь указанное значение или максимальное значение первичного ключа плюс один (т.е. обрезка последовательности).

resolveTableNames() метод

protected void resolveTableNames(CMssqlTableSchema $table, string $name)
$table CMssqlTableSchema экземпляр таблицы
$name строка необрамленное имя таблицы
Исходный код: framework/db/schema/mssql/CMssqlSchema.php#154 (показать)
protected function resolveTableNames($table,$name)
{
    
$parts=explode('.',str_replace(array('[',']'),'',$name));
    if((
$c=count($parts))==3)
    {
        
// Catalog name, schema name and table name provided
        
$table->catalogName=$parts[0];
        
$table->schemaName=$parts[1];
        
$table->name=$parts[2];
        
$table->rawName=$this->quoteTableName($table->catalogName).'.'.$this->quoteTableName($table->schemaName).'.'.$this->quoteTableName($table->name);
    }
    elseif (
$c==2)
    {
        
// Only schema name and table name provided
        
$table->name=$parts[1];
        
$table->schemaName=$parts[0];
        
$table->rawName=$this->quoteTableName($table->schemaName).'.'.$this->quoteTableName($table->name);
    }
    else
    {
        
// Only the name given, we need to get at least the schema name
        //if (empty($this->_schemaNames)) $this->findTableNames();
        
$table->name=$parts[0];
        
$table->schemaName=self::DEFAULT_SCHEMA;
        
$table->rawName=$this->quoteTableName($table->schemaName).'.'.$this->quoteTableName($table->name);
    }
}

Генерирует различные виды имен таблиц.

© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/CMssqlSchema

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API