删除外部数据库中的触发器

时间:2011-09-19 01:23:43

标签: sql-server sql-server-2008

我是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。

我是如何尝试解决此问题的:

  1. 在两个数据库上将TRUSTWORTHY属性设置为ON。
  2. 当我指定“with owner of owner \ sa \ self”时,我得到了同样的错误。
  3. 我创建了另一个登录名,然后在两个数据库中创建了2个映射到此登录名的用户,并在目标数据库中授予了AUTHENTICATE。然后我在SP中指定“执行为”来冒充这个用户。这对我没有帮助。

1 个答案:

答案 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