2012-11-09 46 views
2

如何管理防止自己刪除或截斷特定表,因爲有時表意外被截斷或刪除,使視圖不是一個好主意。如果我做了觸發器,它在db中的所有表中實現。我只是想在特定的表中,在SQL Server中實現它?<b>admin</b>防止自己放棄特定表?

+0

你可以寫上具體的表 – AnandPhadke

+0

一個觸發器,你可以給如何,我搜索了一些例子,但沒有找到它的特定表刪除或截斷 –

回答

0
Create TRIGGER [TR_ProtectCriticalTables] 
ON DATABASE 
FOR 
DROP_TABLE 

AS  
DECLARE @eventData XML, 
    @uname NVARCHAR(50), 
    @oname NVARCHAR(100), 
    @otext VARCHAR(MAX), 
    @etype NVARCHAR(100), 
    @edate DATETIME 
SET @eventData = eventdata() 
SELECT 
    @edate=GETDATE(), 
    @[email protected]('data(/EVENT_INSTANCE/UserName)[1]', 'SYSNAME'), 
    @[email protected]('data(/EVENT_INSTANCE/ObjectName)[1]', 'SYSNAME'), 
    @[email protected]('data(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 
      'VARCHAR(MAX)'), 
    @[email protected]('data(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)') 
    IF @oname IN ('tbluser')-- You can give comma seperated list here 
BEGIN 
DECLARE @err varchar(100) 
SET @err = 'Table ' + @oname + ' is super duper protected and cannot be dropped.' 
RAISERROR (@err, 16, 1) ; 
ROLLBACK; 
END 
GO 
ENABLE TRIGGER [TR_ProtectCriticalTables] ON DATABASE 

對於禁用截斷試試這個

EXEC sys.sp_cdc_enable_table 
@source_schema = N'dbo', 
@source_name = N'TestTable', 
@role_name = NULL 
GO 

這可能會導致一些其它問題,請檢查在使用之前。

+0

我認爲這將是在所有表上實施, –

+0

否「IF @oname IN('tbluser')」在這裏您可以指定您希望不被刪除的逗號分隔列表。 –

+0

謝謝@anshuman如何防止truncate由管理員 –

0

只需刪除特殊管理員的權限目錄即可。並創建第二個有權執行此類危險作業的用戶。請參閱GRANT and REVOKE SQL命令。

+0

@puneet約截斷權限:截斷表完全清空的表。它需要MySQL 5.1.16的DROP特權。 (在5.1.16之前,它需要DELETE權限)。 – rekire

+0

我有管理員權限,現在我想要某些特定的表不能意外截斷,如果我想截斷他們,我必須強制這個,一種方法是bt在其他表中使用外鍵約束,但我不想要做到這一點 –

0

請創建用戶,並創建觸發超級管理員,誰擁有像所有權限:

CREATE TRIGGER reminder2 
ON Customer 
with execute as owner 
AFTER DELETE 
AS 
    truncate table Customer 
+0

並沒有得到你的觀點 –

+0

首先你想讓新用戶和這個用戶給你任何你喜歡的權利..截斷或刪除.. – jainvikram444

+0

我假設阻止管理員截斷一個特定的表 –