Conceder permisos en una colección de esquemas XML

Puede conceder permisos para crear una colección de esquemas XML y también puede concederlos en un objeto de colección de esquemas XML.

Conceder permisos para crear una colección de esquemas XML

Para crear una colección de esquemas XML, son necesarios los siguientes permisos:

  • La entidad de seguridad requiere el permiso CREATE XML SCHEMA COLLECTION en la base de datos.
  • Dado que las colecciones de esquemas XML tienen ámbito de esquema relacional, la entidad de seguridad también debe tener el permiso ALTER en el esquema relacional.

Los permisos siguientes permiten a la entidad de seguridad crear una colección de esquemas XML en un esquema relacional en una base de datos de un servidor:

  • Permiso CONTROL en el servidor
  • Permiso ALTER ANY DATABASE en el servidor
  • Permiso ALTER en la base de datos
  • Permiso CONTROL en la base de datos
  • Permiso ALTER ANY SCHEMA y permiso CREATE XML SCHEMA COLLECTION en la base de datos
  • Permiso ALTER o CONTROL en el esquema relacional y permiso CREATE XML SCHEMA COLLECTION en la base de datos

Éste último método de permisos se utiliza en el ejemplo siguiente.

El propietario del esquema relacional se convierte en el propietario de la colección de esquemas XML creada en dicho esquema. Este propietario tendrá control total sobre la colección de esquemas XML. Por tanto, el propietario puede modificar la colección de esquemas XML, escribir una columna xml o quitar la colección de esquemas XML.

Conceder permisos en un objeto de colección de esquemas XML

Los permisos siguientes se admiten en la colección de esquemas XML:

  • El permiso ALTER es necesario para modificar el contenido de una colección de esquemas XML utilizando la instrucción ALTER XML SCHEMA COLLECTION.
  • El permiso CONTROL permite a un usuario realizar cualquier operación en la colección de esquemas XML.
  • El permiso TAKE OWNERSHIP es necesario para transferir la propiedad de la colección de esquemas XML de una entidad de seguridad a otra.
  • El permiso REFERENCE permite que la entidad de seguridad utilice la colección de esquemas XML para escribir o restringir columnas de tipo xml en tablas, vistas y parámetros. El permiso REFERENCE también es necesario cuando una colección de esquemas XML hace referencia a otra.
  • El permiso VIEW DEFINITION permite que la entidad de seguridad consulte el contenido de una colección de esquemas XML a través de XML_SCHEMA_NAMESPACE o de las vistas de catálogo, siempre que esta entidad de seguridad tenga uno de los permisos ALTER, REFERENCES o CONTROL en la colección.
  • El permiso EXECUTE es necesario para validar valores insertados o actualizados por la entidad de seguridad según la colección de esquemas XML que está escribiendo o restringiendo las columnas de tipo xml, las variables y los parámetros. También necesita este permiso para consultar el XML almacenado en estas columnas y variables.

Ejemplos

Los escenarios de los ejemplos siguientes ilustran el funcionamiento de los permisos de los esquemas XML. En cada ejemplo se crea la base de datos de prueba, los esquemas relacionales y los inicios de sesión necesarios. A estos inicios de sesión se les conceden los permisos necesarios para la colección de esquemas XML. Al final, cada ejemplo realiza las operaciones de limpieza necesarias.

A. Conceder permisos para crear una colección de esquemas XML

El ejemplo siguiente muestra cómo se conceden los permisos para que una entidad de seguridad pueda crear una colección de esquemas XML. En el ejemplo, se crea una base de datos de ejemplo y un usuario de prueba, TestLogin1. A continuación, TestLogin1 recibe el permiso ALTER en el esquema relacional y el permiso CREATE XML SCHEMA COLLECTION en la base de datos. Con estos permisos, TestLogin1 crea correctamente una colección de esquemas XML de ejemplo.

SETUSER
go
USE master
go
CREATE LOGIN TestLogin1 WITH password='SQLSvrPwd1'
go
CREATE DATABASE SampleDBForSchemaPermissions
go
USE SampleDBForSchemaPermissions
go
CREATE USER TestLogin1
go
-- User needs ALTER permission on the relational schema in the database
GRANT ALTER ON SCHEMA::dbo TO TestLogin1
go
-- User also needs permission to create xml schema collections in the database
GRANT CREATE XML SCHEMA COLLECTION 
TO TestLogin1
go
-- now execute create xml schema  collection
SETUSER 'TestLogin1'
go
CREATE XML SCHEMA COLLECTION myTestSchemaCollection AS '<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema targetNamespace="http://schemas.adventure-works.com/Additional/ContactInfo" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified">
<xsd:element name="AdditionalContactInfo" >
  <xsd:complexType mixed="true" >
    <xsd:sequence>
      <xsd:any processContents="strict"  
               namespace="http://schemas.adventure-works.com/Contact/Record 
                          http://schemas.adventure-works.com/AdditionalContactTypes"
               minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>
<xsd:element name="root" type="xsd:byte"/>
</xsd:schema>'
go
-- final cleanup
SETUSER
go
USE master
go
DROP DATABASE SampleDBForSchemaPermissions
go
DROP LOGIN TestLogin1
go

A. Conceder permisos para utilizar una colección de esquemas XML existente

El ejemplo siguiente muestra el modelo de permisos para la colección de esquemas XML. Ilustra los diferentes permisos que se necesitan para crear y utilizar la colección de esquemas XML.

En el ejemplo, se crea una base de datos de prueba y un inicio de sesión, TestLogin1. TestLogin1 crea una colección de esquemas XML en la base de datos. El inicio de sesión crea una tabla y utiliza la colección de esquemas XML para crear una columna xml con tipo. A continuación, el usuario inserta los datos y los consulta. Todos estos pasos requieren los permisos de esquema necesarios que muestra el código.

SETUSER
go
USE master
go
CREATE LOGIN TestLogin1 WITH password='SQLSvrPwd1'
go
CREATE DATABASE SampleDBForSchemaPermissions
go
USE SampleDBForSchemaPermissions
go
CREATE USER TestLogin1
go
-- grant permission to the user
SETUSER
go
-- User needs ALTER permission on the relational schema in the database
GRANT ALTER ON SCHEMA::dbo TO TestLogin1
go
-- User also needs permission to create xml schema collections in the database
GRANT CREATE XML SCHEMA COLLECTION 
TO TestLogin1
go
-- Now user can execute previous CREATE XML SCHEMA COLLECTION
SETUSER 'TestLogin1'
go
CREATE XML SCHEMA COLLECTION myTestSchemaCollection AS '<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema targetNamespace="http://schemas.adventure-works.com/Additional/ContactInfo" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified">

<xsd:element name="AdditionalContactInfo" >
  <xsd:complexType mixed="true" >
    <xsd:sequence>
      <xsd:any processContents="strict"  
               namespace="http://schemas.adventure-works.com/Contact/Record 
                          http://schemas.adventure-works.com/AdditionalContactTypes"
               minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>
<xsd:element name="telephone" type="xsd:string" />
</xsd:schema>'
go

-- Let us create a table using the collection to type an xml column. 
--TestLogin1 needs permission to create table
setuser
go
GRANT CREATE TABLE TO TestLogin1
go
-- The user also needs REFERENCE permission to use the XML schema collection
-- to create a typed XML column (REFERENCES permission on schema 
-- collection not needed).
GRANT REFERENCES ON XML SCHEMA COLLECTION::myTestSchemaCollection 
TO TestLogin1
go
-- Now user can create table and use the XML schema collection to create 
-- a typed XML column
setuser 'TestLogin1'
go
CREATE TABLE MyTestTable (xmlCol xml (dbo.myTestSchemaCollection))
go
-- To insert data in the table user needs EXECUTE permission on the XML schema collection
-- GRANT EXECUTE permission to TestLogin2 on the xml schema collection
setuser
go
GRANT EXECUTE ON XML SCHEMA COLLECTION::myTestSchemaCollection 
TO TestLogin1
go
-- TestLogin1 does not own the dbo schema. This user needs insert permission
GRANT INSERT TO TestLogin1
go
-- Now user can insert data in the table
setuser 'TestLogin1'
go
INSERT INTO MyTestTable VALUES('
<telephone xmlns="http://schemas.adventure-works.com/Additional/ContactInfo">111-1111</telephone>
')
go
-- To query the table,TestLogin1 needs permissions (SELECT on the table and EXECUTE on the XML schema collection).
setuser
go
GRANT SELECT TO TestLogin1
go
-- TestLogin1 already has EXECUTE permission on the schema (granted before inserting a record in the table).
SELECT xmlCol.query('declare default namespace="http://schemas.adventure-works.com/Additional/ContactInfo" /telephone[1]')
FROM MyTestTable
go
-- To illustrate the user needs EXECUTE permission to query, let us REVOKE
-- previously granted permission and return the query
SETUSER
go
REVOKE EXECUTE ON XML SCHEMA COLLECTION::myTestSchemaCollection to TestLogin1
Go
-- Now TestLogin1 cannot execute the query
SETUSER 'TestLogin1'
go
SELECT xmlCol.query('declare default namespace="http://schemas.adventure-works.com/Additional/ContactInfo" /telephone[1]')
FROM MyTestTable
go
-- Final cleanup 
SETUSER
go
USE master
go
DROP DATABASE SampleDBForSchemaPermissions
go
DROP LOGIN TestLogin1
go

C. Conceder el permiso ALTER en una colección de esquemas XML

Un usuario necesita el permiso ALTER para modificar una colección de esquemas XML en la base de datos. El ejemplo siguiente muestra cómo se otorga el permiso ALTER:

SETUSER
go
USE master
go
CREATE LOGIN TestLogin1 WITH password='SQLSvrPwd1'
go
CREATE DATABASE SampleDBForSchemaPermissions
go
USE SampleDBForSchemaPermissions
go
CREATE USER TestLogin1
go
-- grant permission to the user
SETUSER
go
-- User needs ALTER permission on the relational schema in the database
GRANT ALTER ON SCHEMA::dbo TO TestLogin1
go
-- User also needs permission to create xml schema collections in the database
GRANT CREATE XML SCHEMA COLLECTION 
TO TestLogin1
go
-- Now user can execute previous CREATE XML SCHEMA COLLECTION
SETUSER 'TestLogin1'
go
CREATE XML SCHEMA COLLECTION myTestSchemaCollection AS '<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema targetNamespace="http://schemas.adventure-works.com/Additional/ContactInfo" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified">

<xsd:element name="AdditionalContactInfo" >
  <xsd:complexType mixed="true" >
    <xsd:sequence>
      <xsd:any processContents="strict"  
               namespace="http://schemas.adventure-works.com/Contact/Record 
                          http://schemas.adventure-works.com/AdditionalContactTypes"
               minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>
<xsd:element name="telephone" type="xsd:string" />
</xsd:schema>'
go
-- now grant ALTER permission to TestLogin1
setuser
go
GRANT ALTER ON XML SCHEMA COLLECTION::myTestSchemaCollection TO TestLogin1
go
-- now TestLogin1 should be able to add components to the collection
setuser 'TestLogin1'
go
ALTER XML SCHEMA COLLECTION myTestSchemaCollection ADD '
<xsd:schema targetNamespace="http://schemas.adventure-works.com/Additional/ContactInfo" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns="http://schemas.adventure-works.com/Additional/ContactInfo" 
elementFormDefault="qualified">
 <xsd:element name="pager" type="xsd:string"/>
</xsd:schema>
'
Go
-- Final cleanup 
SETUSER
go
USE master
go
DROP DATABASE SampleDBForSchemaPermissions
go
DROP LOGIN TestLogin1
go

D. Conceder el permiso TAKE OWNERSHIP en una colección de esquemas XML

Este ejemplo muestra cómo la propiedad del esquema XML puede transferirse de un usuario a otro. Para hacer más interesante el ejemplo, los usuarios de este ejemplo trabajarán con diferentes esquemas relacionales predeterminados.

En el ejemplo, se realizan las tareas siguientes:

  • Crear una base de datos con dos esquemas relacionales: dbo y myOtherDBSchema.
  • Crear dos usuarios: TestLogin1 y TestLogin2. TestLogin2 se convierte en el propietario del esquema relacional myOtherDBSchema.
  • TestLogin1 crea una colección de esquemas XML en el esquema relacional dbo.
  • A continuación, TestLogin1 concede el permiso TAKE OWNERSHIP en la colección de esquemas XML a TestLogin2.
  • TestLogin2 se convierte en el propietario de la colección de esquemas XML en myOtherDBSchema, sin cambiar el esquema relacional de la colección de esquemas XML.
CREATE LOGIN TestLogin1 with password='SQLSvrPwd1'
go
CREATE LOGIN TestLogin2 with password='SQLSvrPwd2'
go
CREATE DATABASE SampleDBForSchemaPermissions
go
USE SampleDBForSchemaPermissions
go
-- Create another relational schema in the db
CREATE SCHEMA myOtherDBSchema
go
-- Create users in the database. Note TestLogin2's default schema is
-- myOtherDBSchema
CREATE USER TestLogin1
go
CREATE USER TestLogin2 WITH DEFAULT_SCHEMA=myOtherDBSchema
go
-- TestLogin2 will own myOtherDBSchema relational schema
ALTER AUTHORIZATION ON SCHEMA::myOtherDBSchema TO TestLogin2
go

-- For TestLogin1 to create XML schema collection, following
-- permission needed.
GRANT CREATE XML SCHEMA COLLECTION 
TO TestLogin1
go
GRANT ALTER ON SCHEMA::dbo TO TestLogin1
go
-- Now TestLogin1 can create an XML schema collection.
setuser 'TestLogin1'
go
CREATE XML SCHEMA COLLECTION myTestSchemaCollection AS '<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema targetNamespace="http://schemas.adventure-works.com/Additional/ContactInfo" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified">

<xsd:element name="AdditionalContactInfo" >
 <xsd:complexType mixed="true" >
    <xsd:sequence>
      <xsd:any processContents="strict" 
               namespace="http://schemas.adventure-works.com/Contact/Record 
                          http://schemas.adventure-works.com/AdditionalContactTypes"
               minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
 </xsd:complexType>
</xsd:element>
<xsd:element name="telephone" type="xsd:string" />
</xsd:schema>'
go

-- grant TAKE OWNERSHIP to TestLogin2
SETUSER
go
GRANT TAKE OWNERSHIP ON XML SCHEMA COLLECTION::dbo.myTestSchemaCollection 
TO TestLogin2
go
-- verify the owner. Note the UserName and Principal_id is null. 
SELECT user_name(sys.xml_schema_collections.principal_id) as UserName, 
       sys.schemas.name as RelSchemaName,* 
FROM   sys.xml_schema_collections 
      JOIN sys.schemas 
      ON sys.schemas.schema_id=sys.xml_schema_collections.schema_id
go
-- TestLogin2 can take ownership now
setuser 'TestLogin2'
go
ALTER AUTHORIZATION ON XML SCHEMA COLLECTION::dbo.myTestSchemaCollection 
TO TestLogin2
go
-- Note that although TestLogin2 is the owner,the XML schema collection 
-- is still in dbo
SELECT user_name(sys.xml_schema_collections.principal_id) as UserName, 
      sys.schemas.name as RelSchemaName,* 
FROM sys.xml_schema_collections JOIN sys.schemas 
     ON sys.schemas.schema_id=sys.xml_schema_collections.schema_id
go

-- TestLogin2 moves the collection from dbo to myOtherDBSchema relational schema
-- TestLogin2 already has all necessary permissions
-- 1) TestLogin2 owns the destination relational schema so he can ALTER it
-- 2) TestLogin2 owns the XML schema collection (thus has CONTROL permission)
ALTER SCHEMA myOtherDBSchema
TRANSFER XML SCHEMA COLLECTION::dbo.myTestSchemaCollection
go

SELECT user_name(sys.xml_schema_collections.principal_id) as UserName, 
       sys.schemas.name as RelSchemaName,* 
FROM   sys.xml_schema_collections JOIN sys.schemas 
       ON sys.schemas.schema_id=sys.xml_schema_collections.schema_id
go
-- final cleanup 
SETUSER
go
USE master
go
DROP DATABASE SampleDBForSchemaPermissions
go
DROP LOGIN TestLogin1
DROP LOGIN TestLogin2
go 

E. Conceder el permiso VIEW DEFINITION en una colección de esquemas XML

Este ejemplo muestra cómo se conceden los permisos VIEW DEFINITION para una colección de esquemas XML:

SETUSER
go
use master
go
if exists( select * from sysdatabases where name='permissionsDB' )
   drop database permissionsDB
go
if exists( select * from sys.sql_logins where name='schemaUser' )
   drop login schemaUser
go
CREATE DATABASE permissionsDB
go
CREATE LOGIN schemaUser WITH PASSWORD='Pass#123',DEFAULT_DATABASE=permissionsDB
go
GRANT CONNECT SQL TO schemaUser
go
USE permissionsDB
go
CREATE USER schemaUser WITH DEFAULT_SCHEMA=dbo
go
CREATE XML SCHEMA COLLECTION MySC AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ns"
xmlns:ns="http://ns">

   <simpleType name="ListOfIntegers">
      <list itemType="integer"/>
   </simpleType>

   <element name="root" type="ns:ListOfIntegers"/>

   <element name="gRoot" type="gMonth"/>

</schema>
'
go
-- schemaUser cannot see the contents of the collection
setuser 'schemaUser'
go
SELECT XML_SCHEMA_NAMESPACE(N'dbo',N'MySC')
go

-- grant schemaUser VIEW DEFINITION and REFERENCES permissions
-- on the xml schema collection
SETUSER
go
GRANT VIEW DEFINITION ON XML SCHEMA COLLECTION::dbo.MySC TO schemaUser
go
GRANT REFERENCES ON XML SCHEMA COLLECTION::dbo.MySC TO schemaUser
go
-- now schemaUser can see the content of the collection
setuser 'schemaUser'
go
SELECT XML_SCHEMA_NAMESPACE(N'dbo',N'MySC')
go
-- revoke schemaUser VIEW DEFINITION permissions
-- on the xml schema collection
SETUSER
go
REVOKE VIEW DEFINITION ON XML SCHEMA COLLECTION::dbo.MySC FROM schemaUser
go
-- now schemaUser cannot see the contents of 
-- the collection anymore
setuser 'schemaUser'
go
SELECT XML_SCHEMA_NAMESPACE(N'dbo',N'MySC')
go

Vea también

Referencia

Administrar colecciones de esquemas XML en el servidor
Directrices y limitaciones del uso de colecciones de esquemas XML en el servidor
Permisos en una colección de esquemas XML

Conceptos

Tipo de datos xml
XML con tipo y sin tipo

Ayuda e información

Obtener ayuda sobre SQL Server 2005