Author: tomdz
Date: Thu May 18 16:19:09 2006
New Revision: 407659
URL: http://svn.apache.org/viewvc?rev=407659&view=rev
Log:
Fixed/enhanced Sql Server platform
Modified:
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java
db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java
db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMSSqlPlatform.java
Modified:
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java
URL:
http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java?rev=407659&r1=407658&r2=407659&view=diff
==============================================================================
---
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java
(original)
+++
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java
Thu May 18 16:19:09 2006
@@ -20,14 +20,27 @@
import java.io.StringWriter;
import java.io.Writer;
import java.sql.Types;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import org.apache.ddlutils.Platform;
+import org.apache.ddlutils.alteration.AddColumnChange;
+import org.apache.ddlutils.alteration.AddPrimaryKeyChange;
+import org.apache.ddlutils.alteration.ColumnAutoIncrementChange;
+import org.apache.ddlutils.alteration.ColumnChange;
+import org.apache.ddlutils.alteration.PrimaryKeyChange;
+import org.apache.ddlutils.alteration.RemoveColumnChange;
+import org.apache.ddlutils.alteration.RemovePrimaryKeyChange;
+import org.apache.ddlutils.alteration.TableChange;
import org.apache.ddlutils.model.Column;
import org.apache.ddlutils.model.Database;
import org.apache.ddlutils.model.ForeignKey;
import org.apache.ddlutils.model.Index;
import org.apache.ddlutils.model.Table;
+import org.apache.ddlutils.platform.CreationParameters;
import org.apache.ddlutils.platform.SqlBuilder;
import org.apache.ddlutils.util.Jdbc3Utils;
@@ -97,28 +110,22 @@
printAlwaysSingleQuotedIdentifier(tableName);
println(")");
println("BEGIN");
- println(" DECLARE @reftable nvarchar(60), @constraintname
nvarchar(60)");
- println(" DECLARE refcursor CURSOR FOR");
- println(" select reftables.name tablename, cons.name
constraintname");
- println(" from sysobjects tables,");
- println(" sysobjects reftables,");
- println(" sysobjects cons,");
- println(" sysreferences ref");
- println(" where tables.id = ref.rkeyid");
- println(" and cons.id = ref.constid");
- println(" and reftables.id = ref.fkeyid");
- print(" and tables.name = ");
+ println(" DECLARE @tablename nvarchar(60), @constraintname
nvarchar(60)");
+ println(" DECLARE refcursor CURSOR FOR");
+ println(" SELECT object_name(objs.parent_obj) tablename, objs.name
constraintname");
+ println(" FROM sysobjects objs JOIN sysconstraints cons ON objs.id
= cons.constid");
+ print(" WHERE objs.xtype != 'PK' AND object_name(objs.parent_obj) =
");
printAlwaysSingleQuotedIdentifier(tableName);
- println(" OPEN refcursor");
- println(" FETCH NEXT from refcursor into @reftable,
@constraintname");
- println(" while @@FETCH_STATUS = 0");
- println(" BEGIN");
- println(" exec ('alter table '[EMAIL PROTECTED]' drop constraint
'[EMAIL PROTECTED])");
- println(" FETCH NEXT from refcursor into @reftable,
@constraintname");
- println(" END");
- println(" CLOSE refcursor");
- println(" DEALLOCATE refcursor");
- print(" DROP TABLE ");
+ println(" OPEN refcursor");
+ println(" FETCH NEXT FROM refcursor INTO @tablename,
@constraintname");
+ println(" WHILE @@FETCH_STATUS = 0");
+ println(" BEGIN");
+ println(" EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP CONSTRAINT
'[EMAIL PROTECTED])");
+ println(" FETCH NEXT FROM refcursor INTO @tablename,
@constraintname");
+ println(" END");
+ println(" CLOSE refcursor");
+ println(" DEALLOCATE refcursor");
+ print(" DROP TABLE ");
printlnIdentifier(tableName);
print("END");
printEndOfStatement();
@@ -188,7 +195,7 @@
{
String constraintName = getForeignKeyName(table, foreignKey);
- print("IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'RI' AND name
= ");
+ print("IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'F' AND name =
");
printAlwaysSingleQuotedIdentifier(constraintName);
println(")");
printIndent();
@@ -263,6 +270,314 @@
print("'");
print(identifier);
print("'");
+ }
+
+ /**
+ * [EMAIL PROTECTED]
+ */
+ protected void writeCopyDataStatement(Table sourceTable, Table
targetTable) throws IOException
+ {
+ // Sql Server per default does not allow us to insert values
explicitly into
+ // identity columns. However, we can change this behavior
+ boolean hasIdentityColumns =
targetTable.getAutoIncrementColumns().length > 0;
+
+ if (hasIdentityColumns)
+ {
+ print("SET IDENTITY_INSERT ");
+ printIdentifier(getTableName(targetTable));
+ print(" ON");
+ printEndOfStatement();
+ }
+ super.writeCopyDataStatement(sourceTable, targetTable);
+ // We have to turn it off ASAP because it can be on only for one table
per session
+ if (hasIdentityColumns)
+ {
+ print("SET IDENTITY_INSERT ");
+ printIdentifier(getTableName(targetTable));
+ print(" OFF");
+ printEndOfStatement();
+ }
+ }
+
+
+ /**
+ * [EMAIL PROTECTED]
+ */
+ protected void processChanges(Database currentModel, Database
desiredModel, List changes, CreationParameters params) throws IOException
+ {
+ if (!changes.isEmpty())
+ {
+ writeQuotationOnStatement();
+ }
+ super.processChanges(currentModel, desiredModel, changes, params);
+ }
+
+ /**
+ * [EMAIL PROTECTED]
+ */
+ protected void processTableStructureChanges(Database currentModel,
+ Database desiredModel,
+ Table sourceTable,
+ Table targetTable,
+ Map parameters,
+ List changes) throws
IOException
+ {
+ // First we drop primary keys as necessary
+ for (Iterator changeIt = changes.iterator(); changeIt.hasNext();)
+ {
+ TableChange change = (TableChange)changeIt.next();
+
+ if (change instanceof RemovePrimaryKeyChange)
+ {
+ processChange(currentModel, desiredModel,
(RemovePrimaryKeyChange)change);
+ change.apply(currentModel);
+ changeIt.remove();
+ }
+ else if (change instanceof PrimaryKeyChange)
+ {
+ PrimaryKeyChange pkChange =
(PrimaryKeyChange)change;
+ RemovePrimaryKeyChange removePkChange = new
RemovePrimaryKeyChange(pkChange.getChangedTable(),
+
pkChange.getOldPrimaryKeyColumns());
+
+ processChange(currentModel, desiredModel, removePkChange);
+ removePkChange.apply(currentModel);
+ }
+ }
+
+
+ ArrayList columnChanges = new ArrayList();
+
+ // Next we add/remove columns
+ for (Iterator changeIt = changes.iterator(); changeIt.hasNext();)
+ {
+ TableChange change = (TableChange)changeIt.next();
+
+ if (change instanceof AddColumnChange)
+ {
+ AddColumnChange addColumnChange = (AddColumnChange)change;
+
+ // Oracle can only add not insert columns
+ if (addColumnChange.isAtEnd())
+ {
+ processChange(currentModel, desiredModel, addColumnChange);
+ change.apply(currentModel);
+ changeIt.remove();
+ }
+ }
+ else if (change instanceof RemoveColumnChange)
+ {
+ processChange(currentModel, desiredModel,
(RemoveColumnChange)change);
+ change.apply(currentModel);
+ changeIt.remove();
+ }
+ else if (change instanceof ColumnAutoIncrementChange)
+ {
+ // Sql Server has no way of adding or removing a IDENTITY
constraint
+ // Thus we have to rebuild the table anyway and can ignore all
the other
+ // column changes
+ columnChanges = null;
+ }
+ else if ((change instanceof ColumnChange) && (columnChanges !=
null))
+ {
+ // we gather all changed columns because we can use the ALTER
TABLE ALTER COLUMN
+ // statement for them
+ columnChanges.add(change);
+ }
+ }
+ if (columnChanges != null)
+ {
+ HashSet processedColumns = new HashSet();
+
+ for (Iterator changeIt = columnChanges.iterator();
changeIt.hasNext();)
+ {
+ ColumnChange change = (ColumnChange)changeIt.next();
+ Column sourceColumn = change.getChangedColumn();
+ Column targetColumn =
targetTable.findColumn(sourceColumn.getName(),
getPlatform().isDelimitedIdentifierModeOn());
+
+ if (!processedColumns.contains(targetColumn))
+ {
+ processColumnChange(sourceTable, targetTable,
sourceColumn, targetColumn);
+ processedColumns.add(targetColumn);
+ }
+ changes.remove(change);
+ change.apply(currentModel);
+ }
+ }
+ // Finally we add primary keys
+ for (Iterator changeIt = changes.iterator(); changeIt.hasNext();)
+ {
+ TableChange change = (TableChange)changeIt.next();
+
+ if (change instanceof AddPrimaryKeyChange)
+ {
+ processChange(currentModel, desiredModel,
(AddPrimaryKeyChange)change);
+ change.apply(currentModel);
+ changeIt.remove();
+ }
+ else if (change instanceof PrimaryKeyChange)
+ {
+ PrimaryKeyChange pkChange = (PrimaryKeyChange)change;
+ AddPrimaryKeyChange addPkChange = new
AddPrimaryKeyChange(pkChange.getChangedTable(),
+
pkChange.getNewPrimaryKeyColumns());
+
+ processChange(currentModel, desiredModel, addPkChange);
+ addPkChange.apply(currentModel);
+ changeIt.remove();
+ }
+ }
+ }
+
+
+ /**
+ * Processes the addition of a column to a table.
+ *
+ * @param currentModel The current database schema
+ * @param desiredModel The desired database schema
+ * @param change The change object
+ */
+ protected void processChange(Database currentModel,
+ Database desiredModel,
+ AddColumnChange change) throws IOException
+ {
+ print("ALTER TABLE ");
+ printlnIdentifier(getTableName(change.getChangedTable()));
+ printIndent();
+ print("ADD ");
+ writeColumn(change.getChangedTable(), change.getNewColumn());
+ printEndOfStatement();
+ }
+
+ /**
+ * Processes the removal of a column from a table.
+ *
+ * @param currentModel The current database schema
+ * @param desiredModel The desired database schema
+ * @param change The change object
+ */
+ protected void processChange(Database currentModel,
+ Database desiredModel,
+ RemoveColumnChange change) throws IOException
+ {
+ print("ALTER TABLE ");
+ printlnIdentifier(getTableName(change.getChangedTable()));
+ printIndent();
+ print("DROP COLUMN ");
+ printIdentifier(getColumnName(change.getColumn()));
+ printEndOfStatement();
+ }
+
+ /**
+ * Processes the removal of a primary key from a table.
+ *
+ * @param currentModel The current database schema
+ * @param desiredModel The desired database schema
+ * @param change The change object
+ */
+ protected void processChange(Database currentModel,
+ Database desiredModel,
+ RemovePrimaryKeyChange change) throws
IOException
+ {
+ // TODO: this would be easier when named primary keys are supported
+ // because then we can use ALTER TABLE DROP
+ String tableName = getTableName(change.getChangedTable());
+
+ println("BEGIN");
+ println(" DECLARE @tablename nvarchar(60), @constraintname
nvarchar(60)");
+ println(" DECLARE refcursor CURSOR FOR");
+ println(" SELECT object_name(objs.parent_obj) tablename, objs.name
constraintname");
+ println(" FROM sysobjects objs JOIN sysconstraints cons ON objs.id
= cons.constid");
+ print(" WHERE objs.xtype = 'PK' AND object_name(objs.parent_obj) =
");
+ printAlwaysSingleQuotedIdentifier(tableName);
+ println(" OPEN refcursor");
+ println(" FETCH NEXT FROM refcursor INTO @tablename,
@constraintname");
+ println(" WHILE @@FETCH_STATUS = 0");
+ println(" BEGIN");
+ println(" EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP CONSTRAINT
'[EMAIL PROTECTED])");
+ println(" FETCH NEXT FROM refcursor INTO @tablename,
@constraintname");
+ println(" END");
+ println(" CLOSE refcursor");
+ println(" DEALLOCATE refcursor");
+ print("END");
+ printEndOfStatement();
+ }
+
+ /**
+ * Processes a change to a column.
+ *
+ * @param sourceTable The current table
+ * @param targetTable The desired table
+ * @param sourceColumn The current column
+ * @param targetColumn The desired column
+ */
+ protected void processColumnChange(Table sourceTable,
+ Table targetTable,
+ Column sourceColumn,
+ Column targetColumn) throws IOException
+ {
+ boolean hasDefault = sourceColumn.getParsedDefaultValue() !=
null;
+ boolean shallHaveDefault = targetColumn.getParsedDefaultValue() !=
null;
+ String newDefault = targetColumn.getDefaultValue();
+
+ // Sql Server does not like it if there is a default spec in the ALTER
TABLE ALTER COLUMN
+ // statement; thus we have to change the default manually
+ if (newDefault != null)
+ {
+ targetColumn.setDefaultValue(null);
+ }
+ if (hasDefault)
+ {
+ // we're dropping the old default
+ String tableName = getTableName(sourceTable);
+ String columnName = getColumnName(sourceColumn);
+
+ println("BEGIN");
+ println(" DECLARE @tablename nvarchar(60), @constraintname
nvarchar(60)");
+ println(" DECLARE refcursor CURSOR FOR");
+ println(" SELECT object_name(objs.parent_obj) tablename,
objs.name constraintname");
+ println(" FROM sysobjects objs JOIN sysconstraints cons ON
objs.id = cons.constid");
+ println(" WHERE objs.xtype = 'D' AND");
+ print(" cons.colid = (SELECT colid FROM syscolumns WHERE
id = object_id(");
+ printAlwaysSingleQuotedIdentifier(tableName);
+ print(") AND name = ");
+ printAlwaysSingleQuotedIdentifier(columnName);
+ println(") AND");
+ print(" object_name(objs.parent_obj) = ");
+ printAlwaysSingleQuotedIdentifier(tableName);
+ println(" OPEN refcursor");
+ println(" FETCH NEXT FROM refcursor INTO @tablename,
@constraintname");
+ println(" WHILE @@FETCH_STATUS = 0");
+ println(" BEGIN");
+ println(" EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP
CONSTRAINT '[EMAIL PROTECTED])");
+ println(" FETCH NEXT FROM refcursor INTO @tablename,
@constraintname");
+ println(" END");
+ println(" CLOSE refcursor");
+ println(" DEALLOCATE refcursor");
+ print("END");
+ printEndOfStatement();
+ }
+
+ print("ALTER TABLE ");
+ printlnIdentifier(getTableName(sourceTable));
+ printIndent();
+ print("ALTER COLUMN ");
+ writeColumn(sourceTable, targetColumn);
+ printEndOfStatement();
+
+ if (shallHaveDefault)
+ {
+ targetColumn.setDefaultValue(newDefault);
+
+ // if the column shall have a default, then we have to add it as a
constraint
+ print("ALTER TABLE ");
+ printlnIdentifier(getTableName(sourceTable));
+ printIndent();
+ print("ADD CONSTRAINT ");
+ printIdentifier(getConstraintName("DF", sourceTable,
sourceColumn.getName(), null));
+ writeColumnDefaultValueStmt(sourceTable, targetColumn);
+ print(" FOR ");
+ printIdentifier(getColumnName(sourceColumn));
+ printEndOfStatement();
+ }
}
// TODO: DROP default is done via selecting the name of the constraint for
column avalue of table toundtrip
Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java
URL:
http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java?rev=407659&r1=407658&r2=407659&view=diff
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java
(original)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestAlteration.java Thu
May 18 16:19:09 2006
@@ -537,7 +537,10 @@
}
/**
- * Tests the addition of a column with a default value.
+ * Tests the addition of a column with a default value. Note that depending
+ * on whether the database supports this via a statement, this test may
fail.
+ * For instance, Sql Server has a statement for this which means that the
+ * existing value in column avalue won't be changed and thus the test
fails.
*/
public void testAddColumnWithDefault()
{
Modified:
db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMSSqlPlatform.java
URL:
http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMSSqlPlatform.java?rev=407659&r1=407658&r2=407659&view=diff
==============================================================================
---
db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMSSqlPlatform.java
(original)
+++
db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMSSqlPlatform.java
Thu May 18 16:19:09 2006
@@ -55,27 +55,20 @@
"SET quoted_identifier on;\n"+
"IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'U' AND name =
'coltype')\n"+
"BEGIN\n"+
- " DECLARE @reftable nvarchar(60), @constraintname
nvarchar(60)\n"+
- " DECLARE refcursor CURSOR FOR\n"+
- " select reftables.name tablename, cons.name constraintname\n"+
- " from sysobjects tables,\n"+
- " sysobjects reftables,\n"+
- " sysobjects cons,\n"+
- " sysreferences ref\n"+
- " where tables.id = ref.rkeyid\n"+
- " and cons.id = ref.constid\n"+
- " and reftables.id = ref.fkeyid\n"+
- " and tables.name = 'coltype'\n"+
- " OPEN refcursor\n"+
- " FETCH NEXT from refcursor into @reftable, @constraintname\n"+
- " while @@FETCH_STATUS = 0\n"+
- " BEGIN\n"+
- " exec ('alter table '[EMAIL PROTECTED]' drop constraint
'[EMAIL PROTECTED])\n"+
- " FETCH NEXT from refcursor into @reftable,
@constraintname\n"+
- " END\n"+
- " CLOSE refcursor\n"+
- " DEALLOCATE refcursor\n"+
- " DROP TABLE \"coltype\"\n"+
+ " DECLARE @tablename nvarchar(60), @constraintname
nvarchar(60)\n"+
+ " DECLARE refcursor CURSOR FOR\n"+
+ " SELECT object_name(objs.parent_obj) tablename, objs.name
constraintname\n"+
+ " FROM sysobjects objs JOIN sysconstraints cons ON objs.id =
cons.constid\n"+
+ " WHERE objs.xtype != 'PK' AND object_name(objs.parent_obj) =
'coltype' OPEN refcursor\n"+
+ " FETCH NEXT FROM refcursor INTO @tablename, @constraintname\n"+
+ " WHILE @@FETCH_STATUS = 0\n"+
+ " BEGIN\n"+
+ " EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP CONSTRAINT
'[EMAIL PROTECTED])\n"+
+ " FETCH NEXT FROM refcursor INTO @tablename,
@constraintname\n"+
+ " END\n"+
+ " CLOSE refcursor\n"+
+ " DEALLOCATE refcursor\n"+
+ " DROP TABLE \"coltype\"\n"+
"END;\n"+
"SET quoted_identifier on;\n"+
"CREATE TABLE \"coltype\"\n"+
@@ -127,27 +120,20 @@
"SET quoted_identifier on;\n"+
"IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'U' AND name =
'constraints')\n"+
"BEGIN\n"+
- " DECLARE @reftable nvarchar(60), @constraintname
nvarchar(60)\n"+
- " DECLARE refcursor CURSOR FOR\n"+
- " select reftables.name tablename, cons.name constraintname\n"+
- " from sysobjects tables,\n"+
- " sysobjects reftables,\n"+
- " sysobjects cons,\n"+
- " sysreferences ref\n"+
- " where tables.id = ref.rkeyid\n"+
- " and cons.id = ref.constid\n"+
- " and reftables.id = ref.fkeyid\n"+
- " and tables.name = 'constraints'\n"+
- " OPEN refcursor\n"+
- " FETCH NEXT from refcursor into @reftable, @constraintname\n"+
- " while @@FETCH_STATUS = 0\n"+
- " BEGIN\n"+
- " exec ('alter table '[EMAIL PROTECTED]' drop constraint
'[EMAIL PROTECTED])\n"+
- " FETCH NEXT from refcursor into @reftable,
@constraintname\n"+
- " END\n"+
- " CLOSE refcursor\n"+
- " DEALLOCATE refcursor\n"+
- " DROP TABLE \"constraints\"\n"+
+ " DECLARE @tablename nvarchar(60), @constraintname
nvarchar(60)\n"+
+ " DECLARE refcursor CURSOR FOR\n"+
+ " SELECT object_name(objs.parent_obj) tablename, objs.name
constraintname\n"+
+ " FROM sysobjects objs JOIN sysconstraints cons ON objs.id =
cons.constid\n"+
+ " WHERE objs.xtype != 'PK' AND object_name(objs.parent_obj) =
'constraints' OPEN refcursor\n"+
+ " FETCH NEXT FROM refcursor INTO @tablename, @constraintname\n"+
+ " WHILE @@FETCH_STATUS = 0\n"+
+ " BEGIN\n"+
+ " EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP CONSTRAINT
'[EMAIL PROTECTED])\n"+
+ " FETCH NEXT FROM refcursor INTO @tablename,
@constraintname\n"+
+ " END\n"+
+ " CLOSE refcursor\n"+
+ " DEALLOCATE refcursor\n"+
+ " DROP TABLE \"constraints\"\n"+
"END;\n"+
"SET quoted_identifier on;\n"+
"CREATE TABLE \"constraints\"\n"+
@@ -170,86 +156,65 @@
{
assertEqualsIgnoringWhitespaces(
"SET quoted_identifier on;\n"+
- "IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'RI' AND name =
'testfk')\n"+
+ "IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'F' AND name =
'testfk')\n"+
" ALTER TABLE \"table3\" DROP CONSTRAINT \"testfk\";\n"+
"SET quoted_identifier on;\n"+
- "IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'RI' AND name =
'table2_FK_COL_FK_1_COL_FK_2_table1')\n"+
+ "IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'F' AND name =
'table2_FK_COL_FK_1_COL_FK_2_table1')\n"+
" ALTER TABLE \"table2\" DROP CONSTRAINT
\"table2_FK_COL_FK_1_COL_FK_2_table1\";\n"+
"SET quoted_identifier on;\n"+
"SET quoted_identifier on;\n"+
"IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'U' AND name =
'table3')\n"+
"BEGIN\n"+
- " DECLARE @reftable nvarchar(60), @constraintname
nvarchar(60)\n"+
- " DECLARE refcursor CURSOR FOR\n"+
- " select reftables.name tablename, cons.name constraintname\n"+
- " from sysobjects tables,\n"+
- " sysobjects reftables,\n"+
- " sysobjects cons,\n"+
- " sysreferences ref\n"+
- " where tables.id = ref.rkeyid\n"+
- " and cons.id = ref.constid\n"+
- " and reftables.id = ref.fkeyid\n"+
- " and tables.name = 'table3'\n"+
- " OPEN refcursor\n"+
- " FETCH NEXT from refcursor into @reftable, @constraintname\n"+
- " while @@FETCH_STATUS = 0\n"+
- " BEGIN\n"+
- " exec ('alter table '[EMAIL PROTECTED]' drop constraint
'[EMAIL PROTECTED])\n"+
- " FETCH NEXT from refcursor into @reftable,
@constraintname\n"+
- " END\n"+
- " CLOSE refcursor\n"+
- " DEALLOCATE refcursor\n"+
- " DROP TABLE \"table3\"\n"+
+ " DECLARE @tablename nvarchar(60), @constraintname
nvarchar(60)\n"+
+ " DECLARE refcursor CURSOR FOR\n"+
+ " SELECT object_name(objs.parent_obj) tablename, objs.name
constraintname\n"+
+ " FROM sysobjects objs JOIN sysconstraints cons ON objs.id =
cons.constid\n"+
+ " WHERE objs.xtype != 'PK' AND object_name(objs.parent_obj) =
'table3' OPEN refcursor\n"+
+ " FETCH NEXT FROM refcursor INTO @tablename, @constraintname\n"+
+ " WHILE @@FETCH_STATUS = 0\n"+
+ " BEGIN\n"+
+ " EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP CONSTRAINT
'[EMAIL PROTECTED])\n"+
+ " FETCH NEXT FROM refcursor INTO @tablename,
@constraintname\n"+
+ " END\n"+
+ " CLOSE refcursor\n"+
+ " DEALLOCATE refcursor\n"+
+ " DROP TABLE \"table3\"\n"+
"END;\n"+
"SET quoted_identifier on;\n"+
"IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'U' AND name =
'table2')\n"+
"BEGIN\n"+
- " DECLARE @reftable nvarchar(60), @constraintname
nvarchar(60)\n"+
- " DECLARE refcursor CURSOR FOR\n"+
- " select reftables.name tablename, cons.name constraintname\n"+
- " from sysobjects tables,\n"+
- " sysobjects reftables,\n"+
- " sysobjects cons,\n"+
- " sysreferences ref\n"+
- " where tables.id = ref.rkeyid\n"+
- " and cons.id = ref.constid\n"+
- " and reftables.id = ref.fkeyid\n"+
- " and tables.name = 'table2'\n"+
- " OPEN refcursor\n"+
- " FETCH NEXT from refcursor into @reftable, @constraintname\n"+
- " while @@FETCH_STATUS = 0\n"+
- " BEGIN\n"+
- " exec ('alter table '[EMAIL PROTECTED]' drop constraint
'[EMAIL PROTECTED])\n"+
- " FETCH NEXT from refcursor into @reftable,
@constraintname\n"+
- " END\n"+
- " CLOSE refcursor\n"+
- " DEALLOCATE refcursor\n"+
- " DROP TABLE \"table2\"\n"+
+ " DECLARE @tablename nvarchar(60), @constraintname
nvarchar(60)\n"+
+ " DECLARE refcursor CURSOR FOR\n"+
+ " SELECT object_name(objs.parent_obj) tablename, objs.name
constraintname\n"+
+ " FROM sysobjects objs JOIN sysconstraints cons ON objs.id =
cons.constid\n"+
+ " WHERE objs.xtype != 'PK' AND object_name(objs.parent_obj) =
'table2' OPEN refcursor\n"+
+ " FETCH NEXT FROM refcursor INTO @tablename, @constraintname\n"+
+ " WHILE @@FETCH_STATUS = 0\n"+
+ " BEGIN\n"+
+ " EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP CONSTRAINT
'[EMAIL PROTECTED])\n"+
+ " FETCH NEXT FROM refcursor INTO @tablename,
@constraintname\n"+
+ " END\n"+
+ " CLOSE refcursor\n"+
+ " DEALLOCATE refcursor\n"+
+ " DROP TABLE \"table2\"\n"+
"END;\n"+
"SET quoted_identifier on;\n"+
"IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'U' AND name =
'table1')\n"+
"BEGIN\n"+
- " DECLARE @reftable nvarchar(60), @constraintname
nvarchar(60)\n"+
- " DECLARE refcursor CURSOR FOR\n"+
- " select reftables.name tablename, cons.name constraintname\n"+
- " from sysobjects tables,\n"+
- " sysobjects reftables,\n"+
- " sysobjects cons,\n"+
- " sysreferences ref\n"+
- " where tables.id = ref.rkeyid\n"+
- " and cons.id = ref.constid\n"+
- " and reftables.id = ref.fkeyid\n"+
- " and tables.name = 'table1'\n"+
- " OPEN refcursor\n"+
- " FETCH NEXT from refcursor into @reftable, @constraintname\n"+
- " while @@FETCH_STATUS = 0\n"+
- " BEGIN\n"+
- " exec ('alter table '[EMAIL PROTECTED]' drop constraint
'[EMAIL PROTECTED])\n"+
- " FETCH NEXT from refcursor into @reftable,
@constraintname\n"+
- " END\n"+
- " CLOSE refcursor\n"+
- " DEALLOCATE refcursor\n"+
- " DROP TABLE \"table1\"\n"+
+ " DECLARE @tablename nvarchar(60), @constraintname
nvarchar(60)\n"+
+ " DECLARE refcursor CURSOR FOR\n"+
+ " SELECT object_name(objs.parent_obj) tablename, objs.name
constraintname\n"+
+ " FROM sysobjects objs JOIN sysconstraints cons ON objs.id =
cons.constid\n"+
+ " WHERE objs.xtype != 'PK' AND object_name(objs.parent_obj) =
'table1' OPEN refcursor\n"+
+ " FETCH NEXT FROM refcursor INTO @tablename, @constraintname\n"+
+ " WHILE @@FETCH_STATUS = 0\n"+
+ " BEGIN\n"+
+ " EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP CONSTRAINT
'[EMAIL PROTECTED])\n"+
+ " FETCH NEXT FROM refcursor INTO @tablename,
@constraintname\n"+
+ " END\n"+
+ " CLOSE refcursor\n"+
+ " DEALLOCATE refcursor\n"+
+ " DROP TABLE \"table1\"\n"+
"END;\n"+
"SET quoted_identifier on;\n"+
"CREATE TABLE \"table1\"\n"+
@@ -293,27 +258,20 @@
"SET quoted_identifier on;\n"+
"IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'U' AND name =
'escapedcharacters')\n"+
"BEGIN\n"+
- " DECLARE @reftable nvarchar(60), @constraintname
nvarchar(60)\n"+
- " DECLARE refcursor CURSOR FOR\n"+
- " select reftables.name tablename, cons.name constraintname\n"+
- " from sysobjects tables,\n"+
- " sysobjects reftables,\n"+
- " sysobjects cons,\n"+
- " sysreferences ref\n"+
- " where tables.id = ref.rkeyid\n"+
- " and cons.id = ref.constid\n"+
- " and reftables.id = ref.fkeyid\n"+
- " and tables.name = 'escapedcharacters'\n"+
- " OPEN refcursor\n"+
- " FETCH NEXT from refcursor into @reftable, @constraintname\n"+
- " while @@FETCH_STATUS = 0\n"+
- " BEGIN\n"+
- " exec ('alter table '[EMAIL PROTECTED]' drop constraint
'[EMAIL PROTECTED])\n"+
- " FETCH NEXT from refcursor into @reftable,
@constraintname\n"+
- " END\n"+
- " CLOSE refcursor\n"+
- " DEALLOCATE refcursor\n"+
- " DROP TABLE \"escapedcharacters\"\n"+
+ " DECLARE @tablename nvarchar(60), @constraintname
nvarchar(60)\n"+
+ " DECLARE refcursor CURSOR FOR\n"+
+ " SELECT object_name(objs.parent_obj) tablename, objs.name
constraintname\n"+
+ " FROM sysobjects objs JOIN sysconstraints cons ON objs.id =
cons.constid\n"+
+ " WHERE objs.xtype != 'PK' AND object_name(objs.parent_obj) =
'escapedcharacters' OPEN refcursor\n"+
+ " FETCH NEXT FROM refcursor INTO @tablename, @constraintname\n"+
+ " WHILE @@FETCH_STATUS = 0\n"+
+ " BEGIN\n"+
+ " EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP CONSTRAINT
'[EMAIL PROTECTED])\n"+
+ " FETCH NEXT FROM refcursor INTO @tablename,
@constraintname\n"+
+ " END\n"+
+ " CLOSE refcursor\n"+
+ " DEALLOCATE refcursor\n"+
+ " DROP TABLE \"escapedcharacters\"\n"+
"END;\n"+
"SET quoted_identifier on;\n"+
"CREATE TABLE \"escapedcharacters\"\n"+