Share via


Actualizar datos con diagramas de actualización XML (SQLXML 4.0)

Al actualizar los datos existentes, debe especificar los dos bloques <after> y <before> . Los elementos especificados en los bloques <after> y <before> describen el cambio deseado. El diagrama de actualización utiliza los elementos que se especifican en el bloque <before> para identificar los registros existentes en la base de datos. Los elementos correspondientes del bloque <after> indican cómo deberían quedar los registros después de ejecutar la operación de actualización. A partir de esta información, el diagrama de actualización crea una instrucción SQL que coincide con el bloque <after>. A continuación, el diagrama de actualización utiliza esta instrucción para actualizar la base de datos.

Este es el formato del diagrama de actualización para una operación de actualización:

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync [mapping-schema="SampleSchema.xml"]  >
   <updg:before>
      <ElementName [updg:id="value"] .../>
      [<ElementName [updg:id="value"] .../> ... ]
   </updg:before>
   <updg:after>
      <ElementName [updg:id="value"] ... />
      [<ElementName [updg:id="value"] .../> ...]
   </updg:after>
</updg:sync>
</ROOT>
  • <updg:before>
    Los elementos del bloque <before> identifican los registros existentes en las tablas de la base de datos.

  • <updg:after>
    Los elementos del bloque <after> describen cómo deberían quedar los registros especificados en el bloque <before> una vez aplicadas las actualizaciones.

El atributo mapping-schema identifica el esquema de asignación que va a ser utilizado por el diagrama de actualización. Si el diagrama de actualización especifica un esquema de asignación, los nombres de atributos y elementos especificados en los bloques <after> y <before> deben coincidir con los nombres del esquema. El esquema de asignación asigna estos nombres de elementos o atributos a los nombres de columnas y tablas de base de datos.

Si un diagrama de actualización no especifica un esquema, utilizará la asignación predeterminada. En la asignación predeterminada, el <ElementName> especificado en el diagrama de actualización se asigna a la tabla de base de datos y los elementos secundarios o atributos se asignan a las columnas de base de datos.

Un elemento del bloque <before> debe coincidir sólo con una fila de tabla de la base de datos. Si el elemento coincide con varias filas de tabla o si no coincide con ninguna, el diagrama de actualización devuelve un error y cancela el bloque <sync> completo.

Un diagrama de actualización puede incluir varios bloques <sync>. Cada bloque <sync> se trata como una transacción. Cada bloque <sync> puede tener varios bloques <after> y <before>. Por ejemplo, si está actualizando dos de los registros existentes, podría especificar dos pares de <before> y <after>, uno para cada registro que se está actualizando.

Utilizar el atributo updg:id

Cuando se especifican varios elementos en los bloques <after> y <before>, utilice el atributo updg:id para marcar filas en los bloques <after> y <before> . La lógica de procesamiento utiliza esta información para determinar qué registro del bloque <before> se debe emparejar con qué registro del bloque <after>.

El atributo updg:id no es necesario (aunque se recomienda) si se da alguna de las siguientes circunstancias:

  • Los elementos del esquema de asignación especificado tienen definido el atributo sql:key-fields.

  • Hay uno o más valores concretos proporcionados para los campos de clave del diagrama de actualización.

En cualquiera de los casos, el diagrama de actualización utiliza las columnas de clave que se especifican en los sql:key-fields para emparejar los elementos de los bloques <after> y <before>.

Si el esquema de asignación no identifica las columnas de clave (utilizando sql:key-fields) o si el diagrama de actualización está actualizando un valor de columna de clave, se debe especificar updg:id.

Los registros que se identifican en los bloques <after> y <before> no tienen que estar en el mismo orden. El atributo updg:id fuerza la asociación entre los elementos que se especifican en los bloques <after> y <before>.

Si especifica un elemento en el bloque <before> y sólo un elemento correspondiente en el bloque <after>, no es necesario utilizar updg:id. Sin embargo, se recomienda que de todas formas especifique updg:id para evitar la ambigüedad.

Ejemplos

Antes de utilizar los ejemplos del diagrama de actualización, tenga en cuenta lo siguiente:

  • En la mayoría de los ejemplos se usa una asignación predeterminada (es decir, no se especifica ningún esquema de asignación en el diagrama de actualización). Para obtener más ejemplos de diagramas de actualización que usen esquemas de asignación, vea Cómo especificar un esquema de asignación anotado en un diagrama de actualización (SQLXML 4.0).

  • La mayoría de los ejemplos utilizan la base de datos de ejemplo AdventureWorks. Todas las actualizaciones se aplican a las tablas de esta base de datos. Puede restaurar la base de datos AdventureWorks. Para obtener información acerca de la restauración de la base de datos AdventureWorks, vea Bases de datos de ejemplo AdventureWorks.

A. Actualizar un registro

El siguiente diagrama de actualización actualiza el apellido del empleado a Fuller en la tabla Person.Contact de la base de datos AdventureWorks. El diagrama de actualización no especifica ningún esquema de asignación, por lo que utilizará la asignación predeterminada.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
   <Person.Contact ContactID="1" />
</updg:before>
<updg:after>
   <Person.Contact LastName="Abel-Achong" />
</updg:after>
</updg:sync>
</ROOT>

El registro descrito en el bloque <before> representa el registro actual de la base de datos. El diagrama de actualización utiliza todos los valores de columna especificados en el bloque <before> para buscar el registro. En este diagrama de actualización, el bloque <before> sólo proporciona la columna ContactID; por consiguiente, el diagrama de actualización únicamente utiliza el valor para buscar el registro. Si fuera a agregar el valor LastName a este bloque, el diagrama de actualización utilizaría los valores ContactID y LastName para buscar.

En este diagrama de actualización, el bloque <after> sólo proporciona el valor de columna LastName porque se trata del único valor que se cambia.

Para probar el diagrama de actualización

  1. Copie la plantilla de diagrama de actualización anterior y péguela en un archivo de texto. Guarde el archivo como UpdateLastName.xml.

  2. Cree y use el script de prueba de SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar el diagrama de actualización.

    Para obtener más información, vea Utilizar ADO para ejecutar consultas SQLXML 4.0.

B. Actualizar varios registros utilizando el atributo updg:id

En este ejemplo, el diagrama de actualización realiza dos actualizaciones en la tabla HumanResources.Shift de la base de datos AdventureWorks:

  • Cambia el nombre del turno de día original, que empieza a las 7:00 a. m., de "Day" a "Early Morning".

  • Inserta un nuevo turno denominado "Late Morning" que empieza a las 10:00 a. m.

En el diagrama de actualización, el atributo updg:id crea asociaciones entre los elementos de los bloques <after> y <before>.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync >
    <updg:before>
       <HumanResources.Shift updg:id="x" Name="Day" />
    </updg:before>
    <updg:after>
      <HumanResources.Shift updg:id="y" Name="Late Morning" 
                            StartTime="1900-01-01 10:00:00.000"
                            EndTime="1900-01-01 18:00:00.000"
                            ModifiedDate="2004-06-01 00:00:00.000"/>
      <HumanResources.Shift updg:id="x" Name="Early Morning" />
    </updg:after>
  </updg:sync>
</ROOT>

Observe cómo el atributo updg:id empareja la primera instancia del elemento <HumanResources.Shift> del bloque <before> con la segunda instancia del elemento <HumanResources.Shift> del bloque <after>.

Para probar el diagrama de actualización

  1. Copie la plantilla de diagrama de actualización anterior y péguela en un archivo de texto. Guarde el archivo como UpdateMultipleRecords.xml.

  2. Cree y use el script de prueba de SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar el diagrama de actualización.

    Para obtener más información, vea Utilizar ADO para ejecutar consultas SQLXML 4.0.

C. Especificar varios bloques <before> y <after>

Puede escribir el diagrama de actualización del ejemplo B utilizando varios pares de bloques <before> y <after> para evitar la ambigüedad. Especificar pares de <before> y <after> es un modo de especificar varias actualizaciones con la mínima confusión. Además, si cada uno de los bloques <after> y <before> especifica a lo sumo un elemento, no tiene que utilizar el atributo updg:id.

[!NOTA]

Para formar un par, la etiqueta <after> debe ir inmediatamente después de la etiqueta <before> correspondiente.

En el diagrama de actualización siguiente, el primer par de bloques <before> y <after> actualiza el nombre del turno de día. El segundo par inserta un nuevo registro de turno.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync >
    <updg:before>
       <HumanResources.Shift ShiftID="1" Name="Day" />
    </updg:before>
    <updg:after>
      <HumanResources.Shift Name="Early Morning" />
    </updg:after>
    <updg:before>
    </updg:before>
    <updg:after>
      <HumanResources.Shift Name="Late Morning" 
                            StartTime="1900-01-01 10:00:00.000"
                            EndTime="1900-01-01 18:00:00.000"
                            ModifiedDate="2004-06-01 00:00:00.000"/>
    </updg:after>
  </updg:sync>
</ROOT>

Para probar el diagrama de actualización

  1. Copie la plantilla de diagrama de actualización anterior y péguela en un archivo de texto. Guarde el archivo como UpdateMultipleBeforeAfter.xml.

  2. Cree y use el script de prueba de SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar el diagrama de actualización.

    Para obtener más información, vea Utilizar ADO para ejecutar consultas SQLXML 4.0.

D. Especificar varios bloques <sync>

Puede especificar varios bloques <sync> en un diagrama de actualización. Cada bloque <sync> que se especifica es una transacción independiente.

En el diagrama de actualización siguiente, el primer bloque <sync> actualiza un registro en la tabla Sales.Customer. Para que resulte más sencillo, el diagrama de actualización especifica sólo los valores de columna necesarios; el valor de identidad (CustomerID) y el valor que se está actualizando (SalesPersonID).

El segundo bloque <sync> agrega dos registros a la tabla Sales.SalesOrderHeader. En esta tabla, SalesOrderID es una columna de tipo IDENTITY. Por lo tanto, el diagrama de actualización no especifica el valor de SalesOrderID en cada uno de los elementos <Sales.SalesOrderHeader>.

Especificar varios bloques <sync> es útil porque si el segundo bloque <sync> (una transacción) no agrega registros a la tabla Sales.SalesOrderHeader, el primer bloque <sync> todavía puede actualizar el registro del cliente en la tabla Sales.Customer.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync >
    <updg:before>
      <Sales.Customer CustomerID="1" SalesPersonID="280" />
    </updg:before>
    <updg:after>
      <Sales.Customer CustomerID="1" SalesPersonID="283" />
    </updg:after>
  </updg:sync>
  <updg:sync >
    <updg:before>
    </updg:before>
    <updg:after>
   <Sales.SalesOrderHeader 
             CustomerID="1"
             RevisionNumber="1"
             OrderDate="2004-07-01 00:00:00.000"
             DueDate="2004-07-13 00:00:00.000"
             OnlineOrderFlag="0"
             ContactID="378"
             BillToAddressID="985"
             ShipToAddressID="985"
             ShipMethodID="5"
             SubTotal="24643.9362"
             TaxAmt="1971.5149"
             Freight="616.0984"
             rowguid="01010101-2222-3333-4444-556677889900"
             ModifiedDate="2004-07-08 00:00:00.000" />
   <Sales.SalesOrderHeader
             CustomerID="1"
             RevisionNumber="1"
             OrderDate="2004-07-01 00:00:00.000"
             DueDate="2004-07-13 00:00:00.000"
             OnlineOrderFlag="0"
             ContactID="378"
             BillToAddressID="985"
             ShipToAddressID="985"
             ShipMethodID="5"
             SubTotal="1000.0000"
             TaxAmt="0.0000"
             Freight="0.0000"
             rowguid="10101010-2222-3333-4444-556677889900"
             ModifiedDate="2004-07-09 00:00:00.000" />
    </updg:after>
  </updg:sync>
</ROOT>

Para probar el diagrama de actualización

  1. Copie la plantilla de diagrama de actualización anterior y péguela en un archivo de texto. Guarde el archivo como UpdateMultipleSyncs.xml.

  2. Cree y use el script de prueba de SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar el diagrama de actualización.

    Para obtener más información, vea Utilizar ADO para ejecutar consultas SQLXML 4.0.

E. Usar un esquema de asignación

En este ejemplo, el diagrama de actualización especifica un esquema de asignación utilizando el atributo mapping-schema. (No hay ninguna asignación predeterminada; es decir, el esquema de asignación proporciona la asignación necesaria de elementos y atributos en el diagrama de actualización a las tablas y columnas de base de datos.)

Los elementos y atributos especificados en el diagrama de actualización hacen referencia a los elementos y atributos del esquema de asignación.

El esquema de asignación XSD siguiente tiene los elementos <Customer>, <OD> y <Order> que se asignan a las tablas Sales.Customer, Sales.SalesOrderHeader y Sales.SalesOrderDetail de la base de datos.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
  <xsd:appinfo>
    <sql:relationship name="CustomerOrder"
          parent="Sales.Customer"
          parent-key="CustomerID"
          child="Sales.SalesOrderHeader"
          child-key="CustomerID" />

    <sql:relationship name="OrderOD"
          parent="Sales.SalesOrderHeader"
          parent-key="SalesOrderID"
          child="Sales.SalesOrderDetail"
          child-key="SalesOrderID" />
  </xsd:appinfo>
</xsd:annotation>

  <xsd:element name="Customer" sql:relation="Sales.Customer" >
   <xsd:complexType>
     <xsd:sequence>
        <xsd:element name="Order" 
                     sql:relation="Sales.SalesOrderHeader"
                     sql:relationship="CustomerOrder" >
           <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="OD" 
                             sql:relation="Sales.SalesOrderDetail"
                             sql:relationship="OrderOD" >
                 <xsd:complexType>
                  <xsd:attribute name="SalesOrderID" type="xsd:integer" />
                  <xsd:attribute name="ProductID" type="xsd:integer" />
                  <xsd:attribute name="UnitPrice" type="xsd:decimal" />
                  <xsd:attribute name="OrderQty" type="xsd:integer" />
                  <xsd:attribute name="UnitPriceDiscount" type="xsd:decimal" /> 
                 </xsd:complexType>
                </xsd:element>
              </xsd:sequence>
              <xsd:attribute name="CustomerID" type="xsd:string" />
              <xsd:attribute name="SalesOrderID" type="xsd:integer" />
              <xsd:attribute name="OrderDate" type="xsd:date" />
           </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
      <xsd:attribute name="CustomerID"   type="xsd:string" /> 
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

Este esquema de asignación (UpdategramMappingSchema.xml) se especifica en el siguiente diagrama de actualización. El diagrama de actualización agrega un elemento de detalle de pedido en la tabla Sales.SalesOrderDetail para un pedido concreto. El diagrama de actualización incluye elementos anidados: un elemento <OD> anidado dentro de un elemento <Order>. La relación de clave principal/clave externa entre estos dos elementos se especifica en el esquema de asignación.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync mapping-schema="UpdategramMappingSchema.xml" >
    <updg:before>
       <Order SalesOrderID="43659" />
    </updg:before>
    <updg:after>
      <Order SalesOrderID="43659" >
          <OD ProductID="776" UnitPrice="2329.0000"
              OrderQty="2" UnitPriceDiscount="0.0" />
      </Order>
    </updg:after>
  </updg:sync>
</ROOT>

Para probar el diagrama de actualización

  1. Copie el esquema de asignación anterior y péguelo en un archivo de texto. Guarde el archivo como UpdategramMappingSchema.xml.

  2. Copie la plantilla de diagrama de actualización anterior y péguela en un archivo de texto. Guarde el archivo como UpdateWithMappingSchema.xml en la misma carpeta que se utilizó para guardar el esquema de asignación (UpdategramMappingSchema.xml).

  3. Cree y use el script de prueba de SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar el diagrama de actualización.

    Para obtener más información, vea Utilizar ADO para ejecutar consultas SQLXML 4.0.

Para obtener más ejemplos de diagramas de actualización que usen esquemas de asignación, vea Cómo especificar un esquema de asignación anotado en un diagrama de actualización (SQLXML 4.0).

F. Usar un esquema de asignación con atributos IDREFS

En este ejemplo se muestra cómo los diagramas de actualización utilizan los atributos IDREFS en el esquema de asignación para actualizar registros en varias tablas. En este ejemplo, suponga que la base de datos está compuesta de las tablas siguientes:

  • Student(StudentID, LastName)

  • Course(CourseID, CourseName)

  • Enrollment(StudentID, CourseID)

Dado que un alumno se puede inscribir en muchos cursos y un curso puede tener muchos alumnos, hace falta una tercera tabla, la tabla Enrollment, que represente esta relación M:N.

El siguiente esquema de asignación XSD proporciona una vista XML de las tablas utilizando los elementos <Student>, <Course> y <Enrollment>. Los atributos IDREFS del esquema de asignación especifican la relación entre estos elementos. El atributo StudentIDList del elemento <Course> es un atributo de tipo IDREFS que hace referencia a la columna StudentID de la tabla Enrollment. Asimismo, el atributo EnrolledIn del elemento <Student> es un atributo de tipo IDREFS que hace referencia a la columna CourseID de la tabla Enrollment.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
  <xsd:appinfo>
    <sql:relationship name="StudentEnrollment"
          parent="Student"
          parent-key="StudentID"
          child="Enrollment"
          child-key="StudentID" />

    <sql:relationship name="CourseEnrollment"
          parent="Course"
          parent-key="CourseID"
          child="Enrollment"
          child-key="CourseID" />
  </xsd:appinfo>
</xsd:annotation>

  <xsd:element name="Course" sql:relation="Course" 
                             sql:key-fields="CourseID" >
    <xsd:complexType>
    <xsd:attribute name="CourseID"  type="xsd:string" /> 
    <xsd:attribute name="CourseName"   type="xsd:string" /> 
    <xsd:attribute name="StudentIDList" sql:relation="Enrollment"
                 sql:field="StudentID"
                 sql:relationship="CourseEnrollment" 
                                     type="xsd:IDREFS" />

    </xsd:complexType>
  </xsd:element>
  <xsd:element name="Student" sql:relation="Student" >
    <xsd:complexType>
    <xsd:attribute name="StudentID"  type="xsd:string" /> 
    <xsd:attribute name="LastName"   type="xsd:string" /> 
    <xsd:attribute name="EnrolledIn" sql:relation="Enrollment"
                 sql:field="CourseID"
                 sql:relationship="StudentEnrollment" 
                                     type="xsd:IDREFS" />
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

Cada vez que especifique este esquema en un diagrama de actualización e inserte un registro en la tabla Course, el diagrama de actualización insertará un nuevo registro de curso en la tabla Course. Si especifica uno o más identificadores de alumnos nuevos para el atributo StudentIDList, el diagrama de actualización también insertará un registro en la tabla Enrollment para cada nuevo alumno. El diagrama de actualización asegura que no se agregan registros duplicados a la tabla Enrollment.

Para probar el diagrama de actualización

  1. Cree estas tablas en la base de datos especificada en la raíz virtual:

    CREATE TABLE Student(StudentID varchar(10) primary key, 
                         LastName varchar(25))
    CREATE TABLE Course(CourseID varchar(10) primary key, 
                        CourseName varchar(25))
    CREATE TABLE Enrollment(StudentID varchar(10) 
                                      references Student(StudentID),
                           CourseID varchar(10) 
                                      references Course(CourseID))
    
  2. Agregue estos datos de ejemplo:

    INSERT INTO Student VALUES ('S1','Davoli')
    INSERT INTO Student VALUES ('S2','Fuller')
    
    INSERT INTO Course VALUES  ('CS101', 'C Programming')
    INSERT INTO Course VALUES  ('CS102', 'Understanding XML')
    
    INSERT INTO Enrollment VALUES ('S1', 'CS101')
    INSERT INTO Enrollment VALUES ('S1', 'CS102')
    
  3. Copie el esquema de asignación anterior y péguelo en un archivo de texto. Guarde el archivo como SampleSchema.xml.

  4. Guarde el diagrama de actualización (SampleUpdategram) en la misma carpeta utilizada para guardar el esquema de asignación en el paso anterior. (Este diagrama de actualización quita un alumno con StudentID = "1" del curso CS102.)

    <ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
      <updg:sync mapping-schema="SampleSchema.xml" >
        <updg:before>
            <Student updg:id="x" StudentID="S1" LastName="Davolio"
                                 EnrolledIn="CS101 CS102" />
        </updg:before>
        <updg:after >
            <Student updg:id="x" StudentID="S1" LastName="Davolio"
                                 EnrolledIn="CS101" />
        </updg:after>
      </updg:sync>
    </ROOT>
    
  5. Cree y use el script de prueba de SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar el diagrama de actualización.

    Para obtener más información, vea Utilizar ADO para ejecutar consultas SQLXML 4.0.

  6. Guarde y ejecute el siguiente diagrama de actualización tal y como se describe en los pasos anteriores. El diagrama de actualización vuelve a incluir al alumno con StudentID = "1" en el curso CS102 agregando un registro en la tabla Enrollment.

    <ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
      <updg:sync mapping-schema="SampleSchema.xml" >
        <updg:before>
            <Student updg:id="x" StudentID="S1" LastName="Davolio"
                                 EnrolledIn="CS101" />
        </updg:before>
        <updg:after >
            <Student updg:id="x" StudentID="S1" LastName="Davolio"
                                 EnrolledIn="CS101 CS102" />
        </updg:after>
      </updg:sync>
    </ROOT>
    
  7. Guarde y ejecute el siguiente diagrama de actualización tal y como se describe en los pasos anteriores. Este diagrama de actualización inserta tres nuevos alumnos y los inscribe en el curso CS101. De nuevo, la relación IDREFS inserta registros en la tabla Enrollment.

    <ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
      <updg:sync mapping-schema="SampleSchema.xml" >
        <updg:before>
           <Course updg:id="y" CourseID="CS101" 
                               CourseName="C Programming" />
        </updg:before>
        <updg:after >
           <Student updg:id="x1" StudentID="S3" LastName="Leverling" />
           <Student updg:id="x2" StudentID="S4" LastName="Pecock" />
           <Student updg:id="x3" StudentID="S5" LastName="Buchanan" />
           <Course updg:id="y" CourseID="CS101"
                               CourseName="C Programming"
                               StudentIDList="S3 S4 S5" />
        </updg:after>
      </updg:sync>
    </ROOT>
    

Este es el esquema XDR equivalente:

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:dt="urn:schemas-microsoft-com:datatypes"
        xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <ElementType name="Enrollment" sql:relation="Enrollment" sql:key-fields="StudentID CourseID">
    <AttributeType name="StudentID" dt:type="id" />
    <AttributeType name="CourseID" dt:type="id" />

    <attribute type="StudentID" />
    <attribute type="CourseID" />
  </ElementType>
  <ElementType name="Course" sql:relation="Course" sql:key-fields="CourseID">
    <AttributeType name="CourseID" dt:type="id" />
    <AttributeType name="CourseName" />
 
    <attribute type="CourseID" />
    <attribute type="CourseName" />

    <AttributeType name="StudentIDList" dt:type="idrefs" />
    <attribute type="StudentIDList" sql:relation="Enrollment" sql:field="StudentID" >
        <sql:relationship
                key-relation="Course"
                key="CourseID"
                foreign-relation="Enrollment"
                foreign-key="CourseID" />
    </attribute>

  </ElementType>
  <ElementType name="Student" sql:relation="Student">
    <AttributeType name="StudentID" dt:type="id" />
     <AttributeType name="LastName" />

    <attribute type="StudentID" />
    <attribute type="LastName" />

    <AttributeType name="EnrolledIn" dt:type="idrefs" />
    <attribute type="EnrolledIn" sql:relation="Enrollment" sql:field="CourseID" >
        <sql:relationship
                key-relation="Student"
                key="StudentID"
                foreign-relation="Enrollment"
                foreign-key="StudentID" />
    </attribute>

    <element type="Enrollment" sql:relation="Enrollment" >
        <sql:relationship key-relation="Student"
                          key="StudentID"
                          foreign-relation="Enrollment"
                          foreign-key="StudentID" />
    </element>
  </ElementType>

</Schema>

Para obtener más ejemplos de diagramas de actualización que usen esquemas de asignación, vea Cómo especificar un esquema de asignación anotado en un diagrama de actualización (SQLXML 4.0).