c# - كيفية إسقاط جميع الجداول وإعادة تعيين قاعدة بيانات SQL Azure




asp.net visual-studio azure-sql-database (6)

لدي مشروع ASP.NET MVC 5 يعمل محليًا وكلما أحتاج إلى تفريغ DB ، أقوم فقط بفتح استعلام جديد عليه ، وقم بتغيير القائمة المنسدلة لقاعدة البيانات لإتقان ، ثم أغلق الاتصال على ديسيبل المحلي الخاص بي وقم بتشغيل الاستعلام "إسقاط قاعدة البيانات [اسم]". ثم أقوم بإنشاء المشروع ، والذهاب إلى وحدة تحكم إدارة حزمة وتشغيل "تحديث قاعدة البيانات". يبدو أن هذا إعادة إنشاء قاعدة بيانات محلية جديدة ويقوم بتشغيل أسلوب البذور في ملف التكوين الخاص بي. cs.

تكمن المشكلة عندما أحتاج إلى اختبار الأشياء في بيئة مباشرة حتى أتمكن من اختبار واجهة برمجة التطبيقات وأفضل من ذلك ، سأقوم بإجراء نشر إلى موقع Azure وملف Azure DB ، وهو أمر رائع وسهل الاستخدام. أتحقق من "عمليات الترحيل الأولى لتنفيذ الأكواد البرمجية" في معالج النشر ومعظم الوقت الذي يعمل فيه وأتمكن من تشغيل الإصدار المباشر وإصلاحه. في بعض الأحيان ، أحتاج إلى إزالة هذا db والبدء من نقطة الصفر مرة أخرى ، ولكن الطريقة الوحيدة التي وجدتها فعلاً هي الانتقال إلى بوابة Azure ، وحذف قاعدة البيانات ، ثم إعادة إنشائها بنفس الاسم. يستغرق هذا الأمر بعض الوقت حتى تتم معالجة Azure ، لذا فهذه دورة اختبار بطيئة.

هل هناك طريقة سريعة لإسقاط / إعادة تعيين Azure SQL DB إلى حالة عذبة وفارغة وحالة عذرية ثم إعادة النشر باستخدام "عمليات الترحيل البرمجية لأول مرة" لجعله يعيد إنشاء الجداول وإعادة تجميع البيانات؟

لقد رأيت بعض الحديث عن إنشاء ترحيل أولي بعد إنشاء db ، ثم محاولة استخدام Powershell للقيام بنوع من التراجع إلى تلك الحالة الأولية ، ولكن لم تتح لي فرصة الحصول عليها للعمل ، أرغب في حذف جميع البيانات في نفس الوقت. ربما كنت قد حصلت للتو على جملة خاطئة أو لم يتم العثور على برنامج تعليمي جيد بما فيه الكفاية. بينما يمكنني تشغيل استعلام على Azure DB إلى "إسقاط قاعدة البيانات [x]" يقتل حرفياً مثيل SQL Azure DB كما تتوقع وتحتاج إلى العودة إلى البوابة لإعادة إنشائها. في بعض الأحيان تكون الحالة الأولية غير جيدة حيث تم تحديث النموذج منذ ذلك الحين ، لذلك قد لا يكون مفيدًا على أية حال.

أشعر أنه يجب أن يكون هناك طريقة أسرع أسهل لاختبار التغييرات في بيئة حية حيث توجد جميع هذه الأدوات الرائعة والاختصارات التي توفرها MS ، ولكن هل قاموا بإسقاط الكرة هنا في هذه المرحلة من التطوير أم هل فقدت شيئًا ما؟


Answers

فقط لإضافة إلى الإجابات لأن الإجابة المقبولة لم تنجح بالنسبة لي على أزور. استخدم البرنامج النصي التالي لحذف جميع الجداول وإعادة تعيين قاعدة البيانات الزرقاء. يقوم أولاً بحذف كافة القيود ثم يسقط كافة الجداول.

كما علقتSkorunka František هذا البرنامج النصي يفترض استخدام المخطط الافتراضي [dbo]. على الرغم من أنه يمكنك استبدالها باسم مخططك الخاص.

/* Azure friendly */
/* Drop all Foreign Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)

WHILE @name is not null
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint IS NOT NULL
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']'
        EXEC (@SQL)
        PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all Primary Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)

WHILE @name IS NOT NULL
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint is not null
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']'
        EXEC (@SQL)
        PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all tables */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Table: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

للأسف لم يعد بإمكاني العثور على مصدر هذا الرمز بعد أن حفظته في أحد مستودعاتي. وآمل أن يساعد شخص ما.


انا عادة

  1. افتح SQL Server إدارة Studio أو من Visual Studio افتح مستكشف كائن ملقم SQL
  2. أقوم بالاتصال بخادم Azure SQL Server (على سبيل yourserver.database.windows.net : yourserver.database.windows.net مع اسم المستخدم وكلمة المرور الخاصة بك لخيار مصادقة SQL Server المحدد) (تذكر أيضًا أنك ستحتاج إلى إضافة استثناء جدار حماية في مدخل Azure للاتصال من الكمبيوتر إلى قاعدة البيانات بهذه الطريقة)
  3. انقر بزر الماوس الأيمن على قاعدة البيانات وحذفها.

بهذه البساطة.

بعد ذلك ، بما أنك ذكرت أن لديك نهج الترحيل لأول مرة ، فقم ببساطة بتشغيل عمليات الترحيل مرة أخرى في Azure SQL Server (على سبيل المثال ، عند النشر تأكد من تحديد خيار تطبيق عمليات الترحيل لسلسلة اتصال خادم SQL المعينة)

عادةً ما أحذف قاعدة البيانات البعيدة ، ثم أعد نشر التطبيق باستخدام الأمر لإعادة تشغيل عمليات الترحيل. سيؤدي ذلك إلى إنشاء قاعدة البيانات مرة أخرى باستخدام الجداول الجديدة. يوجد رمز لبذر قاعدة البيانات في كود بدء التشغيل الخاص بي حتى يتم المصنف في أي وقت تتم فيه تهيئة التطبيق في حالة عدم وجود قيم في DB.

هذا صالح أيضًا لـ AspNet Core Mvc (MVC6)


Azure SQL هو أساسا خادم SQL. لذا يمكنك استخدام MS SQL Server Management Studio https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

افتح قاعدة البيانات في Management Studio باستخدام حساب المشرف ، ثم نفذ أوامر SQL لإسقاط الجدول أو استخدم قائمة النقر بزر الفأرة الأيمن لإجراء ما تريد ، تمامًا مثل استخدام قاعدة بيانات محلية.

يمكن القيام بشيء مماثل في Visual Studio SQL Server Object Explorer. فقط انقر بزر الماوس الأيمن على الجذر "إضافة خادم SQL".


بدلا من ذلك ، يمكنك إسقاط قاعدة البيانات في C # وإنشاء قاعدة بيانات جديدة مع ExecuteNonQuery .

queryString = "DROP DATABASE TestDB2";

SqlCommand command = new SqlCommand(queryString, connection);
        command.Connection.Open();
        command.ExecuteNonQuery();

حيث يكون الاتصال هو اتصال بقاعدة البيانات الرئيسية لقاعدة بيانات Azure SQL.

بدلا من ذلك ، لإنشاء قاعدة بيانات:

queryString = "CREATE DATABASE TestDB2 ( EDITION = 'standard' )";

فقط لإضافة المتغير الخاص بي إلى المزيج ... يراعي هذا أيضًا المشاهدات والجداول الخارجية. فإنه لن barf على الجداول الخارجية التي يجب إزالتها بشكل منفصل مع DROP EXTERNAL TABLE. هذا تسبب في الإصدار الأصلي تدور إلى الأبد.

while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY'))
begin
 declare @sql nvarchar(2000)
 SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME
 + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
 FROM information_schema.table_constraints
 WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
 exec (@sql)
 PRINT @sql
end


while(exists(select 1 from INFORMATION_SCHEMA.TABLES 
    where TABLE_NAME != 'database_firewall_rules' 
    AND TABLE_TYPE = 'BASE TABLE'
    AND TABLE_NAME NOT IN (select name from sys.external_tables)))
begin
 declare @sql1 nvarchar(2000)
 SELECT TOP 1 @sql1=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
 FROM INFORMATION_SCHEMA.TABLES
 WHERE TABLE_NAME != 'database_firewall_rules'
    AND TABLE_TYPE = 'BASE TABLE'
    AND TABLE_NAME NOT IN (select name from sys.external_tables)
exec (@sql1)
 PRINT @sql1
end

في وضع التحرير ، الحد الأدنى هو الحد الأدنى.

ما لم تكن تستخدم استثناءات للتحكم في التدفق (على سبيل المثال ، مخارج غير محلية) بطريقة متكررة ، أشك في أنك ستتمكن من ملاحظة الفرق.





c# asp.net visual-studio azure azure-sql-database