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