SSIS截断表失败;删除成功

4
我有一个SSIS包,我想清空一个暂存表并重新填充它。我创建了一个TRUNCATE TABLE TABLE_NAME的Execute SQL Task,但是它失败并显示以下错误信息:

表不存在或您没有权限。

如果我将任务更改为DELETE FROM TABLE_NAME,它将完美地工作。如果我使用连接的用户登录并执行TRUNCATE TABLE TABLE_NAME,它也可以完美地工作。有人能帮助我理解为什么我无法在SSIS作业中执行截断操作,但我可以作为用户执行吗?因为我更喜欢截断表而不是删除。

1
尝试使用模式进行测试。 - Jacob H
不幸的是,这仍然会出现相同的错误。尝试只使用dbo.TABLE_NAME。尝试使用DBNAME.dbo.TABLE_NAME。当作为用户直接在服务器上执行时,所有这些都有效。但在SSIS中无法正常工作。 - Eva Donaldson
1
假设您正在 SQL Server 上执行此操作,您的连接管理器使用哪种身份验证?您是如何运行包(在 Visual Studio 中,通过 SQL Agent 等)?听起来这个包正在以不同的凭据运行,而不是您手动连接和执行语句所使用的凭据。 - Jeremy J.
1
用户帐户是哪个角色的成员?此外,您能展示一下您如何配置执行 SQL 任务吗? - digital.aaron
“TRUNCATE” 操作需要比 “DELETE” 操作更多的权限,请查看我的答案获取更多细节。 - Hadi
1个回答

2
你可以将错误分为两部分:
  1. 表不存在
  2. 没有权限
所以,如果您确定表存在(正如您说的DELETE操作运行良好),那么这是一个权限问题,请检查数据库管理员是否允许您从该表中截断数据。
请注意,TRUNCATE TABLE比DELETE操作需要更多的权限。根据官方文档

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

另一方面,删除操作需要更少的权限。根据官方文档:

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

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


2
我要感谢这个答案,但我已经找出了我的问题所在。每次我测试截断时,我都会从我的管理员用户切换到这个RO用户。只是,我没有关闭管理工作室中的查询窗口。这意味着我实际上并没有更改用户。因此,我的测试是错误的,这就是为什么我非常确定我已经向正确的用户授予了正确的权限。提醒自己:更改用户时,请关闭所有窗口并重新开始。叹气 - Eva Donaldson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接