Welcome to Sign in | Help

Re: DROP constrangere (SQL 2000 si SQL 2005)

  •  02-20-2008, 1:14 PM

    Re: DROP constrangere (SQL 2000 si SQL 2005)

    Eu as face cu cursor insa daca vreau neaparat sa evit cursorul si sunt "system administrator" atunci pot executa urmatorul script:

     

    DECLARE @T TABLE (I INT IDENTITY(1,1) PRIMARY KEY, ORDERID INT, SqlStatement NVARCHAR(MAX));

    INSERT INTO @T(SqlStatement,OrderID)
    SELECT
      'ALTER TABLE ' +
      OBJECT_SCHEMA_NAME(parent_object_id)+ '.' +
      OBJECT_NAME(parent_object_id) +
      ' DROP CONSTRAINT ' + name AS SqlStatement,
      1 AS ORDERID
    FROM sys.foreign_keys
    UNION
    SELECT
      'ALTER TABLE ' +
      OBJECT_SCHEMA_NAME(f.parent_object_id)+ '.' +
      OBJECT_NAME(f.parent_object_id) +
      ' ADD CONSTRAINT FK_' +
      OBJECT_NAME(f.parent_object_id) +
      '_' +
      OBJECT_NAME(f.referenced_object_id) +
      '_' +
      c.name + ' FOREIGN KEY (' + c.name + ') REFERENCES ' +
      OBJECT_SCHEMA_NAME(f.referenced_object_id)+ '.' +
      OBJECT_NAME(f.referenced_object_id) + '(' + sc.name + ')' +
      CASE delete_referential_action
        WHEN 0 THEN ''
        WHEN 1 THEN ' ON DELETE CASCADE'
        WHEN 2 THEN ' ON DELETE SET NULL'
        WHEN 3 THEN ' ON DELETE SET DEFAULT'
      END +
      CASE update_referential_action
        WHEN 0 THEN ''
        WHEN 1 THEN ' ON UPDATE CASCADE'
        WHEN 2 THEN ' ON UPDATE SET NULL'
        WHEN 3 THEN ' ON UPDATE SET DEFAULT'
      END
      AS SqlStatement,
      2 AS ORDERID
    FROM sys.foreign_keys fk
    JOIN sys.foreign_key_columns f
    ON fk.object_id = f.constraint_object_id
    JOIN sys.columns c
    ON f.[parent_object_id]=c.[object_id] AND f.constraint_column_id = c.column_id
    JOIN sys.columns sc
    ON f.[parent_object_id]=sc.[object_id] AND f.referenced_column_id = sc.column_id
    ORDER BY 2

    DECLARE @j INT;
    DECLARE @max INT;
    DECLARE @v NVARCHAR(MAX);
    SELECT @max = COUNT(*) FROM @T;
    SET @j = 1;
    WHILE @j < @max + 1
    BEGIN
    SELECT @v=SqlStatement FROM @T WHERE I=@j;
    -- EXECUTE @v;
    PRINT @v;
    SET @j=@j+1;
    END

    Atentie e doar un template pentru SQL Server 2005.


    Cristian Andrei Lefter, SQL Server MVP
    MCT, MCSA, MCDBA, MCAD, MCSD .NET,
    MCTS, MCITP - Database Administrator SQL Server 2005
    http://sqlserver.ro
View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems