为什么 TRUNCATE TABLE 不能使用四部分名称?

Joa*_*n.B 0 sql-server truncate

我试图截断一个表如下:

TRUNCATE TABLE [servername].[dbname].[schema].[table]
Run Code Online (Sandbox Code Playgroud)

我有错误:

对象不存在或您没有权限。

但是,如果我删除该servername部分,它会起作用。

谁能解释为什么我不能在截断中使用四部分名称?谢谢。

Dav*_*ell 7

这是因为 TRUNCATE 是 DDL 而不是 DML

来自 MSDN:

TRUNCATE TABLE 
    [ { database_name .[ schema_name ] . | schema_name . } ]
    table_name
[ ; ]
Run Code Online (Sandbox Code Playgroud)

另外,关于权限:

所需的最低权限是对 table_name 的 ALTER。TRUNCATE TABLE 权限默认授予表所有者、sysadmin 固定服务器角色的成员以及 db_owner 和 db_ddladmin 固定数据库角色,并且不可转让。但是,您可以将 TRUNCATE TABLE 语句合并到一个模块(如存储过程)中,并使用 EXECUTE AS 子句向该模块授予适当的权限。

请注意 db_ddladmin 要求。作为 DDL,不允许四部分命名。将其与 FROM 子句上的 Technet 信息进行比较:

如果表或视图存在于同一 SQL Server 实例上的另一个数据库中,请使用格式为 database.schema.object_name 的完全限定名称。

如果表或视图存在于 SQL Server 实例之外,请使用以linked_server.catalog.schema.object 形式的四部分名称。有关详细信息,请参阅 sp_addlinkedserver (Transact-SQL)。使用 OPENDATASOURCE 函数作为名称的服务器部分构造的四部分名称也可用于指定远程表源。指定 OPENDATASOURCE 时,database_name 和 schema_name 可能不适用于所有数据源,并且受访问远程对象的 OLE DB 提供程序的功能的影响。

资料来源:

http://msdn.microsoft.com/en-us/library/ms177570.aspx

http://technet.microsoft.com/en-us/library/ms177634.aspx

编辑:要回答有关如何操作的问题,请在目标数据库中编写一个存储过程。授予执行该过程的访问权,并从该过程调用 truncate。