【问题标题】:Prevent changes the default value of a column in a table sql server防止更改表 sql server 中列的默认值
【发布时间】:2013-05-22 14:18:09
【问题描述】:

如何防止在 sql server 中设置为默认值的列值发生更改

我有一个表 TimeTable,其中列是日期,类型为 varchar(20) 我希望在用户插入值时始终使用 getdate() 更新该列并防止修改/更改插入中的值声明或更新声明。请帮忙!

【问题讨论】:

  • 如果你想存储一个日期 - 你应该使用 DATEDATETIME - NOT varchar(20) - 说真的!跨度>
  • (不是很严重)所以,他们可以使用MERGE 语句来更改它吗?

标签: sql sql-server sql-server-2008


【解决方案1】:

使用视图+触发器-

CREATE TABLE dbo.TestTable
(
      ID INT IDENTITY(1,1) PRIMARY KEY
    , ProductName VARCHAR(25)
    , PurchargeDate DATETIME DEFAULT(GETDATE())
)
GO

CREATE VIEW dbo.vw_TestTable
AS
    SELECT 
          ID
        , ProductName
        , PurchargeDate
    FROM dbo.TestTable

GO

CREATE TRIGGER dbo.trg_IOIU_TestTable

   ON dbo.vw_TestTable
   INSTEAD OF INSERT, UPDATE

AS BEGIN

    SET NOCOUNT ON;

    INSERT INTO dbo.TestTable(ProductName)
    SELECT i.ProductName
    FROM INSERTED i
    LEFT JOIN dbo.TestTable t ON t.ID = i.ID
    WHERE t.ID IS NULL

    UPDATE t
    SET ProductName = i.ProductName
    FROM dbo.TestTable t
    JOIN INSERTED i ON t.ID = i.ID

END
GO

【讨论】:

  • 感谢 Devart 的帮助,我会使用触发器。
【解决方案2】:

为此使用触发器。它可能看起来像这样

CREATE TRIGGER tg_default_value ON TimeTable
FOR INSERT, UPDATE
AS
UPDATE t
   SET t.[Column] = GETDATE()
  FROM TimeTable t JOIN INSERTED i 
    ON t.ID = i.ID;

参见SQLFiddle示例

【讨论】:

    【解决方案3】:

    我认为使用触发器将是做到这一点的好方法。在此触发器中,如果操作为插入,则您可以在使用 to_char() 将格式更改为 char 后插入 gatdate() 值。 如果操作是更新,那么您可以防止更改此列的值。

    【讨论】:

    • 感谢 Partik 的建议
    猜你喜欢
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    相关资源
    最近更新 更多