首页 > 解决方案 > SSIS 截断表失败;删除成功

问题描述

我有一个 SSIS 包,我想在其中清除临时表并重新填充它。我创建了一个执行 SQL 任务,TRUNCATE TABLE TABLE_NAME该任务失败并出现错误:

表不存在或您没有权限

如果我改变任务来做DELETE FROM TABLE_NAME它,它就像一个魅力。如果我以我正在连接的用户身份登录并执行TRUNCATE TABLE TABLE_NAME,它也像一个魅力。谁能帮我理解为什么我不能在 SSIS 作业中执行截断,但我可以作为用户?因为,我更喜欢截断表而不是删除。

标签: sqlsql-serverssisetlexecute-sql-task

解决方案


您可以将错误分为两部分:

  1. 表不存在
  2. 没有权限

因此,如果您确定该表存在(正如您所说的 DELETE 操作运行良好),这是一个权限问题,请检查数据库管理员是否可能没有从该表中截断数据的权限。

请注意,TRUNCATE TABLE 需要比 DELETE 操作更多的权限。根据官方文档

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

另一方面,DELETE 操作需要较少的权限。根据官方文档

目标表需要 DELETE 权限。如果语句包含 WHERE 子句,则还需要 SELECT 权限。

DELETE 权限默认授予 sysadmin 固定服务器角色、db_owner 和 db_datawriter 固定数据库角色以及表所有者的成员。sysadmin、db_owner 和 db_securityadmin 角色的成员以及表所有者可以将权限转移给其他用户。


推荐阅读