2011-07-13 35 views
3

我最近遇到了我的團隊中的一個衝突,其中一行由「某人」更新,沒有人願意接受誰做了這件事。我們總是有列更新,更新日期,創建日期列和具有對數據庫的讀寫訪問權的人可以更新數據。默認UpdatedBy Created by SQL Server 2008表中的列

現在我的問題是,我想將這些特定列設置爲只讀,並且想根據誰訪問數據庫來默認值,這可能嗎?如果是的話,任何幫助將深表感謝。

  • NIK
+0

它取決於您使用的SQL數據庫。你使用的是mysql,firebird,postresql,oracle,sql server,access還是其他的東西? – TcKs

+2

正如我在標題中提到的...我們正在使用SQL Server 2008 ... – NiK

回答

3

在你當前的設置,如果你的開發者有什麼樣的訪問到它聽起來像數據,那裏只是不是防彈的方式來獲得你要找的那種誠信保證。你爲審計做的任何事情,都可以僞造和撤銷。

您可能需要查看名爲「更改數據捕獲」的Sql Server功能。它至少需要企業版,但它允許您自動執行此操作,並將審計跟蹤與實際數據分開(一件好事),這種方式不能被具有高權限訪問權限的開發人員僞造。

1

你將不得不限制通過存儲過程和視圖訪問這些表。

使用添加/更新過程,您可以確保只有您的過程更新跟蹤列。然後,您將刪除對這些表的寫入權限。所以用戶必須使用add/update procs來輸入/修改這些表的數據。

+0

這是常見應用程序場景的最佳做法。但是,開發人員將在表視圖中或通過插入/更新語句更改數據。但是,我可能是錯的:) – TcKs

+0

正確,這就是爲什麼我聲明「移除訪問權」開發人員只能在表上讀取訪問權限,以及exec procle的proc,給他們只有一個選項來更新數據。 –

1

您可以使用觸發器。我想,你的大學不會欺騙和禁用/啓用觸發器。

CREATE TABLE [dbo].[myTable](
    [MyID] [uniqueidentifier] NOT NULL, 
    [MyText] [nvarchar](50) NULL, 
    [MyNumber] [int] NULL, 
    [CreatedBy] [nvarchar](50) NULL, 
    [UpdatedBy] [nvarchar](50) NULL, 
CONSTRAINT [PK_myTable] PRIMARY KEY CLUSTERED 
(
    [MyID] ASC 
) 
GO 

CREATE TRIGGER [dbo].[myTable_OnInsert] 
    ON [dbo].[myTable] 
    INSTEAD OF INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO dbo.myTable (MyID, MyText, MyNumber, CreatedBy, UpdatedBy) 
     SELECT 
      I.MyID, I.MyText, I.MyNumber, CURRENT_USER, CURRENT_USER 
     FROM inserted AS I 

END 
GO 

CREATE TRIGGER [dbo].[myTable_OnUpdate] 
    ON [dbo].[myTable] 
    AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    UPDATE dbo.myTable 
     SET UpdatedBy = CURRENT_USER 
    FROM inserted AS I 

END 
GO