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



我有两个相同的表,每个表都映射到登台和生产同义词。我们的日常流程是,分段被截断,插入新数据,然后交换同义词。为了加快速度,我想禁用登台同义词上的所有索引。下面链接中的示例非常接近我所需要的,但它用于表而不是同义词。

禁用所有非聚集索引

我发现从同义词表中的基本对象名称跳转到对象表中基本表的实际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'

下面是我想到的代码,我希望应该是相当不言自明的。

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

最新更新