我最近遇到了我的团队内部的一场冲突,其中“某人”连续更新,没有人愿意接受谁做了。我们总是有更新列,更新日期,创建日期列和创建日期列,对数据库具有读写访问权限的人可以更新数据。
现在我的问题是我想将这些特定列设置为只读,并希望根据访问数据库的人来默认值,这可能吗?如果是,我们将非常感谢任何帮助。
答案 0 :(得分:3)
在您当前的设置中,如果您的开发人员能够访问听起来像这样的数据,那么就没有一种防弹方式来获得您正在寻找的完整性保证。你为审计做的任何事情都可以伪造和撤消。
您可能希望查看名为“更改数据捕获”的Sql Server功能。它至少需要企业版,但它允许您自动执行此操作并将您的审计跟踪与实际数据(一件好事)分开存储,这种方式无法被具有高权限访问权限的开发人员伪造。
答案 1 :(得分:1)
您必须通过存储过程和视图限制对这些表的访问。
使用添加/更新过程,您可以确保只有您的过程更新跟踪列。然后,您将删除对这些表的写入权限。因此,用户必须使用添加/更新过程来输入/修改这些表的数据。
答案 2 :(得分: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