By encrypting all stored procedures user can only execute but not see or modify any of the SPs
CREATE TABLE #backup ( id BIGINT IDENTITY(1, 1), sptext NVARCHAR(MAX) NOT NULL, spname NVARCHAR(100) NOT NULL, encrypttext NVARCHAR(MAX) NULL, encryptstatus BIT NOT NULL DEFAULT ( 0 ) ) DECLARE @sptexttable TABLE ( id BIGINT IDENTITY(1, 1), sptext NVARCHAR(MAX), spname NVARCHAR(100) ) INSERT INTO @sptexttable ( sptext, spname ) SELECT [text], [name] FROM syscomments JOIN sysobjects ON syscomments.id = sysobjects.id AND sysobjects.xtype = 'p' DECLARE @sptext NVARCHAR(MAX) DECLARE @spname NVARCHAR(100) DECLARE @counter INT SET @counter = 1 WHILE @counter 0 BEGIN BEGIN TRY SELECT @procindex = CHARINDEX('PROC', UPPER(@tempproc)) PRINT @procindex SELECT @beginindex = CHARINDEX('BEGIN', UPPER(@tempproc)) PRINT @beginindex SELECT @header = SUBSTRING(@tempproc, @procindex, @beginindex - @procindex) SELECT @asindex = ( SELECT dbo.ce_lastindexof(@header, 'AS') - 2 ) SELECT @replacetext = STUFF(@header, @asindex, 10, CHAR(13) + 'WITH ENCRYPTION' + CHAR(13) + 'AS' + CHAR(13)) SET @tempproc = REPLACE(@tempproc, @header, @replacetext) END TRY BEGIN CATCH END CATCH END UPDATE @sptexttable SET sptext = @tempproc WHERE id = @counter --PLAY HERE TO MAKE SURE ALL PROCS ARE ALTERED UPDATE @sptexttable SET sptext = ( SELECT REPLACE(sptext, 'CREATE PROC', 'ALTER PROC') FROM @sptexttable WHERE id = @counter ) WHERE id = @counter SELECT @sptext = sptext, @spname = spname FROM @sptexttable WHERE id = @counter BEGIN TRY EXEC ( @sptext ) UPDATE #backup SET encrypttext = @sptext, encryptstatus = 1 WHERE id = @counter END TRY BEGIN CATCH PRINT 'the stored procedure ' + @spname + ' cannot be encrypted automatically' END CATCH SET @counter = @counter + 1 END SELECT * FROM #backup