XML スキーマ コレクションを作成するためのアクセス許可を付与したり、XML スキーマ コレクション オブジェクトに対する権限を付与したりできます。
XML スキーマ コレクションを作成するためのアクセス許可の付与
XML スキーマ コレクションを作成するには、次のアクセス許可が必要です。
プリンシパルには、データベース レベルで CREATE XML SCHEMA COLLECTION 権限が必要です。
XML スキーマ コレクションはリレーショナル スキーマ スコープであるため、プリンシパルにはリレーショナル スキーマに対する ALTER 権限も必要です。
次の権限を使用すると、プリンシパルはサーバー上のデータベースのリレーショナル スキーマに XML スキーマ コレクションを作成できます。
サーバーに対する CONTROL 権限
サーバーに対する ALTER ANY DATABASE の権限
データベースに対する ALTER 権限
データベースのコントロール権限
データベースの ALTER ANY SCHEMA 権限と CREATE XML SCHEMA COLLECTION 権限
リレーショナル スキーマに対する ALTER 権限または CONTROL 権限、およびデータベース内の XML スキーマ 集合を作成する権限 (CREATE XML SCHEMA COLLECTION 権限)
この最後のアクセス許可の方法は、次の例で使用します。
リレーショナル スキーマの所有者は、そのスキーマで作成された XML スキーマ コレクションの所有者になります。 その後、この所有者は XML スキーマ コレクションを完全に制御できます。 そのため、この所有者は XML スキーマ コレクションを変更したり、xml 列を入力したり、XML スキーマ コレクションを削除することができます。
XML スキーマ コレクション オブジェクトに対する権限の付与
XML スキーマ コレクションでは、次のアクセス許可が許可されます。
ALTER XML SCHEMA COLLECTION ステートメントを使用して既存の XML スキーマ コレクションの内容を変更する場合は、ALTER 権限が必要です。
CONTROL 権限を使用すると、ユーザーは XML スキーマ コレクションに対して任意の操作を実行できます。
1 つのプリンシパルから別のプリンシパルに XML スキーマ コレクションの所有権を転送するには、TAKE OWNERSHIP アクセス許可が必要です。
REFERENCES 権限は、XML スキーマ コレクションを使用して、テーブル、ビュー、パラメーター内の
xml
型の列を型付けまたは制約するプリンシパルを承認します。 REFERENCES 権限は、ある XML スキーマ コレクションが別の XML スキーマ コレクションを参照する場合にも必要です。VIEW DEFINITION 権限を使用すると、プリンシパルは、コレクションに対する ALTER、REFERENCES、または CONTROL 権限のいずれかを持つ場合、XML_SCHEMA_NAMESPACEまたはカタログ ビューを介して XML スキーマ コレクションの内容を照会できます。
EXECUTE 権限は、
xml
型の列、変数、およびパラメーターを入力または制約している XML スキーマ コレクションに対して、プリンシパルによって挿入または更新された値を検証するために必要です。 また、これらの列と変数に格納されている XML に対してクエリを実行する場合も、このアクセス許可が必要です。
例示
次の例のシナリオは、XML スキーマのアクセス許可のしくみを示しています。 各例では、必要なテスト データベース、リレーショナル スキーマ、ログインを作成します。 これらのログインには、必要な XML スキーマ コレクションのアクセス許可が付与されます。 各例では、最後に必要なクリーンアップを行います。
A。 XML スキーマ コレクションを作成するためのアクセス許可の付与
次の例は、プリンシパルが XML スキーマ コレクションを作成できるようにアクセス許可を付与する方法を示しています。 この例では、サンプル データベースとテスト ユーザー ( TestLogin1
) を作成します。
TestLogin1
その後、リレーショナル スキーマ ALTER
アクセス許可が付与され、データベースに対する CREATE XML SCHEMA COLLECTION
アクセス許可が付与されます。 これらのアクセス許可により、 TestLogin1
はサンプル XML スキーマ コレクションの作成に成功します。
SETUSER
GO
USE master
GO
CREATE LOGIN TestLogin1 WITH password='SQLSvrPwd1'
GO
CREATE DATABASE SampleDBForSchemaPermissions
GO
USE SampleDBForSchemaPermissions
GO
CREATE USER TestLogin1
GO
-- User must have ALTER permission on the relational schema in the database.
GRANT ALTER ON SCHEMA::dbo TO TestLogin1
GO
-- User also must have permission to create XML schema collections in the database.
GRANT CREATE XML SCHEMA COLLECTION
TO TestLogin1
GO
-- 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
B. 既存の XML スキーマ コレクションを使用するためのアクセス許可の付与
次の例では、XML スキーマ コレクションのアクセス許可モデルをさらに示します。 この例では、XML スキーマ コレクションを作成して使用するために必要なさまざまなアクセス許可を示します。
この例では、テスト データベースとログイン ( TestLogin1
) を作成します。
TestLogin1
は、データベースに XML スキーマ コレクションを作成します。 次に、ログインによってテーブルが作成され、XML スキーマ コレクションを使用して型指定された xml 列が作成されます。 その後、ユーザーはデータを挿入してクエリを実行します。 これらの手順はすべて、コードに示すように、必要なスキーマのアクセス許可を必要とします。
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 must have ALTER permission on the relational schema in the database.
GRANT ALTER ON SCHEMA::dbo TO TestLogin1
GO
-- User also must have permission to create XML schema collections in the database.
GRANT CREATE XML SCHEMA COLLECTION
TO TestLogin1
GO
-- Now user can execute the previous CREATE XML SCHEMA COLLECTION statement.
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
-- Create a table by using the collection to type an XML column.
--TestLogin1 must have permission to create a table.
SETUSER
GO
GRANT CREATE TABLE TO TestLogin1
GO
-- The user also must have REFERENCES permission to use the XML schema collection
-- to create a typed XML column (REFERENCES permission on schema
-- collection is not needed).
GRANT REFERENCES ON XML SCHEMA COLLECTION::myTestSchemaCollection
TO TestLogin1
GO
-- Now user can create a 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, the 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 must have INSERT permission.
GRANT INSERT TO TestLogin1
GO
-- Now the user can insert data into 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 must have 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 element namespace "http://schemas.adventure-works.com/Additional/ContactInfo" /telephone[1]')
FROM MyTestTable
GO
-- To show that the user must have EXECUTE permission to query, revoke the
-- 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 element 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. XML スキーマ コレクションに対する ALTER 権限の付与
データベース内の既存の XML スキーマ コレクションを変更するには、ユーザーに ALTER 権限が必要です。 次の例は、 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 must have ALTER permission on the relational schema in the database.
GRANT ALTER ON SCHEMA::dbo TO TestLogin1
GO
-- User also must have permission to create XML schema collections in the database.
GRANT CREATE XML SCHEMA COLLECTION
TO TestLogin1
GO
-- Now user can execute the previous CREATE XML SCHEMA COLLECTION statement.
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 ALTER permission to TestLogin1.
setuser
GO
GRANT ALTER ON XML SCHEMA COLLECTION::myTestSchemaCollection TO TestLogin1
GO
-- 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. XML スキーマ コレクションに対する TAKE OWNERSHIP 権限の付与
次の例は、あるユーザーから別のユーザーに XML スキーマの所有権を転送する方法を示しています。 この例をより興味深いものにするために、この例のユーザーはさまざまな既定のリレーショナル スキーマで動作します。
この例では、次のことが行われます。
dbo
とmyOtherDBSchema
) の 2 つのリレーショナル スキーマを持つデータベースを作成します。TestLogin1
とTestLogin2
の 2 人のユーザーを作成します。TestLogin2
は、myOtherDBSchema
リレーショナル スキーマの所有者になります。TestLogin1
は、dbo
リレーショナル スキーマに XML スキーマ コレクションを作成します。TestLogin1
はTAKE OWNERSHIP
に XML スキーマ コレクションのアクセス許可をTestLogin2
に与えます。TestLogin2
は、XML スキーマ コレクションのリレーショナル スキーマを変更せずに、myOtherDBSchema
の 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 database.
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, the following
-- permission is required.
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 (therefore, 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. XML スキーマ コレクションに対する VIEW DEFINITION 権限の付与
次の例は、XML スキーマ コレクションに対して VIEW DEFINITION 権限を付与する方法を示しています。
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.
setuser 'schemaUser'
GO
SELECT XML_SCHEMA_NAMESPACE(N'dbo',N'MySC')
GO
こちらもご覧ください
XML データ (SQL Server)
型指定された XML と型指定されていない XML の比較
XML スキーマ コレクション (SQL Server)
サーバー上の XML スキーマ コレクションの要件と制限事項