【发布时间】:2015-01-30 23:49:04
【问题描述】:
我正在尝试构建一个 SSIS 包,它可以为我的数据库中的所有表动态重建索引。一般的想法是,包将确保表没有被更新,然后执行一个存储过程,删除旧索引(如果存在),然后重新创建它。包装背后的逻辑似乎是合理的。我遇到的问题是当我执行包时我不断收到错误:
找不到对象...因为它不存在或者您没有权限...
由于IF EXISTS 部分,现有索引应该是无关紧要的。
过程如下:
REFERENCE_NAME AS VARCHAR(50),
COLUMN_NAME AS VARCHAR(50),
INDEX_NAME AS VARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX)
SET @sql = 'IF EXISTS (SELECT name FROM sysindexes WHERE name = '+CHAR(39)+@INDEX_NAME+CHAR(39)+') '+
'DROP INDEX '+@INDEX_NAME+' ON '+@REFERENCE_NAME+' '+
'CREATE INDEX '+@INDEX_NAME+' ON '+@REFERENCE_NAME+'('+@COLUMN_NAME+') ON [INDEX]'
EXEC sp_executesql @sql
END
GO
我可以通过 SSMS 很好地执行该过程,没有错误,它建立了索引。当我在 SSIS 中执行包时,它会在执行存储过程的任务的那一刻出错。我已确保 SSIS 将变量传递给执行 SQL 任务,并且我已验证我具有 db_ddladmin 权限。除此之外,我很茫然,为此我已经把头撞在墙上一天半了。
是否有我遗漏的东西、我需要请求的一些权限或解决此问题的一些方法?
任何信息将不胜感激。
Bartover,它绝对没有看错数据库。我已经检查了 proc 是否存在,并且包上的唯一连接是到该特定数据库。是的,我正在使用 Visual Studios 2010 Shell Data Tools 手动执行包。 Sorrel,我尝试了您对 drop 上的 @sql 语句、drop 和 create 以及整个 @sql 语句进行健全性检查的想法,没有任何乐趣。 Gnackenson,我也有同样的想法,但是连接身份验证方法设置为 Windows 身份验证,与 ssms 相同。您对为什么它可能使用不同的权限有任何想法吗?
【问题讨论】:
-
您能否确定这实际上是过程中的错误还是表明它没有看到 proc(可能是错误的数据库)的 SSIS 错误?你是如何执行包的?手动通过数据工具?
-
您是否尝试过在 @sql 语句中添加 BEGIN/END 的完整性检查?
'BEGIN DROP INDEX '+@INDEX_NAME+' ON '+@REFERENCE_NAME+' END '+... -
当你运行 SSIS 包时,你确定它在和 ssms 相同的权限下运行
-
Bartover,它绝对没有看错数据库。我已经检查并仔细检查了 proc 是否确实存在,并且我在 SSIS 包上的唯一连接是到该特定数据库。是的,我正在使用 Visual Studios 2010 Shell Data Tools 手动执行 SSIS 包。
标签: sql sql-server stored-procedures ssis