CMssqlSchema
优质
小牛编辑
135浏览
2023-12-01
所有包 | 属性 | 方法
CMssqlSchema是从MSSQL数据库检索元数据信息的类。
源码: framework/db/schema/mssql/CMssqlSchema.php#416 (显示)
源码: framework/db/schema/mssql/CMssqlSchema.php#111 (显示)
源码: framework/db/schema/mssql/CMssqlSchema.php#75 (显示)
源码: framework/db/schema/mssql/CMssqlSchema.php#315 (显示)
源码: framework/db/schema/mssql/CMssqlSchema.php#376 (显示)
源码: framework/db/schema/mssql/CMssqlSchema.php#276 (显示)
源码: framework/db/schema/mssql/CMssqlSchema.php#223 (显示)
源码: framework/db/schema/mssql/CMssqlSchema.php#182 (显示)
源码: framework/db/schema/mssql/CMssqlSchema.php#344 (显示)
源码: framework/db/schema/mssql/CMssqlSchema.php#129 (显示)
源码: framework/db/schema/mssql/CMssqlSchema.php#62 (显示)
源码: framework/db/schema/mssql/CMssqlSchema.php#50 (显示)
源码: framework/db/schema/mssql/CMssqlSchema.php#401 (显示)
源码: framework/db/schema/mssql/CMssqlSchema.php#388 (显示)
源码: framework/db/schema/mssql/CMssqlSchema.php#91 (显示)
源码: framework/db/schema/mssql/CMssqlSchema.php#149 (显示)
包 | 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 |
公共属性
隐藏继承属性
属性 | 类型 | 描述 | 定义在 |
---|---|---|---|
columnTypes | array | 映射到实体列类型的抽象列类型。 | CMssqlSchema |
commandBuilder | CDbCommandBuilder | the SQL command builder for this connection. | CDbSchema |
dbConnection | CDbConnection | database connection. | CDbSchema |
tableNames | array | Returns all table names in the database. | CDbSchema |
tables | array | Returns 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) | ||
$table | string | 要改变的列所在表。该表名会被指定方法正确引用。 |
$column | string | 要改变的列名。该列名会被指定方法正确引用。 |
$type | string | 新的列类型。getColumnType方法会被调用来将虚拟列类型(若存在) 转换为对应的实体列类型。任何未被识别为虚拟类型的类型会被保留在生成的SQL中。 例如,‘string’会被转为‘varchar(255)’,而‘string not null’会被转为‘varchar(255) not null’。 |
{return} | string | 改变列定义的SQL语句。 |
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='') | ||
$check | boolean | 是否开启完整性检查。 |
$schema | string | 各表schema。默认为空字符串,意味着当前或默认schema。 |
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) | ||
$name1 | string | 表名1 |
$name2 | string | 表名2 |
{return} | boolean | 两个表名是否指向同一个表。 |
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) | ||
$column | array | 列元数据 |
{return} | CDbColumnSchema | 规范的列元数据 |
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 | 命令构建器实例 |
protectedfunctioncreateCommandBuilder()
{
returnnewCMssqlCommandBuilder($this);
}
为数据库创建命令构造器。 该方法可以被子类重写以创建一个指定MSSQL的命令构建器。
findColumns() 方法protected boolean findColumns(CMssqlTableSchema $table) | ||
$table | CMssqlTableSchema | 表元数据 |
{return} | boolean | 表是否存在于数据库里 |
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) | ||
$table | CMssqlTableSchema | 表 |
{return} | array | 外键关系表名和键。 |
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) | ||
$table | CMssqlTableSchema | 表 |
{return} | mixed | 主键(若主键不存在则返回null,单一主键则返回字符串,复合主键则返回数组)。 |
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) | ||
$schema | string | 表schema。默认是空字符串,意味着当前或默认schema。 若为空,则返回的表名会被加上schema名前缀。 |
$includeViews | boolean | 是否在结果中包含视图。默认为true。 |
{return} | array | 数据库里的所有表名。 |
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) | ||
$name | string | 表名 |
{return} | CMssqlTableSchema | 取决于表元数据的驱动。若表不存在则返回null。 |
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) | ||
$name | string | 列名 |
{return} | string | 正确引用的列名 |
publicfunctionquoteSimpleColumnName($name)
{
return'['.$name.']';
}
用引号引用列名以便查询时使用。 一个不包括前缀的简单列名。
quoteSimpleTableName() 方法 (可用自 v1.1.6)public string quoteSimpleTableName(string $name) | ||
$name | string | 表名 |
{return} | string | 正确引用的表名 |
publicfunctionquoteSimpleTableName($name)
{
return'['.$name.']';
}
用引号引用表名以便查询时使用。 一个不包括前缀的简单表名。
renameColumn() 方法 (可用自 v1.1.6)public string renameColumn(string $table, string $name, string $newName) | ||
$table | string | 要重命名的列所在表。该表名会被指定方法正确引用。 |
$name | string | 原有列名。该列名会被指定方法正确引用。 |
$newName | string | 新列名。该列名会被指定方法正确引用。 |
{return} | string | 重命名列的SQL语句。 |
publicfunctionrenameColumn($table,$name,$newName)
{
return"sp_rename'$table.$name','$newName','COLUMN'";
}
构造重命名列的SQL语句。
renameTable() 方法 (可用自 v1.1.6)public string renameTable(string $table, string $newName) | ||
$table | string | 要重命名的表。该表名会被指定方法正确引用。 |
$newName | string | 新表名。 该表名会被指定方法正确引用。 |
{return} | string | 重命名数据表的SQL语句。 |
publicfunctionrenameTable($table,$newName)
{
return"sp_rename'$table','$newName'";
}
构造重命名表的SQL语句。
resetSequence() 方法 (可用自 v1.1)public void resetSequence(CDbTableSchema $table, mixed $value=NULL) | ||
$table | CDbTableSchema | 要重置主键序列的表schema |
$value | mixed | 新插入行的主键值。如果未设置, 则新行主键值为1。 |
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) | ||
$table | CMssqlTableSchema | 表实例 |
$name | string | 未引用的表名 |
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);
}
}
生成各种表名。