Translate

Friday, August 3, 2012

Constraints

Add a check constraint to make it read only:
ALTER TABLE mytable WITH NOCHECK ADD CONSTRAINT chk_read_only CHECK( 1 = 0 )
What about a delete?
ALTER TRIGGER mytable_ReadOnly ON mytable
INSTEAD OF DELETE
AS
BEGIN
    RAISERROR( 'Table set to read only.', 16, 1 )
    ROLLBACK TRAN
END

Drop all contraints: 
DECLARE @TableName NVARCHAR(MAX)
DECLARE @ConstraintName NVARCHAR(MAX)
DECLARE Constraints CURSOR FOR
     SELECT OBJECT_NAME(parent_object_id), name
     FROM sys.object
     WHERE (is_ms_shipped = 0 AND type_desc LIKE '%_CONSTRAINT' AND OBJECT_NAME(parent_object_id) NOT IN ('sysdiagrams', 'Tablename')
     OPEN Constraints
     FETCH NEXT FROM Constraints INTO @TableName, @ConstraintName
     WHILE @@FETCH_STATUS = 0
     BEGIN
         EXEC('ALTER TABLE [' + @TableName + '] DROP CONSTRAINT [' + @ConstraintName + ']')
         FETCH NEXT FROM Constraints INTO @TableName, @ConstraintName
         PRINT 'DROP CONSTRAINT [' + @ConstraintName + ']'
     END

CLOSE Constraints
DEALLOCATE Constraints

-- Disable all table constraints
ALTER TABLE MyTable NOCHECK CONSTRAINT ALL

-- Enable all table constraints
ALTER TABLE MyTable CHECK CONSTRAINT ALL

-- Disable single constraint
ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint

-- Enable single constraint
ALTER TABLE MyTable CHECK CONSTRAINT MyConstraint

-- Find FK constraint
SELECT
 f.name AS ForeignKey,
 OBJECT_NAME(f.parent_object_id) AS TableName,
 COL_NAME(fc.parent_object_id,fc.parent_column_id) AS ColumnName,
 OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
 COL_NAME(fc.referenced_object_id,fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id
INNER JOIN sys.objects AS o ON o.OBJECT_ID = fc.referenced_object_id
WHERE (SCHEMA_NAME(f.SCHEMA_ID)) = N'dbo' AND (OBJECT_NAME (f.referenced_object_id) = @tname)



-- Drop and Add Table Constraints
DECLARE @FK_Keys TABLE
(
 [Action] nvarchar(4)
 ,[SQLStr] nvarchar(1000)
);

DECLARE @sqlSTR nvarchar(1000), @tname nvarchar(50)=N'Facility';

INSERT INTO @FK_Keys
 SELECT
 'DROP' [ACTION]
 ,N'ALTER TABLE [dbo].' + QUOTENAME(OBJECT_NAME(fk.parent_object_id)) + N' DROP CONSTRAINT ' + fk.name [SQLStr]
  FROM sys.foreign_keys AS fk
   INNER JOIN sys.foreign_key_columns AS fc ON fk.OBJECT_ID = fc.constraint_object_id
   INNER JOIN sys.objects AS o ON o.OBJECT_ID = fc.referenced_object_id
  WHERE (SCHEMA_NAME(fk.SCHEMA_ID)) = N'dbo' AND (OBJECT_NAME (fk.referenced_object_id) = @tname);


INSERT INTO @FK_Keys
 SELECT
 'ADD' [ACTION]
 ,N'ALTER TABLE [dbo].' + QUOTENAME(OBJECT_NAME(fk.parent_object_id)) + N' WITH CHECK ADD CONSTRAINT ' + fk.name + ' FOREIGN KEY (' + COL_NAME(fc.parent_object_id,fc.parent_column_id) + ') REFERENCES ' + OBJECT_NAME (fk.referenced_object_id) + ' (' + COL_NAME(fc.referenced_object_id,fc.referenced_column_id) + ')' [SQLStr]
  FROM sys.foreign_keys AS fk
   INNER JOIN sys.foreign_key_columns AS fc ON fk.OBJECT_ID = fc.constraint_object_id
   INNER JOIN sys.objects AS o ON o.OBJECT_ID = fc.referenced_object_id
  WHERE (SCHEMA_NAME(fk.SCHEMA_ID)) = N'dbo' AND (OBJECT_NAME (fk.referenced_object_id) = @tname);


--declare @var_xml xml;
--select @var_xml = (SELECT * from @FK_Keys for xml auto);


WHILE EXISTS(SELECT fk.Name
  FROM sys.foreign_keys AS fk
   INNER JOIN sys.foreign_key_columns AS fc ON fk.OBJECT_ID = fc.constraint_object_id
   INNER JOIN sys.objects AS o ON o.OBJECT_ID = fc.referenced_object_id
  WHERE (SCHEMA_NAME(fk.SCHEMA_ID)) = N'dbo' AND (OBJECT_NAME (fk.referenced_object_id) = @tname))
BEGIN
 SELECT @sqlSTR = (SELECT [SQLStr] FROM @FK_Keys WHERE [ACTION] = 'DROP');
 EXEC sp_executesql @sqlSTR;
END