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 )
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