مضى على الشبكة و يوم من العطاء.
  • السلام عليكم ورحمة الله وبركاته، نرجوا كتابة طلبك او سؤالك باللغة العربية مع ارفاق صورة عن الخطأ او توضيح كافي للمشكلة.

[ غير مُجاب ] نقل الجداول المحذوفة وتخزينها في قاعدة بيانات أخرى

OOP BIO

./عضو جديد

السمعة:

مرحبًا يا شباب, كيف الحال
أريد عمل Trigger في SQL server يقوم بنقل الجداول التي أقوم بحذفها من قاعدة بيانات X وتخزينها في قاعدة بيانات Y , طبعًا ليس شرط أن يكون Trigger , ممكن أن يكون أي شيء آخر أريد فقط حفظ الجداول وتخزينها في قاعدة بيانات أخرى تم إنشاءها مُسبقًا , لأن عندي مشكلة وكثير من المرات أحذف الجدول ثم أقوم بإنشاءه مرة أخرى لأني أحتاجه (بمعنى التسرع) .

طرحت هذا السؤال في موقع ( حسوب io ) ومضى أسبوع ولم أتلقى إجابة مع الأسف وأيضًا بحثت ولم أجد , فإذا عند أحد معرفة أتمنى الإجابة.
 
التعديل الأخير بواسطة المشرف:
مرحبًا يا شباب, كيف الحال
أريد عمل Trigger في SQL server يقوم بنقل الجداول التي أقوم بحذفها من قاعدة بيانات X وتخزينها في قاعدة بيانات Y , طبعًا ليس شرط أن يكون Trigger , ممكن أن يكون أي شيء آخر أريد فقط حفظ الجداول وتخزينها في قاعدة بيانات أخرى تم إنشاءها مُسبقًا , لأن عندي مشكلة وكثير من المرات أحذف الجدول ثم أقوم بإنشاءه مرة أخرى لأني أحتاجه (بمعنى التسرع) .

طرحت هذا السؤال في موقع ( حسوب io ) ومضى أسبوع ولم أتلقى إجابة مع الأسف وأيضًا بحثت ولم أجد , فإذا عند أحد معرفة أتمنى الإجابة.
اهلاً وعليكم السلام

للأمانه ما جربتها من قبل ولكن حاولت اقرأ شوي عن نفس الحالة اللي ممكن استخدام https://www.w3schools.com/sql/sql_stored_procedures.asp

وحسب ما فهمت ويجب عليك التأكد من فهمي للموضوع يمكن خطأ بعد ما قرأت هذا السؤال https://stackoverflow.com/questions/18270446/insert-deleted-rows-to-new-table-in-stored-procedure بغض النظر عن سؤاله عن DB2 SQL وبإختلاف المنطق
ممكن تستخدم ال OUTPUT https://learn.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-ver16 لحتى تقدر تعمل Capture لكل ال Rows اللى بتم حذفهم عن طريق امر Delete ونقلهم الى table ثانية من خلال ال stored procedures

ممكن تعمل table Y اللي رح تخزن فيها الداتا المحذوفة من table A تستقبل Nvarchar و int على سبيل المثال لكن اكيد بإمكانك اضافة اللي بدك اياه حسب بياناتك.


SQL:
CREATE TABLE Y (
    Id INT,
    ColumnQ NVARCHAR(255),
    DeletedAt DATETIME DEFAULT GETDATE()
);

بعد هيك بتقوم بإنشاء ال Stored Procedures وهون سميته بإسم sh3ll وكتابة ال Condition الخاص فيك بالحذف.

SQL:
CREATE PROCEDURE sh3ll
AS
BEGIN
    DELETE FROM X
    OUTPUT DELETED.Id, DELETED.Column, GETDATE()
    INTO sh3ll (Id, ColumnQ, DeletedAt)
    WHERE SomeCondition = 'Condition';
END;

والتنفيذ يكون على شكل :

SQL:
EXEC sh3ll;

اتمنى تكون استفدت واعتذر عن الاخطاء.
دمت بخير

Mina shadow ايش رأيكم ؟
 
مرحبًا يا شباب, كيف الحال
أريد عمل Trigger في SQL server يقوم بنقل الجداول التي أقوم بحذفها من قاعدة بيانات X وتخزينها في قاعدة بيانات Y , طبعًا ليس شرط أن يكون Trigger , ممكن أن يكون أي شيء آخر أريد فقط حفظ الجداول وتخزينها في قاعدة بيانات أخرى تم إنشاءها مُسبقًا , لأن عندي مشكلة وكثير من المرات أحذف الجدول ثم أقوم بإنشاءه مرة أخرى لأني أحتاجه (بمعنى التسرع) .

طرحت هذا السؤال في موقع ( حسوب io ) ومضى أسبوع ولم أتلقى إجابة مع الأسف وأيضًا بحثت ولم أجد , فإذا عند أحد معرفة أتمنى الإجابة.
اهلاً وعليكم السلام

للأمانه ما جربتها من قبل ولكن حاولت اقرأ شوي عن نفس الحالة اللي ممكن استخدام https://www.w3schools.com/sql/sql_stored_procedures.asp

وحسب ما فهمت ويجب عليك التأكد من فهمي للموضوع يمكن خطأ بعد ما قرأت هذا السؤال https://stackoverflow.com/questions/18270446/insert-deleted-rows-to-new-table-in-stored-procedure بغض النظر عن سؤاله عن DB2 SQL وبإختلاف المنطق
ممكن تستخدم ال OUTPUT https://learn.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-ver16 لحتى تقدر تعمل Capture لكل ال Rows اللى بتم حذفهم عن طريق امر Delete ونقلهم الى table ثانية من خلال ال stored procedures

ممكن تعمل table Y اللي رح تخزن فيها الداتا المحذوفة من table A تستقبل Nvarchar و int على سبيل المثال لكن اكيد بإمكانك اضافة اللي بدك اياه حسب بياناتك.


SQL:
CREATE TABLE Y (
    Id INT,
    ColumnQ NVARCHAR(255),
    DeletedAt DATETIME DEFAULT GETDATE()
);

بعد هيك بتقوم بإنشاء ال Stored Procedures وهون سميته بإسم sh3ll وكتابة ال Condition الخاص فيك بالحذف.

SQL:
CREATE PROCEDURE sh3ll
AS
BEGIN
    DELETE FROM X
    OUTPUT DELETED.Id, DELETED.Column, GETDATE()
    INTO sh3ll (Id, ColumnQ, DeletedAt)
    WHERE SomeCondition = 'Condition';
END;

والتنفيذ يكون على شكل :

SQL:
EXEC sh3ll;

اتمنى تكون استفدت واعتذر عن الاخطاء.
دمت بخير

Mina shadow ايش رأيكم ؟
مثل ما شرح محمد خير
اي بشكل مختصر بتقوم بإنشاء Table Y خاص بعرض المحتويات التي تم حذفها بعدها عندك أكثر من حل منها مثل ما قام محمد خير وهي PROCEDURE ويمكن برضو اذا بدك حل اقل تعقيد واسهل للفهم وبعمل على كل انواع database هو قيامك بعملية نقل المعلومات المهمة من row ل Table Y علما هاي معناها أنه سوف توخذ وقت أكثر لكن تقريبا نفس الحل طبعا هون بحكي لو انت بتتعامل مع database بشكل غير مباشر اي بمعنى وجود interface وفي حل ثالث لكن يعتمد على محتويات Table الخاص بك هل تقبل ذلك أما لا انه كنت استعمل خانة في نفس Table اسمها flag لكن ذلك يعتمد هل table يمكن اني يكون فيه ذلك أما لا وكنت اضع خانة flag للتعبير عن request بكافة الأشكال .....
 
التعديل الأخير:
اهلاً وعليكم السلام

للأمانه ما جربتها من قبل ولكن حاولت اقرأ شوي عن نفس الحالة اللي ممكن استخدام https://www.w3schools.com/sql/sql_stored_procedures.asp

وحسب ما فهمت ويجب عليك التأكد من فهمي للموضوع يمكن خطأ بعد ما قرأت هذا السؤال https://stackoverflow.com/questions/18270446/insert-deleted-rows-to-new-table-in-stored-procedure بغض النظر عن سؤاله عن DB2 SQL وبإختلاف المنطق
ممكن تستخدم ال OUTPUT https://learn.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-ver16 لحتى تقدر تعمل Capture لكل ال Rows اللى بتم حذفهم عن طريق امر Delete ونقلهم الى table ثانية من خلال ال stored procedures

ممكن تعمل table Y اللي رح تخزن فيها الداتا المحذوفة من table A تستقبل Nvarchar و int على سبيل المثال لكن اكيد بإمكانك اضافة اللي بدك اياه حسب بياناتك.


SQL:
CREATE TABLE Y (
    Id INT,
    ColumnQ NVARCHAR(255),
    DeletedAt DATETIME DEFAULT GETDATE()
);

بعد هيك بتقوم بإنشاء ال Stored Procedures وهون سميته بإسم sh3ll وكتابة ال Condition الخاص فيك بالحذف.

SQL:
CREATE PROCEDURE sh3ll
AS
BEGIN
    DELETE FROM X
    OUTPUT DELETED.Id, DELETED.Column, GETDATE()
    INTO sh3ll (Id, ColumnQ, DeletedAt)
    WHERE SomeCondition = 'Condition';
END;

والتنفيذ يكون على شكل :

SQL:
EXEC sh3ll;

اتمنى تكون استفدت واعتذر عن الاخطاء.
دمت بخير

Mina shadow ايش رأيكم ؟
مثل ما تفضل ستورم
باستعمال Stored Procedures التي تقوم بمراقبة اي تغيير على مستوى database ( الحذف) وهنا يكون احسن حل اذا كانت application الخاص بك server app
اما اذا كانت Local + interfaceتستعمل procedure (اي تقوم ببرمجتها بالغة البرمجة التي تستعملها ) في كل عملية حذف تنقل لك المعلومات التي تكون قد حددتها مسبقا
 
ع السريع بمساعدة Gemini حصلت ع التالي..اتمنى يفيدك

كود:
-- Create a stored procedure to move deleted tables to another database.
CREATE PROCEDURE MoveDeletedTables
    @SourceDatabaseName sysname,
    @TargetDatabaseName sysname,
    @TableName sysname
AS
BEGIN
    -- Check if the source and target databases exist.
    IF NOT EXISTS (SELECT 1 FROM sys.databases WHERE name = @SourceDatabaseName)
        BEGIN
            RAISERROR('Source database does not exist.', 16, 1)
            RETURN
        END
    IF NOT EXISTS (SELECT 1 FROM sys.databases WHERE name = @TargetDatabaseName)
        BEGIN
            RAISERROR('Target database does not exist.', 16, 1)
            RETURN
        END

    -- Create a temporary table to store the schema of the deleted table.
    CREATE TABLE #TempTableSchema (
        Column_Name sysname,
        Data_Type sysname,
        Is_Nullable bit
    );

    -- Get the schema of the deleted table.
    INSERT INTO #TempTableSchema
    SELECT
        c.name AS Column_Name,
        t.name AS Data_Type,
        c.is_nullable AS Is_Nullable
    FROM sys.columns c
    JOIN sys.types t ON c.user_type_id = t.user_type_id
    WHERE c.object_id = OBJECT_ID(@SourceDatabaseName + '.' + @TableName);

    -- Create the table in the target database.
    DECLARE @CreateTableScript NVARCHAR(MAX) = 'CREATE TABLE ' + @TargetDatabaseName + '.' + @TableName + '(';
    DECLARE @ColumnDefinition NVARCHAR(MAX) = '';

    SELECT @ColumnDefinition = @ColumnDefinition +
        QUOTENAME(Column_Name) + ' ' +
        Data_Type +
        CASE
            WHEN Is_Nullable = 1 THEN ' NULL'
            ELSE ' NOT NULL'
        END + ','
    FROM #TempTableSchema;

    SET @CreateTableScript = @CreateTableScript + @ColumnDefinition;

    -- Remove the last comma.
    SET @CreateTableScript = SUBSTRING(@CreateTableScript, 1, LEN(@CreateTableScript) - 1) + ');';

    -- Execute the create table script.
    EXECUTE sp_executesql @CreateTableScript;

    -- Move the data from the source table to the target table.
    DECLARE @InsertDataScript NVARCHAR(MAX) = 'INSERT INTO ' + @TargetDatabaseName + '.' + @TableName + ' SELECT * FROM ' + @SourceDatabaseName + '.' + @TableName;

    EXECUTE sp_executesql @InsertDataScript;

    -- Drop the table from the source database.
    DROP TABLE @SourceDatabaseName + '.' + @TableName;

    -- Drop the temporary table.
    DROP TABLE #TempTableSchema;
END;

-- Example usage:
EXECUTE MoveDeletedTables 'SourceDatabase', 'TargetDatabase', 'MyTable';
content_copy
Use code with caution.
SQL

Explanation:

Stored Procedure: The code defines a stored procedure named MoveDeletedTables which takes three parameters:

@SourceDatabaseName: The name of the source database where the table will be deleted from.

@TargetDatabaseName: The name of the target database where the table will be moved.

@TableName: The name of the table to be moved.

Database Existence Check: The procedure checks if both the source and target databases exist. If either doesn't exist, it raises an error and returns.

Schema Retrieval: The procedure creates a temporary table #TempTableSchema to store the schema (column names, data types, nullability) of the deleted table.

Table Creation in Target Database:

It builds a dynamic SQL script (@CreateTableScript) to create the table in the target database based on the schema retrieved from the source table.

It executes the script using sp_executesql.

Data Transfer:

It constructs another dynamic SQL script (@InsertDataScript) to insert data from the source table into the newly created table in the target database.

It executes this script to transfer the data.

Table Deletion: The procedure then drops the table from the source database.

Cleanup: The temporary table #TempTableSchema is dropped.

To Use:

Replace SourceDatabase and TargetDatabase with the actual names of your databases.

Call the stored procedure with the name of the table you want to move, like this:

EXECUTE MoveDeletedTables 'SourceDatabase', 'TargetDatabase', 'MyTable';
content_copy
Use code with caution.
SQL

Important Notes:

Trigger Alternative: While the provided code is a stored procedure, you can still implement the logic within a trigger if needed. However, it's generally preferred to use a stored procedure for complex data manipulation tasks.

Permissions: Make sure you have the necessary permissions to create tables and insert data in the target database.

Error Handling: The provided code includes basic error handling for database existence. You may want to add more comprehensive error handling to handle potential issues during schema retrieval, table creation, or data transfer.

Performance: For large tables, the data transfer operation might take a significant amount of time. Consider using table-level operations for improved performance.

Alternative Solutions: Explore other tools like SQL Server Agent jobs or third-party data migration tools for more robust and automated solutions.
 

آخر المشاركات

فانوس

رمضان
عودة
أعلى