CMssqlSchema

优质
小牛编辑
132浏览
2023-12-01
所有包 | 属性 | 方法
system.db.schema.mssql
继承class CMssqlSchema » CDbSchema » CComponent
版本$Id: CMssqlSchema.php 3515 2011-12-28 12:29:24Z mdomba $
源码framework/db/schema/mssql/CMssqlSchema.php
CMssqlSchema是从MSSQL数据库检索元数据信息的类。

公共属性

隐藏继承属性

属性类型描述定义在
columnTypesarray映射到实体列类型的抽象列类型。CMssqlSchema
commandBuilderCDbCommandBuilderthe SQL command builder for this connection.CDbSchema
dbConnectionCDbConnectiondatabase connection.CDbSchema
tableNamesarrayReturns all table names in the database.CDbSchema
tablesarrayReturns the metadata for all tables in the database.CDbSchema

公共方法

隐藏继承方法

方法描述定义在
__call()如果类中没有调的方法名,则调用这个方法。CComponent
__construct()Constructor.CDbSchema
__get()返回一个属性值、一个事件处理程序列表或一个行为名称。CComponent
__isset()检查一个属性是否为null。CComponent
__set()设置一个组件的属性值。CComponent
__unset()设置一个组件的属性为null。CComponent
addColumn()Builds a SQL statement for adding a new DB column.CDbSchema
addForeignKey()Builds a SQL statement for adding a foreign key constraint to an existing table.CDbSchema
alterColumn()构造改变列定义的SQL语句。CMssqlSchema
asa()返回这个名字的行为对象。CComponent
attachBehavior()附加一个行为到组件。CComponent
attachBehaviors()附加一个行为列表到组件。CComponent
attachEventHandler()为事件附加一个事件处理程序。CComponent
canGetProperty()确定属性是否可读。CComponent
canSetProperty()确定属性是否可写。CComponent
checkIntegrity()启用或禁用完整性检查。CMssqlSchema
compareTableNames()比较两个表的名称。CMssqlSchema
createIndex()Builds a SQL statement for creating a new index.CDbSchema
createTable()Builds a SQL statement for creating a new DB table.CDbSchema
detachBehavior()从组件中分离一个行为。CComponent
detachBehaviors()从组件中分离所有行为。CComponent
detachEventHandler()分离一个存在的事件处理程序。CComponent
disableBehavior()禁用一个附加行为。CComponent
disableBehaviors()禁用组件附加的所有行为。CComponent
dropColumn()Builds a SQL statement for dropping a DB column.CDbSchema
dropForeignKey()Builds a SQL statement for dropping a foreign key constraint.CDbSchema
dropIndex()Builds a SQL statement for dropping an index.CDbSchema
dropTable()Builds a SQL statement for dropping a DB table.CDbSchema
enableBehavior()启用一个附加行为。CComponent
enableBehaviors()启用组件附加的所有行为。CComponent
evaluateExpression()计算一个PHP表达式,或根据组件上下文执行回调。CComponent
getColumnType()Converts an abstract column type into a physical column type.CDbSchema
getCommandBuilder()返回the SQL command builder for this connection.CDbSchema
getDbConnection()返回database connection. The connection is active.CDbSchema
getEventHandlers()返回一个事件的附加处理程序列表。CComponent
getTable()Obtains the metadata for the named table.CDbSchema
getTableNames()Returns all table names in the database.CDbSchema
getTables()Returns the metadata for all tables in the database.CDbSchema
hasEvent()确定一个事件是否定义。CComponent
hasEventHandler()检查事件是否有附加的处理程序。CComponent
hasProperty()确定属性是否被定义。CComponent
quoteColumnName()Quotes a column name for use in a query.CDbSchema
quoteSimpleColumnName()用引号引用列名以便查询时使用。CMssqlSchema
quoteSimpleTableName()用引号引用表名以便查询时使用。CMssqlSchema
quoteTableName()Quotes a table name for use in a query.CDbSchema
raiseEvent()发起一个事件。CComponent
refresh()Refreshes the schema.CDbSchema
renameColumn()构造重命名列的SQL语句。CMssqlSchema
renameTable()构造重命名表的SQL语句。CMssqlSchema
resetSequence()重置表的主键的序列值。CMssqlSchema
truncateTable()Builds a SQL statement for truncating a DB table.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)
$tablestring要改变的列所在表。该表名会被指定方法正确引用。
$columnstring要改变的列名。该列名会被指定方法正确引用。
$typestring新的列类型。getColumnType方法会被调用来将虚拟列类型(若存在) 转换为对应的实体列类型。任何未被识别为虚拟类型的类型会被保留在生成的SQL中。 例如,‘string’会被转为‘varchar(255)’,而‘string not null’会被转为‘varchar(255) not null’。
{return}string改变列定义的SQL语句。
源码: framework/db/schema/mssql/CMssqlSchema.php#416 (显示) publicfunctionalterColumn($table,$column,$type)
{
$type=$this->getColumnType($type);
$sql='ALTERTABLE'.$this->quoteTableName($table).'ALTERCOLUMN'
.$this->quoteColumnName($column).''
.$this->getColumnType($type);
return$sql;
}

构造改变列定义的SQL语句。

checkIntegrity() 方法 (可用自 v1.1)
public void checkIntegrity(boolean $check=true, string $schema='')
$checkboolean是否开启完整性检查。
$schemastring各表schema。默认为空字符串,意味着当前或默认schema。
源码: framework/db/schema/mssql/CMssqlSchema.php#111 (显示) publicfunctioncheckIntegrity($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("ALTERTABLE$tableName$enableCONSTRAINTALL")->execute();
}
}

启用或禁用完整性检查。

compareTableNames() 方法
public boolean compareTableNames(string $name1, string $name2)
$name1string表名1
$name2string表名2
{return}boolean两个表名是否指向同一个表。
源码: framework/db/schema/mssql/CMssqlSchema.php#75 (显示) publicfunctioncompareTableNames($name1,$name2)
{
$name1=str_replace(array('[',']'),'',$name1);
$name2=str_replace(array('[',']'),'',$name2);
returnparent::compareTableNames(strtolower($name1),strtolower($name2));
}

比较两个表的名称。 表名可以是被引用或未引用的。该方法 会考虑这两种情况。

createColumn() 方法
protected CDbColumnSchema createColumn(array $column)
$columnarray列元数据
{return}CDbColumnSchema规范的列元数据
源码: framework/db/schema/mssql/CMssqlSchema.php#315 (显示) protectedfunctioncreateColumn($column)
{
$c=newCMssqlColumnSchema;
$c->name=$column['COLUMN_NAME'];
$c->rawName=$this->quoteColumnName($c->name);
$c->allowNull=$column['IS_NULLABLE']=='YES';
if($column['NUMERIC_PRECISION_RADIX']!==null)
{
//Wehaveanumericdatatype
$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->init($column['DATA_TYPE'],$column['COLUMN_DEFAULT']);
return$c;
}

创建一个列。

createCommandBuilder() 方法
protected CDbCommandBuilder createCommandBuilder()
{return}CDbCommandBuilder命令构建器实例
源码: framework/db/schema/mssql/CMssqlSchema.php#376 (显示) protectedfunctioncreateCommandBuilder()
{
returnnewCMssqlCommandBuilder($this);
}

为数据库创建命令构造器。 该方法可以被子类重写以创建一个指定MSSQL的命令构建器。

findColumns() 方法
protected boolean findColumns(CMssqlTableSchema $table)
$tableCMssqlTableSchema表元数据
{return}boolean表是否存在于数据库里
源码: framework/db/schema/mssql/CMssqlSchema.php#276 (显示) protectedfunctionfindColumns($table)
{
$columnsTable="INFORMATION_SCHEMA.COLUMNS";
$where=array();
$where[]="TABLE_NAME='".$table->name."'";
if(isset($table->catalogName))
{
$where[]="TABLE_CATALOG='".$table->catalogName."'";
$columnsTable=$table->catalogName.'.'.$columnsTable;
}
if(isset($table->schemaName))
$where[]="TABLE_SCHEMA='".$table->schemaName."'";

$sql="SELECT*,columnproperty(object_id(table_schema+'.'+table_name),column_name,'IsIdentity')asIsIdentity".
"FROM".$this->quoteTableName($columnsTable)."WHERE".join('AND',$where);
if(($columns=$this->getDbConnection()->createCommand($sql)->queryAll())===array())
returnfalse;

foreach($columnsas$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;
}
returntrue;
}

收集表的列元数据。

findForeignKeys() 方法
protected array findForeignKeys(CMssqlTableSchema $table)
$tableCMssqlTableSchema
{return}array外键关系表名和键。
源码: framework/db/schema/mssql/CMssqlSchema.php#223 (显示) protectedfunctionfindForeignKeys($table)
{
$rc='INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS';
$kcu='INFORMATION_SCHEMA.KEY_COLUMN_USAGE';
if(isset($table->catalogName))
{
$kcu=$table->catalogName.'.'.$kcu;
$rc=$table->catalogName.'.'.$rc;
}

//Fromhttp://msdn2.microsoft.com/en-us/library/aa175805(SQL.80).aspx
$sql=<<<EOD
SELECT
KCU1.CONSTRAINT_NAMEAS'FK_CONSTRAINT_NAME'
,KCU1.TABLE_NAMEAS'FK_TABLE_NAME'
,KCU1.COLUMN_NAMEAS'FK_COLUMN_NAME'
,KCU1.ORDINAL_POSITIONAS'FK_ORDINAL_POSITION'
,KCU2.CONSTRAINT_NAMEAS'UQ_CONSTRAINT_NAME'
,KCU2.TABLE_NAMEAS'UQ_TABLE_NAME'
,KCU2.COLUMN_NAMEAS'UQ_COLUMN_NAME'
,KCU2.ORDINAL_POSITIONAS'UQ_ORDINAL_POSITION'
FROM{$this->quoteTableName($rc)}RC
JOIN{$this->quoteTableName($kcu)}KCU1
ONKCU1.CONSTRAINT_CATALOG=RC.CONSTRAINT_CATALOG
ANDKCU1.CONSTRAINT_SCHEMA=RC.CONSTRAINT_SCHEMA
ANDKCU1.CONSTRAINT_NAME=RC.CONSTRAINT_NAME
JOIN{$this->quoteTableName($kcu)}KCU2
ONKCU2.CONSTRAINT_CATALOG=
RC.UNIQUE_CONSTRAINT_CATALOG
ANDKCU2.CONSTRAINT_SCHEMA=
RC.UNIQUE_CONSTRAINT_SCHEMA
ANDKCU2.CONSTRAINT_NAME=
RC.UNIQUE_CONSTRAINT_NAME
ANDKCU2.ORDINAL_POSITION=KCU1.ORDINAL_POSITION
WHEREKCU1.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)
$tableCMssqlTableSchema
{return}mixed主键(若主键不存在则返回null,单一主键则返回字符串,复合主键则返回数组)。
源码: framework/db/schema/mssql/CMssqlSchema.php#182 (显示) protectedfunctionfindPrimaryKey($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
SELECTk.column_namefield_name
FROM{$this->quoteTableName($kcu)}k
LEFTJOIN{$this->quoteTableName($tc)}c
ONk.table_name=c.table_name
ANDk.constraint_name=c.constraint_name
WHEREc.constraint_type='PRIMARYKEY'
ANDk.table_name=:table
ANDk.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))
{
case0://Noprimarykeyontable
$primary=null;
break;
case1://Only1primarykey
$primary=$primary[0];
break;
}
return$primary;
}

从给定表中获得主键列的详细信息。

findTableNames() 方法
protected array findTableNames(string $schema='', boolean $includeViews=true)
$schemastring表schema。默认是空字符串,意味着当前或默认schema。 若为空,则返回的表名会被加上schema名前缀。
$includeViewsboolean是否在结果中包含视图。默认为true。
{return}array数据库里的所有表名。
源码: framework/db/schema/mssql/CMssqlSchema.php#344 (显示) protectedfunctionfindTableNames($schema='',$includeViews=true)
{
if($schema==='')
$schema=self::DEFAULT_SCHEMA;
if($includeViews)
$condition="TABLE_TYPEin('BASETABLE','VIEW')";
else
$condition="TABLE_TYPE='BASETABLE'";
$sql=<<<EOD
SELECTTABLE_NAME,TABLE_SCHEMAFROM[INFORMATION_SCHEMA].[TABLES]
WHERETABLE_SCHEMA=:schemaAND$condition
EOD;
$command=$this->getDbConnection()->createCommand($sql);
$command->bindParam(":schema",$schema);
$rows=$command->queryAll();
$names=array();
foreach($rowsas$row)
{
if($schema==self::DEFAULT_SCHEMA)
$names[]=$row['TABLE_NAME'];
else
$names[]=$schema.'.'.$row['TABLE_SCHEMA'].'.'.$row['TABLE_NAME'];
}

return$names;
}

返回所有数据库里的表名。

loadTable() 方法
protected CMssqlTableSchema loadTable(string $name)
$namestring表名
{return}CMssqlTableSchema取决于表元数据的驱动。若表不存在则返回null。
源码: framework/db/schema/mssql/CMssqlSchema.php#129 (显示) protectedfunctionloadTable($name)
{
$table=newCMssqlTableSchema;
$this->resolveTableNames($table,$name);
//if(!in_array($table->name,$this->tableNames))returnnull;
$table->primaryKey=$this->findPrimaryKey($table);
$table->foreignKeys=$this->findForeignKeys($table);
if($this->findColumns($table))
{
return$table;
}
else
returnnull;
}

为指定表载入元数据。

quoteSimpleColumnName() 方法 (可用自 v1.1.6)
public string quoteSimpleColumnName(string $name)
$namestring列名
{return}string正确引用的列名
源码: framework/db/schema/mssql/CMssqlSchema.php#62 (显示) publicfunctionquoteSimpleColumnName($name)
{
return'['.$name.']';
}

用引号引用列名以便查询时使用。 一个不包括前缀的简单列名。

quoteSimpleTableName() 方法 (可用自 v1.1.6)
public string quoteSimpleTableName(string $name)
$namestring表名
{return}string正确引用的表名
源码: framework/db/schema/mssql/CMssqlSchema.php#50 (显示) publicfunctionquoteSimpleTableName($name)
{
return'['.$name.']';
}

用引号引用表名以便查询时使用。 一个不包括前缀的简单表名。

renameColumn() 方法 (可用自 v1.1.6)
public string renameColumn(string $table, string $name, string $newName)
$tablestring要重命名的列所在表。该表名会被指定方法正确引用。
$namestring原有列名。该列名会被指定方法正确引用。
$newNamestring新列名。该列名会被指定方法正确引用。
{return}string重命名列的SQL语句。
源码: framework/db/schema/mssql/CMssqlSchema.php#401 (显示) publicfunctionrenameColumn($table,$name,$newName)
{
return"sp_rename'$table.$name','$newName','COLUMN'";
}

构造重命名列的SQL语句。

renameTable() 方法 (可用自 v1.1.6)
public string renameTable(string $table, string $newName)
$tablestring要重命名的表。该表名会被指定方法正确引用。
$newNamestring新表名。 该表名会被指定方法正确引用。
{return}string重命名数据表的SQL语句。
源码: framework/db/schema/mssql/CMssqlSchema.php#388 (显示) publicfunctionrenameTable($table,$newName)
{
return"sp_rename'$table','$newName'";
}

构造重命名表的SQL语句。

resetSequence() 方法 (可用自 v1.1)
public void resetSequence(CDbTableSchema $table, mixed $value=NULL)
$tableCDbTableSchema要重置主键序列的表schema
$valuemixed新插入行的主键值。如果未设置, 则新行主键值为1。
源码: framework/db/schema/mssql/CMssqlSchema.php#91 (显示) publicfunctionresetSequence($table,$value=null)
{
if($table->sequenceName!==null)
{
$db=$this->getDbConnection();
if($value===null)
$value=$db->createCommand("SELECTMAX(`{$table->primaryKey}`)FROM{$table->rawName}")->queryScalar();
$value=(int)$value;
$name=strtr($table->rawName,array('['=>'',']'=>''));
$db->createCommand("DBCCCHECKIDENT('$name',RESEED,$value)")->execute();
}
}

重置表的主键的序列值。 序列会被充值,这样一来,新插入行的主键值 将会是指定值或者1。

resolveTableNames() 方法
protected void resolveTableNames(CMssqlTableSchema $table, string $name)
$tableCMssqlTableSchema表实例
$namestring未引用的表名
源码: framework/db/schema/mssql/CMssqlSchema.php#149 (显示) protectedfunctionresolveTableNames($table,$name)
{
$parts=explode('.',str_replace(array('[',']'),'',$name));
if(($c=count($parts))==3)
{
//Catalogname,schemanameandtablenameprovided
$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)
{
//Onlyschemanameandtablenameprovided
$table->name=$parts[1];
$table->schemaName=$parts[0];
$table->rawName=$this->quoteTableName($table->schemaName).'.'.$this->quoteTableName($table->name);
}
else
{
//Onlythenamegiven,weneedtogetatleasttheschemaname
//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);
}
}

生成各种表名。