Cómo especificar un esquema de asignación anotado en un diagrama de actualización (SQLXML 4.0)
Se aplica a: SQL ServerAzure SQL Database
En este tema se explica el modo de usar el esquema de asignación (XSD o XDR) especificado en un diagrama de actualización para procesar las actualizaciones. En un diagrama de actualización, puede proporcionar el nombre de un esquema de asignación anotado para usarlo en la asignación de los elementos y atributos del diagrama de actualización a tablas y columnas de Microsoft SQL Server. Al especificar un esquema de asignación en un diagrama de actualización, los nombres de elementos y atributos especificados en el diagrama de actualización deben asignarse a los elementos y atributos del esquema de asignación.
Para especificar un esquema de asignación, use el atributo mapping-schema del <elemento sync> . En los ejemplos siguientes se muestran dos diagramas de actualización: uno que usa un esquema de asignación simple y otro que usa un esquema más complejo.
Nota:
En esta documentación se da por supuesto que está familiarizado con las plantillas y la compatibilidad con el esquema de asignación en SQL Server. Para obtener más información, vea Introducción a esquemas XSD anotados (SQLXML 4.0). Para las aplicaciones heredadas que usan XDR, consulte Esquemas XDR anotados (en desuso en SQLXML 4.0).
Tratar con tipos de datos
Si el esquema especifica la imagen, el binario o el tipo de datos varbinaryde SQL Server (mediante sql:datatype) y no especifica un tipo de datos XML, el diagrama de actualización supone que el tipo de datos XML es binario base 64. Si los datos son de tipo bin.base , debe especificar explícitamente el tipo (dt:type=bin.base o type="xsd:hexBinary").
Si el esquema especifica el tipo de datos dateTime, date o time XSD, también debe especificar el tipo de datos de SQL Server correspondiente mediante sql:datatype="dateTime"..
Al controlar parámetros del tipo de dinero de SQL Server, debe especificar explícitamente sql:datatype="money" en el nodo adecuado en el esquema de asignación.
Ejemplos
Para crear ejemplos de trabajo con los ejemplos siguientes, debe cumplir los requisitos especificados en Requisitos para ejecutar ejemplos de SQLXML.
A Crear un diagrama de actualización con un esquema de asignación simple
El siguiente esquema XSD (SampleSchema.xml) es un esquema de asignación que asigna el <elemento Customer> a la tabla Sales.Customer:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="Customer" sql:relation="Sales.Customer" >
<xsd:complexType>
<xsd:attribute name="CustID"
sql:field="CustomerID"
type="xsd:string" />
<xsd:attribute name="RegionID"
sql:field="TerritoryID"
type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
El diagrama de actualización siguiente inserta un registro en la tabla Sales.Customer y se basa en el esquema de asignación anterior para asignar correctamente estos datos a la tabla. Observe que el diagrama de actualización usa el mismo nombre de elemento, <Customer>, que se define en el esquema. Esto resulta obligatorio porque el diagrama de actualización especifica un esquema determinado.
Para probar el diagrama de actualización
Copie el código de esquema anterior y péguelo en un archivo de texto. Guarde el archivo como SampleUpdateSchema.xml.
Copie la plantilla de diagrama de actualización siguiente y péguela en un archivo de texto. Guarde el archivo como SampleUpdategram.xml en el mismo directorio donde guardó SampleUpdateSchema.xml.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram"> <updg:sync mapping-schema="SampleUpdateSchema.xml"> <updg:before> <Customer CustID="1" RegionID="1" /> </updg:before> <updg:after> <Customer CustID="1" RegionID="2" /> </updg:after> </updg:sync> </ROOT>
La ruta de acceso al directorio especificada para el esquema de asignación (SampleUpdateSchema.xml) es relativa al directorio donde se guarda la plantilla. También puede especificarse una ruta de acceso absoluta como, por ejemplo:
mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
Cree y use el script de prueba SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar la plantilla.
Para obtener más información, consulte Uso de ADO para ejecutar consultas SQLXML 4.0.
Éste 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="Customer" sql:relation="Sales.Customer" >
<AttributeType name="CustID" />
<AttributeType name="RegionID" />
<attribute type="CustID" sql:field="CustomerID" />
<attribute type="RegionID" sql:field="TerritoryID" />
</ElementType>
</Schema>
B. Insertar un registro mediante la relación de elementos primarios y secundarios especificada en el esquema de asignación
Los elementos de esquema pueden estar relacionados. El <elemento sql:relationship> especifica la relación parent-child entre los elementos de esquema. Esta información se usa para actualizar las tablas correspondientes que tienen una relación de clave principal y clave externa.
El siguiente esquema de asignación (SampleSchema.xml) consta de dos elementos, <Order> y <OD:>
<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="OrderOD"
parent="Sales.SalesOrderHeader"
parent-key="SalesOrderID"
child="Sales.SalesOrderDetail"
child-key="SalesOrderID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Order" sql:relation="Sales.SalesOrderHeader" >
<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:schema>
El siguiente diagrama de actualización usa este esquema XSD para agregar un nuevo registro de detalle de pedido (un <elemento OD> en el bloque posterior>) para el <pedido 43860. El atributo mapping-schema se usa para especificar el esquema de asignación en el diagrama de actualización.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync mapping-schema="SampleUpdateSchema.xml" >
<updg:before>
<Order SalesOrderID="43860" />
</updg:before>
<updg:after>
<Order SalesOrderID="43860" >
<OD ProductID="753" UnitPrice="$10.00"
Quantity="5" Discount="0.0" />
</Order>
</updg:after>
</updg:sync>
</ROOT>
Para probar el diagrama de actualización
Copie el código de esquema anterior y péguelo en un archivo de texto. Guarde el archivo como SampleUpdateSchema.xml.
Copie la plantilla de diagrama de actualización anterior y péguela en un archivo de texto. Guarde el archivo como SampleUpdategram.xml en el mismo directorio donde guardó SampleUpdateSchema.xml.
La ruta de acceso al directorio especificada para el esquema de asignación (SampleUpdateSchema.xml) es relativa al directorio donde se guarda la plantilla. También puede especificarse una ruta de acceso absoluta como, por ejemplo:
mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
Cree y use el script de prueba SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar la plantilla.
Para obtener más información, consulte Uso de ADO para ejecutar consultas SQLXML 4.0.
Éste 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="OD" sql:relation="Sales.SalesOrderDetail" >
<AttributeType name="SalesOrderID" />
<AttributeType name="ProductID" />
<AttributeType name="UnitPrice" dt:type="fixed.14.4" />
<AttributeType name="OrderQty" />
<AttributeType name="UnitPriceDiscount" />
<attribute type="SalesOrderID" />
<attribute type="ProductID" />
<attribute type="UnitPrice" />
<attribute type="OrderQty" />
<attribute type="UnitPriceDiscount" />
</ElementType>
<ElementType name="Order" sql:relation="Sales.SalesOrderHeader" >
<AttributeType name="CustomerID" />
<AttributeType name="SalesOrderID" />
<AttributeType name="OrderDate" />
<attribute type="CustomerID" />
<attribute type="SalesOrderID" />
<attribute type="OrderDate" />
<element type="OD" >
<sql:relationship
key-relation="Sales.SalesOrderHeader"
key="SalesOrderID"
foreign-key="SalesOrderID"
foreign-relation="Sales.SalesOrderDetail" />
</element>
</ElementType>
</Schema>
C. Insertar un registro mediante la relación de elementos primarios y secundarios y la anotación inversa especificada en el esquema XSD
En este ejemplo se muestra cómo la lógica del diagrama de actualización usa la relación primario-secundario especificada en el XSD para procesar las actualizaciones y cómo se usa la anotación inversa . Para obtener más información sobre la anotación inversa, vea Especificación del atributo sql:inverso en sql:relationship (SQLXML 4.0).
En este ejemplo se supone que las tablas siguientes están en la base de datos tempdb :
Cust (CustomerID, CompanyName)
, dondeCustomerID
es la clave principalOrd (OrderID, CustomerID)
, dondeCustomerID
es una clave externa que hace referencia a la clave principalCustomerID
de la tablaCust
.
El diagrama de actualización usa el esquema XSD siguiente para insertar registros en las tablas Cust y Ord:
<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="OrdCust" inverse="true"
parent="Ord"
parent-key="CustomerID"
child-key="CustomerID"
child="Cust"/>
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Order" sql:relation="Ord">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Customer" sql:relationship="OrdCust"/>
</xsd:sequence>
<xsd:attribute name="OrderID" type="xsd:int"/>
<xsd:attribute name="CustomerID" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="Customer" sql:relation="Cust">
<xsd:complexType>
<xsd:attribute name="CustomerID" type="xsd:string"/>
<xsd:attribute name="CompanyName" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
El esquema XSD de este ejemplo tiene elementos Customer> y< Order>, y especifica una relación parent-child entre los dos elementos.< Identifica <Order> como elemento primario y< Customer> como elemento secundario.
La lógica de procesamiento del diagrama de actualización usa la información de la relación de elementos primarios y secundarios para determinar el orden en que los registros se insertan en las tablas. En este ejemplo, la lógica del diagrama de actualización primero intenta insertar un registro en la tabla Ord (porque <Order> es el elemento primario) e intenta insertar un registro en la tabla Cust (porque <Customer> es el elemento secundario). Sin embargo, debido a la información de clave principal y clave externa incluida en el esquema de tabla de base de datos, esta operación de inserción provoca una infracción de clave externa en la base de datos y se produce un error en la operación de inserción.
Para indicar a la lógica del diagrama de actualización que revierta la relación primario-secundario durante la operación de actualización, la anotación inversa se especifica en el elemento de< relación>. Como resultado, los registros se agregan primero en la tabla Cust y después en la tabla Ord, y la operación se realiza correctamente.
El diagrama de actualización siguiente inserta un pedido (OrderID=2) en la tabla Ord y un cliente (CustomerID='AAAAA) en la tabla Cust mediante el esquema XSD especificado:
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync mapping-schema="SampleUpdateSchema.xml" >
<updg:before/>
<updg:after>
<Order OrderID="2" CustomerID="AAAAA" >
<Customer CustomerID="AAAAA" CompanyName="AAAAA Company" />
</Order>
</updg:after>
</updg:sync>
</ROOT>
Para probar el diagrama de actualización
Cree estas tablas en la base de datos tempdb :
USE tempdb CREATE TABLE Cust(CustomerID varchar(5) primary key, CompanyName varchar(20)) GO CREATE TABLE Ord (OrderID int primary key, CustomerID varchar(5) references Cust(CustomerID)) GO
Copie el código de esquema anterior y péguelo en un archivo de texto. Guarde el archivo como SampleUpdateSchema.xml.
Copie la plantilla de diagrama de actualización anterior y péguela en un archivo de texto. Guarde el archivo como SampleUpdategram.xml en el mismo directorio donde guardó SampleUpdateSchema.xml.
La ruta de acceso al directorio especificada para el esquema de asignación (SampleUpdateSchema.xml) es relativa al directorio donde se guarda la plantilla. También puede especificarse una ruta de acceso absoluta como, por ejemplo:
mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"
Cree y use el script de prueba SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar la plantilla.
Para obtener más información, consulte Uso de ADO para ejecutar consultas SQLXML 4.0.
Consulte también
Consideraciones de seguridad sobre los diagramas de actualización (SQLXML 4.0)