我使用MS SQL 2008,我想在数据库中创建一个触发器,它创建动态的。

创建该数据库的其他数据库的存储过程中调用和运行完美,但是当我要添加一个触发器或存储的过程中,执行失败。

如果我试图运行与所述dynamiy SQL

EXEC('USE dbase
GO
CREATE TRIGGER [blah]
GO')

我得到:

  

错误语法邻近 'GO'

如果我删除“USE ...”触发器会在错误的数据库中创建。

有没有办法来避免自己的问题?

THX

有帮助吗?

解决方案

“GO” 不是T-SQL语言。这是由客户端工具像SSMS作为分批分离器解释(即意思是“文本发送到服务器”)的关键字。

现在,CREATE TRIGGER必须在批处理的第一条语句,以便可以不使用“USE DBNAME”。

如果您在EXEC之前提到“USE dbnname”,那么它最多可以在连接的默认数据库。你必须测试(我现在不能,对不起)

--Might work
USE dbase
EXEC ('CREATE TRIGGER [blah]
')

或者你将不得不使用SQLCMD或OSQL连接和运行代码:这允许您设置连接的数据库环境。不内T-SQL虽然。

或者你可以尝试ALTER EXEC之前LOGIN XXX与DEFAULT_DATABASE = DBNAME

ALTER LOGIN xxx WITH DEFAULT_DATABASE = dbname 
--Now the EXEC will connect to default db if above approach fails
EXEC('CREATE TRIGGER [blah]
')

其他提示

可以调用exec之前切换数据库,和右后切换回:

use newdb
exec ('CREATE TRIGGER [blah] ...')
use originaldb

或者创建链接的服务器向右数据库,用RPC enalbed,和

EXEC ('CREATE TRIGGER [blah] ...') AT LinkedServerName

,或者创建具有在数据库中的默认目录不同的用户,你想创建触发器和:

EXECUTE AS LOGIN = 'UserName'
EXEC ('CREATE TRIGGER [blah] ...')
REVERT

要创建参考仅在确认存在,然后用alter修改。

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[MiTrigger]') AND type in (N'TR'))
    EXEC ('CREATE TRIGGER [MiTrigger] ON [dbo].[MiTabla] FOR DELETE AS SET NOCOUNT ON')
GO
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top