我最近遇到了我的團隊中的一個衝突,其中一行由「某人」更新,沒有人願意接受誰做了這件事。我們總是有列更新,更新日期,創建日期列和具有對數據庫的讀寫訪問權的人可以更新數據。默認UpdatedBy Created by SQL Server 2008表中的列
現在我的問題是,我想將這些特定列設置爲只讀,並且想根據誰訪問數據庫來默認值,這可能嗎?如果是的話,任何幫助將深表感謝。
- NIK
我最近遇到了我的團隊中的一個衝突,其中一行由「某人」更新,沒有人願意接受誰做了這件事。我們總是有列更新,更新日期,創建日期列和具有對數據庫的讀寫訪問權的人可以更新數據。默認UpdatedBy Created by SQL Server 2008表中的列
現在我的問題是,我想將這些特定列設置爲只讀,並且想根據誰訪問數據庫來默認值,這可能嗎?如果是的話,任何幫助將深表感謝。
在你當前的設置,如果你的開發者有什麼樣的訪問到它聽起來像數據,那裏只是不是防彈的方式來獲得你要找的那種誠信保證。你爲審計做的任何事情,都可以僞造和撤銷。
您可能需要查看名爲「更改數據捕獲」的Sql Server功能。它至少需要企業版,但它允許您自動執行此操作,並將審計跟蹤與實際數據分開(一件好事),這種方式不能被具有高權限訪問權限的開發人員僞造。
你將不得不限制通過存儲過程和視圖訪問這些表。
使用添加/更新過程,您可以確保只有您的過程更新跟蹤列。然後,您將刪除對這些表的寫入權限。所以用戶必須使用add/update procs來輸入/修改這些表的數據。
這是常見應用程序場景的最佳做法。但是,開發人員將在表視圖中或通過插入/更新語句更改數據。但是,我可能是錯的:) – TcKs
正確,這就是爲什麼我聲明「移除訪問權」開發人員只能在表上讀取訪問權限,以及exec procle的proc,給他們只有一個選項來更新數據。 –
您可以使用觸發器。我想,你的大學不會欺騙和禁用/啓用觸發器。
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
它取決於您使用的SQL數據庫。你使用的是mysql,firebird,postresql,oracle,sql server,access還是其他的東西? – TcKs
正如我在標題中提到的...我們正在使用SQL Server 2008 ... – NiK