[ticket/9725] Do not use deprecated views to remove default constraints

PHPBB3-9725
This commit is contained in:
Patrick Webster 2014-03-03 00:37:22 -06:00
parent 31e610f0b1
commit aaa846cb3a

View file

@ -1815,22 +1815,49 @@ class phpbb_db_tools
case 'mssql': case 'mssql':
case 'mssqlnative': case 'mssqlnative':
// remove default cosntraints first $sql = "SELECT CAST(SERVERPROPERTY('productversion') AS VARCHAR(25)) AS mssql_version";
// http://msdn.microsoft.com/en-us/library/aa175912%28v=sql.80%29.aspx $result = $this->db->sql_query($sql);
$statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000) $row = $this->db->sql_fetchrow($result);
SET @drop_default_name = $this->db->sql_freeresult($result);
(SELECT so.name FROM sysobjects so
JOIN sysconstraints sc ON so.id = sc.constid // Remove default constraints
WHERE object_name(so.parent_obj) = '{$table_name}' if ($row['mssql_version'][0] == '8') // SQL Server 2000
AND so.xtype = 'D' {
AND sc.colid = (SELECT colid FROM syscolumns // http://msdn.microsoft.com/en-us/library/aa175912%28v=sql.80%29.aspx
WHERE id = object_id('{$table_name}') // Deprecated in SQL Server 2005
AND name = '{$column_name}')) $statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000)
IF @drop_default_name <> '' SET @drop_default_name =
BEGIN (SELECT so.name FROM sysobjects so
SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']' JOIN sysconstraints sc ON so.id = sc.constid
EXEC(@cmd) WHERE object_name(so.parent_obj) = '{$table_name}'
END"; AND so.xtype = 'D'
AND sc.colid = (SELECT colid FROM syscolumns
WHERE id = object_id('{$table_name}')
AND name = '{$column_name}'))
IF @drop_default_name <> ''
BEGIN
SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']'
EXEC(@cmd)
END";
}
else
{
$sql = "SELECT dobj.name AS def_name
FROM sys.columns col
LEFT OUTER JOIN sys.objects dobj ON (dobj.object_id = col.default_object_id AND dobj.type = 'D')
WHERE col.object_id = object_id('{$table_name}')
AND col.name = '{$column_name}'
AND dobj.name IS NOT NULL";
$result = $this->db->sql_query($sql);
$row = $this->db->sql_fetchrow($result);
$this->db->sql_freeresult($result);
if ($row)
{
$statements[] = 'ALTER TABLE [' . $table_name . '] DROP CONSTRAINT [' . $row['def_name'] . ']';
}
}
$statements[] = 'ALTER TABLE [' . $table_name . '] DROP COLUMN [' . $column_name . ']'; $statements[] = 'ALTER TABLE [' . $table_name . '] DROP COLUMN [' . $column_name . ']';
break; break;
@ -2317,23 +2344,48 @@ class phpbb_db_tools
if (!empty($column_data['default'])) if (!empty($column_data['default']))
{ {
$sql = "SELECT CAST(SERVERPROPERTY('productversion') AS VARCHAR(25)) AS mssql_version";
$result = $this->db->sql_query($sql);
$row = $this->db->sql_fetchrow($result);
$this->db->sql_freeresult($result);
// Using TRANSACT-SQL for this statement because we do not want to have colliding data if statements are executed at a later stage // Using TRANSACT-SQL for this statement because we do not want to have colliding data if statements are executed at a later stage
$statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000) if ($row['mssql_version'][0] == '8') // SQL Server 2000
SET @drop_default_name = {
(SELECT so.name FROM sysobjects so $statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000)
JOIN sysconstraints sc ON so.id = sc.constid SET @drop_default_name =
WHERE object_name(so.parent_obj) = '{$table_name}' (SELECT so.name FROM sysobjects so
AND so.xtype = 'D' JOIN sysconstraints sc ON so.id = sc.constid
AND sc.colid = (SELECT colid FROM syscolumns WHERE object_name(so.parent_obj) = '{$table_name}'
WHERE id = object_id('{$table_name}') AND so.xtype = 'D'
AND name = '{$column_name}')) AND sc.colid = (SELECT colid FROM syscolumns
IF @drop_default_name <> '' WHERE id = object_id('{$table_name}')
BEGIN AND name = '{$column_name}'))
SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']' IF @drop_default_name <> ''
EXEC(@cmd) BEGIN
END SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']'
SET @cmd = 'ALTER TABLE [{$table_name}] ADD CONSTRAINT [DF_{$table_name}_{$column_name}_1] {$column_data['default']} FOR [{$column_name}]' EXEC(@cmd)
EXEC(@cmd)"; END
SET @cmd = 'ALTER TABLE [{$table_name}] ADD CONSTRAINT [DF_{$table_name}_{$column_name}_1] {$column_data['default']} FOR [{$column_name}]'
EXEC(@cmd)";
}
else
{
$statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000)
SET @drop_default_name =
(SELECT dobj.name FROM sys.columns col
LEFT OUTER JOIN sys.objects dobj ON (dobj.object_id = col.default_object_id AND dobj.type = 'D')
WHERE col.object_id = object_id('{$table_name}')
AND col.name = '{$column_name}'
AND dobj.name IS NOT NULL)
IF @drop_default_name <> ''
BEGIN
SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']'
EXEC(@cmd)
END
SET @cmd = 'ALTER TABLE [{$table_name}] ADD CONSTRAINT [DF_{$table_name}_{$column_name}_1] {$column_data['default']} FOR [{$column_name}]'
EXEC(@cmd)";
}
} }
break; break;