سؤال

يمكنني استخدام MS SQL 2008 وأريد إنشاء مشغل في قاعدة بيانات تم إنشاؤها ديناميكية.

يتم استدعاء إنشاء قاعدة البيانات ضمن إجراء مخزن لقاعدة بيانات أخرى ويتم تشغيله تماما، ولكن عندما أريد إضافة مشغل أو إجراء مخزن، فشل التنفيذ.

إذا حاولت تشغيل Dynamiy SQL مع

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

انا حصلت:

بناء جملة خاطئ بالقرب من "الذهاب"

وإذا قمت بإزالة "الاستخدام ..." سيتم إنشاء المشغل في قاعدة البيانات الخطأ.

هل هناك خدعة لتجنب مشاكلي؟

شكرا

هل كانت مفيدة؟

المحلول

"اذهب" ليس لغة T-SQL. إنها كلمات رئيسية تفسرها أدوات العميل مثل SSMS كفاصل دفعة (وهذا يعني "إرسال نص إلى خادم").

الآن، يجب أن يكون إنشاء الزناد هو البيان الأول في الدفعة حتى لا يمكن استخدام "استخدام DBName".

إذا ذكرت "استخدام DBNName" قبل EXEC، فقد يصل الأمر في قاعدة البيانات الافتراضية للاتصال. يجب عليك اختبار (لا أستطيع الآن، آسف)

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

أو عليك استخدام SQLCMD أو OSQL لتوصيل الكود وتشغيله: يتيح لك ذلك تعيين سياق DB على اتصال. ليس داخل T-SQL رغم ذلك.

أو يمكنك محاولة تغيير تسجيل الدخول XXX مع default_database = dbname قبل exec

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، و:

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

أو إنشاء مستخدم مختلف يحتوي على الكتالوج الافتراضي في قاعدة البيانات حيث ترغب في إنشاء الزناد و:

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

لإنشاء مرجع التحقق فقط التحقق من الصحة ثم تعديل مع التغيير.

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