SQL Server 2008:禁用同义词的所有索引

时间:2014-06-03 13:59:43

标签: sql-server-2008 synonym

我有两个相同的表,每个表都映射到一个暂存和生产同义词。我们的日常过程是截断,新数据插入,然后我们交换同义词。为了加快这一点,我想在暂存同义词上禁用所有索引。下面的链接中的示例非常接近我需要的,但它不是同义词的表。

Disable all non-clustered indexes

我发现从同义词表中的基础对象名跳转到获取对象表中基表的实际object_id的唯一方法是使用下面脚本中的replace()函数。这似乎是非常危险的编码,所以我在问我是否还有其他更安全的方法。

select
    s1.name,
    s1.base_object_name,
    o1.object_id
from
    sys.synonyms s1
left join
    sys.objects o1
ON
    o1.name = replace(REPLACE(s1.base_object_name,'[database].[dbo].[',''),']','')
where
s1.name = 'synonym_name'

1 个答案:

答案 0 :(得分:0)

以下是我提出的代码,我希望这应该是不言自明的。

CREATE PROCEDURE synonym_index_disable
@db_name varchar(max),
@schema_name varchar(max),
@synonym varchar(max)

AS

DECLARE @sql AS VARCHAR(MAX)='';
DECLARE @fq_name varchar(max);

SET @fq_name = '[' + @db_name + '].[' + @schema_name + '].[';

SELECT @sql = @sql + 
'ALTER INDEX ' + sys.indexes.name + ' ON  ' + sys.objects.name + ' DISABLE;' +CHAR(13)+CHAR(10)
FROM 
    sys.indexes
JOIN 
    sys.objects
    ON sys.indexes.object_id = sys.objects.object_id
LEFT JOIN
    sys.synonyms
ON
    sys.objects.name = replace(REPLACE(sys.synonyms.base_object_name,@fq_name,''),']','')
WHERE
    sys.indexes.type_desc = 'NONCLUSTERED' AND
    sys.objects.type_desc = 'USER_TABLE' AND
    sys.synonyms.name = @synonym

EXEC(@sql);


GO