sql server 2005 T-SQL ALETER 命令集合

ALTER ASSEMBLY (Transact-SQL)

更新日期: 2005 年 12 月 5 日

通过修改程序集的 SQL Server 目录属性更改程序集。ALTER ASSEMBLY 将程序集刷新为保存其实现的 Microsoft .NET Framework 模块的最新副本,并添加或删除与之关联的文件。可以使用 CREATE ASSEMBLY 创建程序集。

主题链接图标 Transact-SQL 语法约定

ALTER ASSEMBLY assembly_name
    [ FROM <client_assembly_specifier> | <assembly_bits> ]
    [ WITH <assembly_option> [ ,...n ] ]
    [ DROP FILE { file_name [ ,...n ] | ALL } ]
    [ ADD FILE FROM 
    { 
                client_file_specifier [ AS file_name ] 
      | file_bits AS file_name 
    } [,...n ] 
    ] [ ; ]
<client_assembly_specifier> :: =
        '//computer_name/share-name/[path/]manifest_file_name'
  | '[local_path/]manifest_file_name'

<assembly_bits> :: =
    { varbinary_literal | varbinary_expression }

<assembly_option> :: =
    PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE } 
  | VISIBILITY = { ON | OFF } ]
  | UNCHECKED DATA
assembly_name

要修改的程序集名称。assembly_name 必须已经存在于数据库中。

FROM <client_assembly_specifier> | <assembly_bits>

将程序集更新到保存其实现的 .NET Framework 模块的最新副本。仅当没有与指定程序集关联的文件时才能使用此选项。

<client_assembly_specifier> 指定刷新的程序集所在的网络位置或本地位置。网络位置包括计算机名称、共享名称和该共享中的路径。manifest_file_name 指定包含程序集清单的文件的名称。

<assembly_bits> 是该程序集的二进制值。

必须为需要更新的任何相关程序集发出单独的 ALTER ASSEMBLY 语句。

PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE }

指定程序集的 .NET Framework 代码访问权限集属性。有关此属性的详细信息,请参阅 CREATE ASSEMBLY (Transact-SQL)

VISIBILITY = { ON | OFF }

指示在创建公共语言运行时 (CLR) 函数、存储过程、触发器、用户定义的类型以及针对它的用户定义的聚合函数时,该程序集是否可见。如果设置为 OFF,则程序集只能由其他程序集调用。如果存在已针对该程序集创建的现有 CLR 数据库对象,则无法更改程序集的可见性。默认情况下,由 assembly_name 引用的任何程序集都上载为不可见。

UNCHECKED DATA

默认情况下,如果 ALTER ASSEMBLY 必须验证各个表行的一致性,则它将失败。该选项使您可以通过使用 DBCC CHECKTABLE 将检查推迟到以后的某个时间进行。如果指定该选项,则即使数据库中存在包含下列项的表,SQL Server 仍将执行 ALTER ASSEMBLY 语句:

  • 持久化计算列,这些列通过 Transact-SQL 函数或方法直接或间接引用程序集中的方法。
  • 直接或间接引用程序集中方法的 CHECK 约束。
  • 属于 CLR 用户定义类型且依赖于程序集的列,并且该类型实现的是 UserDefined(非 Native)序列化格式。
  • CLR 用户定义类型的列,这些列引用通过使用 WITH SCHEMABINDING 创建的视图。

如果存在 CHECK 约束,则它们将被禁用并标记为不可信。任何包含依赖于程序集的列的表都被标记为包含未检查数据,直到对这些表进行了显式检查为止。

只有 db_ownerdb_ddlowner 固定数据库角色的成员才能指定该选项。

有关详细信息,请参阅实现程序集

[ DROP FILE { file_name[ , ...n] | ALL } ]

从数据库中删除与程序集关联的文件名,或与该程序集关联的所有文件。如果与下面的 ADD FILE 一起使用,则 DROP FILE 首先执行。这样可以用相同的文件名替换文件。

[ ADD FILE FROM { client_file_specifier [ AS file_name] | file_bitsAS file_name}

将与程序集关联的文件(如源代码、调试文件或其他相关信息)上载到服务器中并使其在 sys.assembly_files 目录视图中可见。client_file_specifier 指定上载文件的位置。可以改用 file_bits 来指定构成该文件的二进制值列表。file_name 指定将文件存储到 SQL Server 实例中时所采用的名称。如果指定了 file_bits,则必须指定 file_name,如果指定了 client_file_specifier,则该参数是可选的。如果未指定 file_name,则将 client_file_specifier 的 file_name 部分用作 file_name

ALTER ASSEMBLY 不中断当前正在运行的会话,这些会话正在运行所修改的程序集中的代码。当前会话通过使用程序集的未更改位完成执行。

如果指定 FROM 子句,则 ALTER ASSEMBLY 相对于所提供的模块的最新副本更新程序集。由于 SQL Server 实例中可能存在已针对程序集定义的 CLR 函数、存储过程、触发器、数据类型和用户定义的聚合函数,因此 ALTER ASSEMBLY 语句将它们重新绑定到该程序集的最新实现。若要完成实现此重新绑定,映射到 CLR 函数、存储过程和触发器的方法必须仍存在于具有相同签名的已修改程序集中。实现 CLR 用户定义的类型和用户定义的聚合函数的类必须仍满足作为用户定义的类型或聚合的要求。

注意:
如果未指定 WITH UNCHECKED DATA,则新建程序集版本影响表、索引或其他持久性站点中的现有数据时,SQL Server 将尝试阻止 ALTER ASSEMBLY 执行。但是,SQL Server 不保证在更新 CLR 程序集时,计算列、索引、索引视图或表达式与基本例程和类型一致。执行 ALTER ASSEMBLY 时要小心,确保表达式的结果与程序集中基于该表达式的值之间不存在不匹配。

 

 

ALTER ASSEMBLY 可更改程序集版本。程序集的区域性和公钥标记保持不变。

ALTER ASSEMBLY 语句无法用于更改以下各项:

  • SQL Server 实例中引用此程序集的 CLR 函数、聚合函数、存储过程和触发器的签名。如果 SQL Server 无法将 SQL Server 中的 .NET Framework 数据库对象与程序集的新版本重新绑定,则 ALTER ASSEMBLY 将失败。
  • 使用其他程序集调用的该程序集中的方法签名。
  • 与此程序集依赖的程序集列表,在此程序集的 DependentList 属性中引用。
  • 方法的可索引性,除非没有直接或间接与该方法相关的索引或持久化计算列。
  • CLR 表值函数的 FillRow 方法名属性。
  • 用户定义聚合的 AccumulateTerminate 方法签名。
  • 系统程序集。
  • 程序集所有权。请改用 ALTER AUTHORIZATION (Transact-SQL)

此外,对于实现用户定义类型的程序集,ALTER ASSEMBLY 只能用于进行下列更改:

  • 在不更改签名或属性的情况下,修改用户定义类型类的公共方法。
  • 添加新的公共方法。
  • 以任何方式修改私有方法。

不能使用 ALTER ASSEMBLY 更改本机序列化用户定义类型(包含数据成员或基类)内包含的字段。不支持所有其他更改。

如果未指定 ADD FILE FROM,则 ALTER ASSEMBLY 将删除任何与程序集关联的文件。

如果执行了没有 UNCHECKED 数据子句的 ALTER ASSEMBLY,则执行检查以验证新数据集版本是否影响表中的现有数据。根据需要检查的数据量,这可能影响性能。

需要对程序集具有 ALTER 权限。其他要求如下:

  • 若要更改其现有权限集为 EXTERNAL_ACCESS 的程序集,SQL Server 登录必须拥有服务器的 EXTERNAL ACCESS 权限。
  • 更改其现有权限集为 UNSAFE 的程序集,需要具有 sysadmin 固定服务器角色中的成员身份。
  • 若要将程序集的权限集更改为 EXTERNAL_ACCESS,SQL Server 登录必须拥有服务器的 EXTERNAL ACCESS ASSEMBLY 权限。
  • 若要将程序集的权限集更改为 UNSAFE,需要具有 sysadmin 固定服务器角色中的成员身份。
  • 指定 WITH UNCHECKED DATA 需要具有 sysadmin 固定服务器角色中的成员身份。

有关程序集的权限集的详细信息,请参阅设计程序集

A. 刷新程序集

以下示例将程序集 ComplexNumber 更新到保存其实现的 .NET Framework 模块的最新副本。

注意:
可以通过运行 UserDefinedDataType 示例脚本创建程序集 ComplexNumber。有关详细信息,请参阅用户定义数据类型 (UDT) 示例

 

 

ALTER ASSEMBLY ComplexNumber

FROM 'C:/Program Files/Microsoft SQL Server/90/Tools/Samples/1033/Engine/Programmability/CLR/UserDefinedDataType/CS/ComplexNumber/obj/Debug/ComplexNumber.dll'

B. 添加一个文件以与程序集关联

以下示例上载源代码文件 Class1.cs,使之与程序集 MyClass 关联。该示例假设已在数据库中创建了程序集 MyClass

ALTER ASSEMBLY MyClass 
ADD FILE FROM 'C:/MyClassProject/Class1.cs';

C. 更改程序集的权限

以下示例将程序集 ComplexNumber 的权限集由 SAFE 更改为 EXTERNAL ACCESS

ALTER ASSEMBLY ComplexNumber WITH PERMISSION_SET = EXTERNAL_ACCESS
 
ALTER APPLICATION ROLE (Transact-SQL)

更改应用程序角色的名称、密码或默认架构。

主题链接图标 Transact-SQL 语法约定

ALTER APPLICATION ROLE application_role_name 
        WITH <set_item> [ ,...n ]

<set_item> ::= 
    NAME = new_application_role_name 
    | PASSWORD = 'password'
    | DEFAULT_SCHEMA = schema_name

如果数据库中已存在新的应用程序角色名称,则该语句将失败。当更改应用程序角色的名称、密码或默认架构更改时,与该角色关联的 ID 将不会随之改变。

重要提示:
密码过期策略不应用于应用程序角色密码。为此,选择强密码时要格外谨慎。调用应用程序角色的应用程序必须存储其密码。

 

 

sys.database_principals 目录视图中可以查看应用程序角色。

注意:
在 SQL Server 2005 中,架构的行为与早期版本的 SQL Server 中的行为不同。假设架构与数据库用户等价的代码不能返回正确的结果。在曾经使用过以下任何 DDL 语句的数据库中,不应当使用旧目录视图(包括 sysobjects):CREATE SCHEMA、ALTER SCHEMA、DROP SCHEMA、CREATE USER、ALTER USER、DROP USER、CREATE ROLE、ALTER ROLE、DROP ROLE、CREATE APPROLE、ALTER APPROLE、DROP APPROLE、ALTER AUTHORIZATION。在曾经使用过这些语句中的任意一个语句的数据库中,必须使用新的目录视图。新的目录视图将采用在 SQL Server 2005 中引入的使主体和架构分离的方法。有关目录视图的详细信息,请参阅目录视图 (Transact-SQL)

 

 

要求对数据库具有 ALTER ANY APPLICATION ROLE 权限。若要更改默认架构,用户还需要对应用程序角色有 ALTER 权限。应用程序角色可以修改其自身的默认架构,但不能修改其名称或密码。

A. 更改应用程序角色的名称

以下示例将应用程序角色 weekly_receipts 的名称更改为 receipts_ledger

USE AdventureWorks;
CREATE APPLICATION ROLE weekly_receipts 
    WITH PASSWORD = '987Gbv8$76sPYY5m23' , 
    DEFAULT_SCHEMA = Sales;
GO
ALTER APPLICATION ROLE weekly_receipts 
    WITH NAME = receipts_ledger;
GO

B. 更改应用程序角色的密码

以下示例将更改应用程序角色 receipts_ledger 的密码。

ALTER APPLICATION ROLE receipts_ledger 
    WITH PASSWORD = '897yUUbv867y$200nk2i';
GO

C. 更改名称、密码和默认架构

以下示例将同时更改应用程序角色 receipts_ledger 的名称、密码和默认架构。

ALTER APPLICATION ROLE receipts_ledger 
    WITH NAME = weekly_ledger, 
    PASSWORD = '897yUUbv77bsrEE00nk2i', 
    DEFAULT_SCHEMA = Production;
GO
               
               
ALTER ASYMMETRIC KEY (Transact-SQL)

更改非对称密钥的属性。

主题链接图标 Transact-SQL 语法约定

 ALTER ASYMMETRIC KEY Asym_Key_Name <alter_option>  <alter_option> ::=     <password_change_option>     |      REMOVE PRIVATE KEY  <password_change_option> ::=     WITH PRIVATE KEY ( <password_option> [ , <password_option> ] )  <password_option> ::=     ENCRYPTION BY PASSWORD = 'password'     |     DECRYPTION BY PASSWORD = 'old_password'
Asym_Key_Name

非对称密钥在数据库中所使用的名称。

REMOVE PRIVATE KEY

从非对称密钥中删除私钥,但不删除公钥。

WITH PRIVATE KEY

更改私钥的保护。

ENCRYPTION BY PASSWORD = ' password '

指定用于保护私钥的新密码。将检查密码的复杂性。如果省略该选项,则使用数据库主密钥对私钥进行加密。

DECRYPTION BY PASSWORD = ' password '

指定当前用于保护私钥的旧密码。如果私钥使用数据库主密钥进行加密,则不需要指定旧密码。

如果没有 ENCRYPTION BY PASSWORD 选项所需的数据库主密钥,并且未提供任何密码,则该操作将失败。有关如何创建数据库主密钥的信息,请参阅 CREATE MASTER KEY (Transact-SQL)

您可以按下表所示,指定 PRIVATE KEY 选项,然后使用 ALTER ASYMMETRIC KEY 更改私钥的保护。

更改其保护 密码加密 密码解密

旧密码到新密码

需要

需要

密码到主密钥

省略

需要

主密钥到密码

需要

省略

必须首先打开数据库主密钥,然后才能使用它来保护私钥。有关详细信息,请参阅 OPEN MASTER KEY (Transact-SQL)

若要更改非对称密钥的所有权,请使用 ALTER AUTHORIZATION

如果要删除私钥,则要求对非对称密钥具有 CONTROL 权限。

A. 更改私钥的密码

以下示例更改用于保护非对称密钥 PacificSales09 的私钥的密码。新密码为 85423sdvcx7987$$2ooo

ALTER ASYMMETRIC KEY PacificSales09 
    WITH PRIVATE KEY (
    DECRYPTION BY PASSWORD = 'bmsA$dk7i82bv55foajsd9764',
    ENCRYPTION BY PASSWORD = '85423sdvcx7987$2ooo');
GO

B. 从非对称密钥中删除私钥

以下示例从 PacificSales19 中删除私钥,只保留公钥。

ALTER ASYMMETRIC KEY PacificSales19 REMOVE PRIVATE KEY;
GO

C. 从私钥中删除密码保护

以下示例从私钥中删除密码保护,然后使用数据库主密钥来保护该私钥。

OPEN MASTER KEY;
ALTER ASYMMETRIC KEY PacificSales09 WITH PRIVATE KEY (
    DECRYPTION BY PASSWORD = 'bmsA$dk7i82bv55foajsd9764' );
GO
                       
                       
ALTER AUTHORIZATION (Transact-SQL)

更改安全对象的所有权。

主题链接图标 Transact-SQL 语法约定

ALTER AUTHORIZATION
   ON [ <entity_type> :: ] entity_name
   TO { SCHEMA OWNER | principal_name }

<entity_type> ::=
    {
        Object | Type | XML Schema Collection | Fulltext Catalog | Schema
    | Assembly | Role | Message Type | Contract | Service 
    | Remote Service Binding | Route | Symmetric Key | Endpoint 
    | Certificate | Database
    }
<entity_type> ::

更改其所有者的实体的类。Object 是默认值。

entity_name

实体名。

principal_name

将拥有实体的主体名称。

ALTER AUTHORIZATION 可用于更改任何具有所有者的实体的所有权。数据库包含的实体的所有权,可以传递给任何数据库级的主体。服务器级实体的所有权只能传递给服务器级主体。

重要提示:
在 SQL Server 2005 中,用户可拥有由另一个数据库用户拥有的架构所包含的 OBJECT 或 TYPE。这是对早期版本的 SQL Server 的行为的更改。有关详细信息,请参阅用户架构分离OBJECTPROPERTY (Transact-SQL)TYPEPROPERTY (Transact-SQL)

 

 

以下包含在架构中、类型为“object”的实体的所有权可以传递:表、视图、函数、过程、队列和同义词。

不能传输以下实体的所有权:链接服务器、统计信息、约束、规则、默认值、触发器、Service Broker 队列、凭据、分区函数、分区方案、数据库主密钥、服务主密钥和事件通知。

以下安全对象类的成员所有权不能进行传递:服务器、登录、用户、应用程序角色和列。

仅当传递架构包含的实体的所有权时,SCHEMA OWNER 选项才有效。SCHEMA OWNER 将实体所有权传递给它所在的架构所有者。只有类 OBJECT、TYPE 或 XML SCHEMA COLLECTION 的实体是架构包含的。

如果目标实体不是数据库,且该实体正被传递给新的所有者,则该目标的所有权限将被删除。

注意:
在 SQL Server 2005 中,架构的行为与早期版本的 SQL Server 中的行为不同。假设架构与数据库用户等价的代码不能返回正确的结果。在曾经使用过以下任何 DDL 语句的数据库中,不应当使用旧目录视图(包括 sysobjects):CREATE SCHEMA、ALTER SCHEMA、DROP SCHEMA、CREATE USER、ALTER USER、DROP USER、CREATE ROLE、ALTER ROLE、DROP ROLE、CREATE APPROLE、ALTER APPROLE、DROP APPROLE、ALTER AUTHORIZATION。在曾经使用过这些语句中的任意一个语句的数据库中,必须使用新的目录视图。新的目录视图将采用在 SQL Server 2005 中引入的使主体和架构分离的方法。有关目录视图的详细信息,请参阅目录视图 (Transact-SQL)

 

 

特殊事例和条件

下表列出了适用于更改授权的特殊事例、异常和条件。

条件

DATABASE

无法更改系统数据库 mastermodeltemp、资源数据库或用作分发数据库的数据库的所有者。主体必须为登录名。如果主体是没有相应 SQL Server 登录的 Windows 登录,则该主体必须拥有数据库的 CONTROL SERVER 权限和 TAKE OWNERSHIP 权限。如果主体为 SQL Server 登录,则无法将该主体映射到证书或非对称密钥。相关别名将映射到新数据库所有者。DBO SID 将在当前数据库和 sys.databases 中更新。

OBJECT

无法更改触发器、约束、规则、默认值、统计信息、系统对象、队列、索引视图或具有索引视图的表的所有权。

SCHEMA

传递所有权时,没有显式所有者的架构包含的对象的权限将被删除。无法更改 sysdboinformation_schema 的所有者。

TYPE

无法更改属于 sysinformation_schema 的 TYPE 的所有权。

CONTRACT、MESSAGE TYPE 或 SERVICE

无法更改系统实体的所有权。

SYMMETRIC KEY

无法更改全局临时密钥的所有权。

CERTIFICATE 或 ASYMMETRIC KEY

无法将这些实体的所有权传递给角色或组。

ENDPOINT

主体必须为登录名。

需要对实体具有 TAKE OWNERSHIP 权限。如果新所有者不是执行该语句的用户,那么:1) 如果新所有者是用户或登录名,则需要该所有者的 IMPERSONATE 权限;2) 如果新所有者是角色,则需要该角色中的成员身份或该角色的 ALTER 权限;3) 如果新所有者是应用程序角色,则需要该应用程序角色的 ALTER 权限。

A. 传递表的所有权

以下示例将表 Sprockets 的所有权传递给用户 MichikoOsada。该表位于架构 Parts 内部。

ALTER AUTHORIZATION ON OBJECT::Parts.Sprockets TO MichikoOsada;
GO

该查询可能如下所示:

ALTER AUTHORIZATION ON Parts.Sprockets TO MichikoOsada;
GO

B. 将视图的所有权传递给架构所有者

以下示例将视图 ProductionView06 的所有权传递给包含它的架构的所有者。视图位于架构 Production 内部。

ALTER AUTHORIZATION ON OBJECT::Production.ProductionView06 TO SCHEMA OWNER;
GO

C. 将架构的所有权传递给用户

以下示例将架构 SeattleProduction11 的所有权传递给用户 SandraAlayo

ALTER AUTHORIZATION ON SCHEMA::SeattleProduction11 TO SandraAlayo;
GO

D. 将端点的所有权传递给 SQL Server 登录

以下示例将端点 CantabSalesServer1 的所有权传递给 JaePak。由于该端点是服务器级安全对象,因此只能将它传递给服务器级主体。

ALTER AUTHORIZATION ON ENDPOINT::CantabSalesServer1 TO JaePak;
GO
 
                               
                               
ALTER CERTIFICATE (Transact-SQL)

更新日期: 2007 年 2 月 1 日

更改用于加密证书的私钥,如果不存在则添加私钥。更改证书对于 Service Broker 的可用性。

主题链接图标 Transact-SQL 语法约定

 ALTER CERTIFICATE certificate_name      REMOVE PRIVATE KEY     |     WITH PRIVATE KEY ( <private_key_spec> [ ,... ] )     |     WITH ACTIVE FOR BEGIN_DIALOG = [ ON | OFF ]   <private_key_spec> ::=      FILE = 'path_to_private_key'      |     DECRYPTION BY PASSWORD = 'key_password'      |     ENCRYPTION BY PASSWORD = 'password' 
certificate_name

在数据库中标识证书的唯一名称。

FILE = ' path_to_private_key '

指定私钥的完整路径(包括文件名)。此参数可以是本地路径或网络位置的 UNC 路径。将在 SQL Server 服务帐户的安全上下文中访问此文件。使用此选项时,必须确保服务帐户有权访问指定的文件。

DECRYPTION BY PASSWORD = ' key_password '

指定解密私钥所需的密码。

ENCRYPTION BY PASSWORD = ' password '

指定用于对数据库中的证书私钥进行加密的密码。此密码受密码复杂性策略约束。有关详细信息,请参阅密码策略

REMOVE PRIVATE KEY

指定私钥不应再保留在数据库内。

ACTIVE FOR BEGIN_DIALOG = { ON | OFF }

使证书可用于 Service Broker 对话会话的发起方。

私钥必须与 certificate_name 指定的公钥相对应。

如果文件中的密码受空密码保护,则可省略 DECRYPTION BY PASSWORD 子句。

在从文件中导入数据库已存在的证书私钥时,该私钥将自动受到数据库主密钥的保护。若要使用密码保护私钥,请使用 ENCRYPTION BY PASSWORD 短语。

REMOVE PRIVATE KEY 选项将从数据库中删除证书的私钥。当使用证书来验证签名或在不需要私钥的 Service Broker 方案中时,可以执行此操作。请勿删除保护对称密钥的证书的私钥。

如果使用数据库主密钥加密私钥,则不必指定解密密码。

重要提示:
从数据库删除私钥前,始终对其建立存档副本。有关详细信息,请参阅 BACKUP CERTIFICATE (Transact-SQL)

 

 

需要对证书具有 ALTER 权限。

A. 更改证书的密码

ALTER CERTIFICATE Shipping04 
    WITH PRIVATE KEY (DECRYPTION BY PASSWORD = 'pGF$5DGvbd2439587y',
    ENCRYPTION BY PASSWORD = '4-329578thlkajdshglXCSgf');
GO

B. 更改用于加密私钥的密码

ALTER CERTIFICATE Shipping11 
    WITH PRIVATE KEY (ENCRYPTION BY PASSWORD = '34958tosdgfkh##38',
    DECRYPTION BY PASSWORD = '95hkjdskghFDGGG4%');
GO

C. 为数据库中已存在的证书导入私钥

ALTER CERTIFICATE Shipping13 
    WITH PRIVATE KEY (FILE = 'c://importedkeys/Shipping13',
    DECRYPTION BY PASSWORD = 'GDFLKl8^^GGG4000%');
GO

D. 将私钥保护从密码更改为数据库主密钥

ALTER CERTIFICATE Shipping15 
    WITH PRIVATE KEY (DECRYPTION BY PASSWORD = '95hk000eEnvjkjy#F%');
GO
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值