我是ms sql server中的新手,遇到了问题:我无法在当前数据库外部的数据库中删除触发器。
所以,我有2个数据库-CRM(main)和CrmHistory(其中保存了历史信息)。 在CrmHistory数据库中,我正在编写一些API来管理历史信息的收集。 其中一项任务是在Crm数据库中创建\ drop触发器。 这是我的SP:
create procedure [dbo].[DropHistoryTriggers]
as
begin
set nocount on;
declare @sql table(s varchar(1000), id int identity)
declare @SqlStr nvarchar(max)=''
insert into @sql(s)
select 'drop trigger '+ name from Crm.sys.triggers
where name like '%History'
select @SqlStr=@SqlStr+s+' ' +char(13) from @sql
if (@SqlStr!='')
execute (@SqlStr)
end
在执行它时,我得到“不能放弃触发'历史',因为它不存在或你没有权限。”
两个数据库都由'sa'拥有。我也使用'sa'登录创建并执行SP。
我是如何尝试解决此问题的:
答案 0 :(得分:3)
问题是您是从数据库crm中的目录视图中提取触发器,然后尝试从当前数据库中删除它们。要在其他数据库的上下文中执行,您可以使用:
EXEC crm.dbo.sp_executesql @SqlStr;
顺便说一句,如果没有@table可能会更容易做到这一点(当你确信它正在做它应该做的事情时取消对EXEC线的注释):
CREATE PROCEDURE [dbo].[DropHistoryTriggers]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += 'DROP TRIGGER '
+ QUOTENAME(t.name) + ';' + CHAR(13)
FROM crm.sys.triggers AS t
WHERE t.name LIKE '%History';
PRINT @sql;
--EXEC crm.dbo.sp_executesql @sql;
END
GO